-
[🦩 프로그래머스] 타겟넘버 / 모의고사 / 크레인 인형뽑기 게임 / 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