[프로그래머스 / lv.1] 모의 고사
in Problem Solving on Programers
날짜: 2021년 7월 19일
소요 시간: 23분 33초
카테고리: 완전 탐색
태그: 레벨1
, 파이썬
입출력 예시
answers | result |
---|---|
[1,2,3,4,5] | [1] |
[1,3,2,4,2] | [1,2,3] |
내가 적은 코드
def solution(answers):
num1 = [1, 2, 3, 4, 5]
num2 = [2, 1, 2, 3, 2, 4, 2, 5]
num3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
count1, count2, count3 = 0, 0, 0
arr, answer = list(), list()
for j, i in enumerate(answers):
if i == num1[j % (len(num1))]:
count1 += 1
if i == num2[j % (len(num2))]:
count2 += 1
if i == num3[j % (len(num3))]:
count3 += 1
arr.append(count1)
arr.append(count2)
arr.append(count3)
answer = [k + 1 for k, count in enumerate(arr) if count == max(arr)]
return answer
풀이 과정
수포자 1, 2, 3의 찍는 반복 패턴을 분석해 num1
,num2
,num3
에 배열 형태로 저장한다.
answers
의 인덱스와 num 배열의 길이만큼 나눈 나머지의 num 배열의 인덱스에 있는 값과 answers
의 같은 인덱스에 있는 값을 비교하여 count 해준다.
count 1, 2, 3을 arr
배열에 저장한 뒤 arr
의 최댓값과 값이 같은 인덱스에 +1한 값(배열의 인덱스는 0부터 시작하기 때문)을 answer
에 저장하고 리턴한다.
(변수 이름 설정을 헷갈리게 잘못 설정했는데 answer
과 answers
다름 주의)
베스트 코드 1
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
베스트 코드 2
from itertools import cycle
def solution(answers):
giveups = [
cycle([1,2,3,4,5]),
cycle([2,1,2,3,2,4,2,5]),
cycle([3,3,1,1,2,2,4,4,5,5]),
]
scores = [0, 0, 0]
for num in answers:
for i in range(3):
if next(giveups[i]) == num:
scores[i] += 1
highest = max(scores)
return [i + 1 for i, v in enumerate(scores) if v == highest]
반성
- 베스트 코드 1과 전반적인 로직은 같지만 count 변수를 +1씩하여 arr에 append하는 것 보다 베스트 코드처럼 애초에 배열형태로 만들고 +1을 하는 게 좀 더 간편하다.
- 베스트 코드 2의 배열을 무한히 반복할 때 사용하는
intertools
라이브러리의cycle
함수는 처음 봤는데 기억해 둬야겠다.