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
반응형