[프로그래머스] 완전탐색 - 모의고사 (Level 1)
모의고사
풀이과정
- 각 수포자들의 답안의 규칙을 찾는다.
i번째 답안(i는 0부터 시작) =
1번 수포자: i를 5으로 나눈 나머지+1
2번 수포자: i가 짝수 - 2, i가 홀수 - i를 2로 나눈 몫을 다시 4로 나눈 나머지가 0이면 1, 1이면 3, 2면 4, 3이면 5
3번 수포자: i를 2로 나눈 몫을 다시 5으로 나눈 나머지가 0이면 3, 1이면 1, 2면 2, 3이면 4, 4면 5 - answers 리스트와 수포자들의 답안을 전부 비교하여 각 수포자들의 정답 개수를 세서 count 리스트에 저장한다.
- count 리스트 중 최댓값을 찾아 해당 수포자를 answer에 추가한다.
Python Code
def solution(answers):
answer = []
count = [0, 0, 0] #각 수포자들의 정답 개수 저장
for i in range(len(answers)):
student1 = i%5 + 1
if i%2 == 0: #i가 짝수
student2 = 2
else: #i가 홀수
temp = int(i/2) % 4
if temp == 0:
student2 = 1
elif temp == 1:
student2 = 3
elif temp == 2:
student2 = 4
else:
student2 = 5
temp = int(i/2) % 5
if temp == 0:
student3 = 3
elif temp == 1:
student3 = 1
elif temp == 2:
student3 = 2
elif temp == 3:
student3 = 4
else:
student3 = 5
if student1 == answers[i]:
count[0] += 1
if student2 == answers[i]:
count[1] += 1
if student3 == answers[i]:
count[2] += 1
max = -1
#정답 개수의 최대값 찾기
for i in range(len(count)):
if count[i] > max:
max = count[i]
answer.clear()
answer.append(i+1)
elif count[i] == max:
answer.append(i+1)
return answer
오류와 해결
처음에 최대 정답자를 잘못 구해서 정답률이 50%가 나왔다.
max = 0
for i in range(len(count)):
if count[i] >= max:
max = count[i]
answer.append(i+1)
정답 개수가 최대인 학생을 모두 추가하려고 이렇게 짰는데, 이렇게 짜면 최댓값이 업데이트될 때 그 전 최댓값을 가진 학생이 answer에 남아있는다. 따라서 answers가 [2, 1, 2, 3, 2, 4, 2, 5]인 경우 answer가 [1, 2]가 되어 오류가 발생한다. (원래 답은 [2]가 맞음)
max = -1
for i in range(len(count)):
if count[i] > max:
max = count[i]
answer.clear()
answer.append(i+1)
elif count[i] == max:
answer.append(i+1)
최댓값이 업데이트될 때는 answer를 비운 다음 추가하고, 수포자의 정답 개수와 최댓값이 같을 때만 바로 answer에 추가하도록 수정했다.
다른 사람의 풀이
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]
이런 식으로 처음에 패턴들을 리스트로 저장한 후 각 리스트의 길이를 이용하여 인덱싱해서 각 수포자들의 답안을 구하는 풀이가 많았는데 코드가 훨씬 간단해졌다.
최대 정답자를 구할 때는 max함수를 이용해 처음부터 정답의 최댓값을 구한 후 수포자의 정답 개수가 최댓값과 같으면 answer에 추가하도록 하는 방법이 있었는데 이것도 코드가 훨씬 간단했다.
새로 알게 된 점
다른 사람의 풀이를 보다가 enumerate라는 것이 자주 나오길래 찾아봤다. 지금까지는 for문을 돌릴 때 range만 썼었는데, enumerate를 사용하면 인덱스 번호와 컬렉션의 원소를 tuple형태로 반환받아 사용할 수 있다고 한다.
a = [2, 1, 2, 3, 2, 4, 2, 5]
for b in enumerate(a):
print(b)
출력 결과
또는 이렇게
a = [2, 1, 2, 3, 2, 4, 2, 5]
for i, v in enumerate(a):
print(i, v)
출력 결과
Author And Source
이 문제에 관하여([프로그래머스] 완전탐색 - 모의고사 (Level 1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@imyo/프로그래머스-완전탐색-모의고사-Level-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)