ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [🦩 프로그래머스] 타겟넘버 / 모의고사 / 크레인 인형뽑기 게임 / K번째 수
    Algorithm/케로베로스 2020. 12. 6. 23:14
    반응형

    프로그래머스 풀이


    Q. 타겟넘버

    # 시도 

    # 1차 시도 --> 시간 초과
    def solution(numbers, target):
    
        answer = [str(numbers[0]), '-'+str(numbers[0])]
        n = numbers[1:]
        while n:
            a = n.pop(0)
            
            for i in answer:
                p = i + '+' + str(a)
                m = i + '-' + str(a)
                
                if p in answer:
                    pass
                else: 
                    answer.append(p)
                
                if m in answer:
                    pass
                else:
                    answer.append(m)
        print(answer)

    n에서 하나씩 빼서 하나는 더하고, 하나는 빼준 값을 계산. 그게 이미 answer에 있으면 append 안함.

     

    # 2차 시도 --> 노답
    def solution(numbers, target):
        answer = [numbers[0], -numbers[0]]
        print(answer)
        n = numbers[1:]
        
        for i in range(len(n)):
            for j in range(2**i, 2**(i+1)):
                if i == 0:
                    answer.append(answer[0] + n[i])
                    answer.append(answer[0] - n[i])
                    answer.append(answer[1] + n[i])
                    answer.append(answer[1] - n[i])
                    continue
                answer.append(answer[j]+n[i])
                answer.append(answer[j]-n[i])
                print(i,j)
                print(answer)
        print(answer)

    answer에 n값을 하나는 더 하고, 하나는 빼줘서 최종 결과에서 target의 갯수를 찾는다. 

     

    # 3차시도 -- 75점
    
    # 계산해주는 함수
    def cal(n, l):
        answer = []
        while l:
            a = l.pop(0)
            answer.append(a + n)
            answer.append(a - n)
        return answer 
            
    
    def solution(numbers, target):
        answer = [numbers[0], -numbers[0]]
        n = numbers[1:]
    	
        # 최종적으로 계산되는 answer는 모든 경우의 수 
        # 거기서 target이랑 같은 수의 갯수를 찾으면 됨
        for i in range(len(n)):
            answer = cal(n[i], answer)
        
        return answer.count(target)

     

    #  내 답

    # 4차시도 -- 통과
    # while문에서 for문으로 변경하니까 성공함!
    
    # 현재까지의 합을 구해주는 함수
    def cal(n, l):
        answer = [] # 빈 리스트 생성 
        
        for i in range(len(l)): # l에서 하나씩 꺼낸 뒤
            a = l[i]
            answer.append(a + n) # 더 해주고 append
            answer.append(a - n) # 빼주고 append
        return answer 
            
    
    def solution(numbers, target):
        answer = [numbers[0], -numbers[0]] #  처음 값은 없으므로 넣어줌
        n = numbers[1:] # 위에서 빼준 값 빼고 리스트 다시 정의 
    	
        for i in range(len(n)):
            answer = cal(n[i], answer)
        
        return answer.count(target)

     

    # 다른 사람 풀이

    from itertools import product
    def solution(numbers, target):
        l = [(x, -x) for x in numbers]
        print(l)
        s = list(map(sum, product(*l)))
        return s.count(target)

    모든 조합의 수를 product 함수로 해결함... 와우~~~~~~~~~~~~~~~!!!!

    product로 l의 모든 조합을 구한 뒤 map 함수를 이용해 sum 해주고 list로 바꿔줌.

    거기에서 count로 찾음

     

    def solution(numbers, target):
        if not numbers and target == 0 :
            return 1
        elif not numbers:
            return 0
        else:
            return solution(numbers[1:], target-numbers[0]) + solution(numbers[1:], target+numbers[0])

    어떻게 돌아가는지 아직 이해를 못함... 😢

     

     

     

     

    Q. 모의고사

    def solution(answer):
        one = [1,2,3,4,5] * len(answer)
        two = [2,1,2,3,2,4,2,5] * len(answer)
        three = [3,3,1,1,2,2,4,4,5,5] * len(answer)
        
        a = [0] * 3
        
        for i in range(len(answer)):
            if answer[i] == one[i]:
                a[0] += 1
                
            if answer[i] == two[i]:
                a[1] += 1
            
            if answer[i] == three[i]:
                a[2] += 1
        
    
        l = []
        for idx, v in enumerate(a):
            if max(a) == v:
                l.append(idx+1)
        return l

     

    Q. 크레인 인형

    def solution(b, moves):
        basket = [] # 인형 뽑은거 넣는 바구니
        count = 0 # 인형 터지면 카운트 +2 
        
        for m in moves:
            for i in range(len(b)):
            
                if b[i][m-1] != 0: # 만약 해당 뽑기에 인형이 있으면
                    a = b[i][m-1] # a에 담아주고
                    b[i][m-1] = 0 # 뽑은 뒤에는 0을 할당
    
                    
                    if len(basket) >= 1: # 바스켓이 1보다 크고
                        if basket[-1] == a: # a랑 같으면 
                            del basket[-1] #터짐
                            count += 2 # count += 2
                        else:
                            basket.append(a) # 아니면 그냥 더해줌
                    else:
                        basket.append(a) # 1보다 작으면 그냥 더해줌    
                    break # 인형 찾으면 멈추기
        return count
            

    # 다른사람 풀이

    def solution(board, moves):
        stacklist = []
        answer = 0
    
        for i in moves:
            for j in range(len(board)):
                if board[j][i-1] != 0:
                    stacklist.append(board[j][i-1])
                    board[j][i-1] = 0
    
                    if len(stacklist) > 1:
                        if stacklist[-1] == stacklist[-2]:
                            stacklist.pop(-1)
                            stacklist.pop(-1)
                            answer += 2     
                    break
    
        return answer

     

    Q. K번째 수

    def solution(array, commands):
        l = []
        for c in commands:
            a = array[c[0]-1:c[1]]
            a.sort()
            l.append(a[c[2]-1])
        return l

     

    반응형

    'Algorithm > 케로베로스' 카테고리의 다른 글

    [🐉 백준 8단계] 수학 1  (2) 2020.12.13
    [🐉 백준 7단계] 문자열  (0) 2020.12.12
    [🐉 백준 6단계] 함수  (0) 2020.12.06
    [🐉 백준 5단계] 1차원 배열  (0) 2020.12.05
    [🐉 백준 4단계] While문  (0) 2020.12.05

    댓글

Designed by Tistory.