
프로그래머스 LV1 모의고사(완전 탐색)
2021, Mar 31
프로그래머스 lv1 모의고사(완전 탐색)
cycle()
무한 이터레이터. 예시cycle('ABCD') --> A B C D A B C D ...
풀이
from itertools import cycle
def solution(answers):
winner = []
pattern_supo_1 = [1 ,2, 3, 4, 5]
pattern_supo_2 = [2, 1, 2, 3, 2, 4, 2, 5]
pattern_supo_3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
score_supo = [0, 0, 0]
for supo_1, supo_2, supo_3, answer in zip(cycle(pattern_supo_1), cycle(pattern_supo_2), cycle(pattern_supo_3), answers):
if supo_1 == answer: score_supo[0] += 1
if supo_2 == answer: score_supo[1] += 1
if supo_3 == answer: score_supo[2] += 1
for i, score in enumerate(score_supo):
if score == max(score_supo):
winner.append(i+1)
return winner
if __name__ == '__main__':
answers = [1,2,3,4,5]
print(solution(answers))
# 다른 사람 풀이
def solution(answers):
pattern1 = [1,2,3,4,5]
pattern2 = [2,1,2,3,2,4,2,5]
pattern3 = [3,3,1,1,2,2,4,4,5,5]
score = [0, 0, 0]
result = []
for idx, answer in enumerate(answers):
if answer == pattern1[idx%len(pattern1)]:
score[0] += 1
if answer == pattern2[idx%len(pattern2)]:
score[1] += 1
if answer == pattern3[idx%len(pattern3)]:
score[2] += 1
for idx, s in enumerate(score):
if s == max(score):
result.append(idx+1)
return result
- 위 코드는 인덱스를 쓰는 법이 재밌었음. pattern1[idx%len(pattern1)] 이러면 인덱스 숫자랑 pattern1의 길이의 나머지의 인덱스인데..
예를 들어서 patter1의 길이가 5라고 치면. 5로 0을 나눈 나머지. 1도 그렇게. 그런데 그 길이를 넘어서는 길이가 되면. 예를 들어 6이면.
다시 5로 나누면 인덱스를 처음부터 해줄 수 있다. 인덱스를 잘 써서 cycle을 쓰지 않고 풀어냄.
# 다른 사람 풀이2
def solution(answers):
p = [[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
s = [0] * len(p)
for q, a in enumerate(answers):
for i, v in enumerate(p):
if a == v[q % len(v)]:
s[i] += 1
return [i + 1 for i, v in enumerate(s) if v == max(s)]
if __name__ == '__main__':
answers = [1,2,3,4,5]
print(solution(answers))
- 여기서도 q % len(v) 를 통해서 cycle을 인덱스로 해결하는 방법을 썼다.
풀이 1과 다른점은 return 에 리스트 컴프리헨션을 사용한 것, 앞에 패턴을 리스트화 시킨 것.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges