Algorithm/케로베로스

[🦩 프로그래머스] 타겟넘버 / 모의고사 / 크레인 인형뽑기 게임 / K번째 수

대인보우 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

 

반응형