[프로그래머스] 완전탐색 - 모의고사 (Level 1)

모의고사


풀이과정

  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
  2. answers 리스트와 수포자들의 답안을 전부 비교하여 각 수포자들의 정답 개수를 세서 count 리스트에 저장한다.
  3. 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)

출력 결과

좋은 웹페이지 즐겨찾기