
난이도 : level 1
유형 : 완전 탐색
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42840
answer에 문제의 답 배열을 입력받고,
1,2,3 번 사람들 중 누가 제일 많이 맞혔는지 return하는 문제이다.
각 사람의 답의 규칙은 다음과 같다.
1,2,3,4,5,1,2,3,4,5... 식으로 1번부터 5번까지 차례로 반복하여 답을 찍는다.
5자리씩 반복하며 답을 찍는다.
2,1,2,3,2,4,2,5/2,1,2,3,2,4,2,5
8자리씩 반복하며 답을 찍는다.
3,3,1,1,2,2,4,4,5,5
10자리씩 반복하며 답을 찍는다.
우선 answer의 length만큼 1번, 2번, 3번 사람의 규칙의 의한 답 배열을 생성하고
answer와 몇개 일치하는지 count하여 가장 큰 count값을 가진 사람들의 배열을 return해주면 될 것 같다.
def solution(answers):
n = len(answers)
# 1번 수포자 배열 생성
def make_a(n):
result = []
for i in range(n):
result.append((i % 5) + 1) # 1,2,3,4,5 반복
return result
# 2번 수포자 배열 생성
def make_b(n):
pattern = [2,1,2,3,2,4,2,5]
result = []
for i in range(n):
result.append(pattern[i % len(pattern)])
return result
# 3번 수포자 배열 생성
def make_c(n):
pattern = [3,3,1,1,2,2,4,4,5,5]
result = []
for i in range(n):
result.append(pattern[i % len(pattern)])
return result
# 각 사람들의 답안 시퀀스
a = make_a(n)
b = make_b(n)
c = make_c(n)
# 정답과 비교해서 맞춘 개수 세기
a_count = 0
for i in range(n):
if answers[i] == a[i]:
a_count += 1
b_count = 0
for i in range(n):
if answers[i] == b[i]:
b_count += 1
c_count = 0
for i in range(n):
if answers[i] == c[i]:
c_count += 1
# 최고 점수 찾기
max_count = max(a_count, b_count, c_count)
# 최고 점수를 받은 사람(들) 담기
answer = []
if a_count == max_count:
answer.append(1)
if b_count == max_count:
answer.append(2)
if c_count == max_count:
answer.append(3)
return answer
간단한 문제였지만 코드가 왠지 지저분한 것 같아 지피티에게 고급스러운 버젼을 구현해달라고 했다.
def solution(answers):
# 각 수포자의 반복 패턴
p1 = [1, 2, 3, 4, 5]
p2 = [2, 1, 2, 3, 2, 4, 2, 5]
p3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
def score(pattern, answers):
m = len(pattern)
cnt = 0
for i, a in enumerate(answers):
if a == pattern[i % m]:
cnt += 1
return cnt
s1 = score(p1, answers)
s2 = score(p2, answers)
s3 = score(p3, answers)
top = max(s1, s2, s3) if answers else 0
result = []
if s1 == top: result.append(1)
if s2 == top: result.append(2)
if s3 == top: result.append(3)
return result
지피티는 pattern을 각 배열을 따로 빼고, answers의 길이의 따른 답안을 생성하는 함수를 각각 만드는 것이 아닌 합쳐서 만들어서 더 깔끔한 코드를 구현했다.
enumerate() 도 활용하였고
max값 구할때는 리스트 컴프리헨션을 사용하여 아주 보기 좋은 코드를 구현했다.