728x90
https://school.programmers.co.kr/learn/courses/30/lessons/42840
문제 개요
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5,/ 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
*시험은 최대 10,000 문제. 문제의 정답은 1, 2, 3, 4, 5중 하나.
input
answers: 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열
ex. [1,2,3,4,5]
return
가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아서
ex. [1]
*가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬.
나의 코드
def solution(answers):
n = len(answers)
fir = [1,2,3,4,5]*(n//5)+[1,2,3,4,5][:(n%5)]
sec = [2,1,2,3,2,4,2,5]*(n//8)+[2,1,2,3,2,4,2,5][:(n%8)]
thir = [3,3,1,1,2,2,4,4,5,5]*(n//10)+[3,3,1,1,2,2,4,4,5,5][:(n%10)]
def compare(data):
cnt = 0
for idx, i in list(enumerate(data)):
if i == answers[idx]:
cnt +=1
return cnt
fir_val = compare(fir)
sec_val = compare(sec)
thir_val = compare(thir)
lst = sorted([(1,fir_val), (2, sec_val), (3, thir_val)], key=lambda x: x[1], reverse=True)
answer = [lst[0][0]]
for (idx, val) in lst[1:]:
if val == lst[0][1]:
answer.append(idx)
return answer
모범 코드
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
- [idea] 리스트 내 원소에 특정 패턴이 반복되는 경우
- pattern 변수 통해 반복되는 부분만 따오기
- [idx % (패턴의 길이)] 인덱스 처리.
- for문 순환하여 세 명의 score 병렬 계산 (어차피 answers와 세 명의 대답 length가 동일함)
- score = [0,0,0] 처리 후 한꺼번에 score[x] +=1
- 마지막 출력 처리하는 건.... 나 왜 저렇게 짰지?🫢 모범코드대로 하는 게 당연할 따름. idx 순서대로 처리되니 더더욱?!
간단한 문제였다! 코드 더 효율적으로 짜기.
728x90
'개발 > CS study' 카테고리의 다른 글
[프로그래머스] 완전 탐색(+재귀), 소수 찾기 (2) | 2023.04.22 |
---|---|
[알고리즘] 순열 알고리즘 구현 (0) | 2023.04.22 |
[프로그래머스] 완전탐색, 최소직사각형 (0) | 2023.04.22 |
[프로그래머스] 힙, 디스크 컨트롤러 (0) | 2023.04.05 |
[프로그래머스] 스택/큐, 주식가격 (0) | 2023.03.30 |