프로그래머스 > LEVEL1 > 모의고사

def solution(answers):
sheet1 = [1, 2, 3, 4, 5]
sheet2 = [2, 1, 2, 3, 2, 4, 2, 5]
sheet3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
cnt1, cnt2, cnt3 = 0, 0, 0
answer = []
i = 0
while i<len(answers):
i1 = i%5
i2 = i%8
i3 = i%10
if answers[i] == sheet1[i1]:
cnt1 += 1
if answers[i] == sheet2[i2]:
cnt2 += 1
if answers[i] == sheet3[i3]:
cnt3 += 1
i+=1
highest = max(cnt1, cnt2, cnt3)
if highest == cnt1:
answer.append(1)
if highest == cnt2:
answer.append(2)
if highest == cnt3:
answer.append(3)
return answer
직관적으로 짠 코드이다.
좋지도 나쁘지도 않은 코드같다.
좀 더 코드 길이를 줄여볼 방법이 없을까?
우선 수포자 3명의 패턴을 하드코딩한 부분이 눈에 들어왔다. 이 패턴도 인자로 받아올 수 있었다면 반복되는 가장 긴 수열을 고르는 방식으로 패턴 추출을 시도했을 것 같다. 하지만 문제 설명에만 적혀있었기 때문에 더 이상 수정은 불가능해보인다.
수포자 3명의 정답 개수 저장할 변수를 각각 만들었지만, 배열 하나로 합칠 수도 있다. 뒤에서 임의 접근하여 값을 바꿔줄 것이므로 0으로 미리 초기화 해둔다.
scores = [0, 0, 0]
수포자 3명의 패턴 길이를 하드코딩하여 모듈려 연산으로 반복자를 구했는데, 눈으로 세지 않고 함수를 쓰는 방법도 있다. 반복자를 여러개 설정하기 위해서 while문이 아닌 for문으로 바꾸고 enumerate를 써서 인덱스와 값을 모두 불러온다. 불러온 인덱스에 i%len(패턴리스트) 처럼 모듈러 연산을 해주고 if 문 조건에 넣어준다. score의 인덱스도 하드코딩하지 않고 멋있게 처리해주고 싶었지만 패턴 리스트가 고정적이기 때문에 괜히 손댔다가 불필요한 코드만 작성하게 될 것 같아서 관뒀다.
for i, ans in enumerate(answers):
if ans == sheet1[i%len(sheet1)]:
score[0] += 1
if ans == sheet2[i%len(sheet2)]:
score[1] += 1
if ans == sheet3[i%len(sheet3)]:
score[2] += 1
마지막으로 아까 정답 개수를 저장한 변수를 리스트 하나로 만들어 뒀기 때문에 if 문 3개를 반복문으로 묶어줄 수 있다. 이때 인덱스+1 해주는 것을 잊지 말자.
for i, v in enumerate(score):
if v == max(score):
answer.append(i+1)
이렇게 수정한 전체 코드는 다음과 같다.
def solution(answers):
sheet1 = [1, 2, 3, 4, 5]
sheet2 = [2, 1, 2, 3, 2, 4, 2, 5]
sheet3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
scores = [0, 0, 0]
answer = []
for i, ans in enumerate(answers):
if ans == sheet1[i%len(sheet1)]:
scores[0] += 1
if ans == sheet2[i%len(sheet2)]:
scores[1] += 1
if ans == sheet3[i%len(sheet3)]:
scores[2] += 1
for i, v in enumerate(scores):
if v == max(scores):
answer.append(i+1)
return answer
1번

2번

테스트 케이스 7번 이후부터 속도가 조금씩 개선된 것을 확인할 수 있다.