[Programmers코딩테스트] 완전탐색 - 모의고사

Alex of the year 2020 & 2021·2020년 8월 24일
0

Coding Test

목록 보기
1/3
post-thumbnail

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

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, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

[제한 조건]

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

def solution(answers):
    answer = []
    return answer

에서부터 시작.

답안으로 제출한 코드 풀이

def solution(answers):
    answer = []
    # return할 answer 리스트를 미리 선언해둔다
    three = [[1, 2, 3, 4, 5],[2, 1, 2, 3, 2, 4, 2, 5],[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
    # 수포자1, 2, 3의 답안 패턴을 리스트로 만든다. 이 때 리스트의 각 요소도 리스트로 들어간다. 
    count_list = []
    # 각 수포자들의 답안과 실제 정답이 몇 개 일치하는지 세어 그 개수를 요소로 넣을 리스트도 선언한다.
    for one in three:
    # 수포자들의 답안을 for문으로 돌며,
        i=0
        j=0
        count=0
        while i<len(answers):
        # 정답과 수포자들의 답안을 모두 비교하기 위한 while
        
            if answers[i]==one[j]:
                count+=1
                # a-1) 정답과 수포자 한 명의 답안이 일치할 때마다 count를 하나씩 증가시킨다
            i+=1
            # a-2) i는 1씩 증가시킨다 (while문이므로 수동으로 그 다음 답을 체크할 수 있는 식을 써준 것)
            if j==len(one)-1:
            # 수포자 한 명의 답안 중 맨 마지막 답안에 접근하면
                j=0
                # j는 다시 0으로 초기화시킨다 --> j는 수포자 한 명의 답안 리스트의 인덱스이기에 그렇지 않으면 다시 비교할 수가 없음   
            else:
            # 수포자 한 명의 답안 중 맨 마지막 답안이 아니라면
                j+=1
                # 그냥 그 다음 답으로 넘어간다
        count_list.append(count)
        # 미리 선언해둔 count_list 리스트에 count 변수를 append한다
        # 이 모든 과정이 for one in three for문 속에 있기 때문에 세 번 반복되고, 따라서 count_list에는 세 개의 값이 존재하게 된다.
         
    for i,v in enumerate(count_list):
    # enumerate를 이용하여 count_list 리스트의 인덱스와 value값을 통째로(튜플 형태로) iterate할 수 있게 한다
        if v == max(count_list):
        # value값이 count_list의 최대값이면
            answer.append(i+1)
            # answer 리스트에 해당 value값의 index에 1을 더하여(index는 0부터 시작하기 때문) append해준다
    return answer
    # 최대값만이 append되어 있는 배열 answer를 리턴한다.

다른 프로그래머스 유저의 풀이 중 인상적인 풀이

def solution(answers):
    il=[1, 2, 3, 4, 5] 
    i=[2, 1, 2, 3, 2, 4, 2, 5]
    sam=[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    answer=[0,0,0] 
    # 이 코드가 신선했다. 수포자 1, 2, 3의 답안에서 정답과 일치하는 수를 적을 세 개의 공간을 answer 리스트에 미리 선언해둔 것.
    
    for x in range(0,len(answers)):
    # 정답을 처음부터 끝까지 모두 돌며
        if il[x%5]==answers[x]:answer[0]+=1 
        # 이 부분도 좋은 접근이다. answers의 정확한 개수를 알수 없으니, mod를 이용하여 수포자의 답안을 mod를 이용하여 무한으로 접근할 수 있게한 것이다.
        # 그리고 미리 선언해둔 answer 리스트의 요소에 인덱스로 접근하여 수포자의 답안과 정답이 같을 경우 해당 값을 +1해준다.
        if i[x%8]==answers[x]:answer[1]+=1
        if sam[x%10]==answers[x]:answer[2]+=1
        
    mx=max(answer)
    # 수포자들과 정답이 일치하는 수가 요소로 들어가있는 리스트 answer의 최대값을 mx로 미리 선언해둔다.
    # 근데 여기서 한 명만 최대값으로 출력되는 법은 없다는 점을 잘 파악하여
    # 아래 코드에 구현했다.
    for x in range(3):
        if answer[x] == mx: 
            answer.append(x+1)
            # x+1을 append하는 이유는 인덱스이기 때문에 수포자 1은 0번 인덱스에, 수포자 2는 1번 인덱스에, 수포자 3은 2번 인덱스에 들어가있기 때문! 
            # 그리하여 정확히 N번째 수포자임을 리턴하기 위해 x+1로 answer 리스트의 맨 뒤에 append 시키는 것.
    return answer[3:]
    # answer[3:]이라 하여 answer 리스트의 인덱스 3번 즉 4번째 요소값부터 모두 출력되게 하였다. (이 방법이면 복수의 수포자도 리턴이 가능하다.)
profile
Backend 개발 학습 아카이빙 블로그입니다. (현재는 작성하지 않습니다.)

0개의 댓글