본문 바로가기

코딩 테스트/프로그래머스

[Python] 프로그래머스 lv.1 모의고사

알고리즘 고득점 kit - 완전탐색 - (2)

 

정답 코드

1차 시도 - 실패

def solution(answers):
    answer = []
    s1 = [1,2,3,4,5] * 2000
    s2 = [2, 1, 2, 3, 2, 4, 2, 5] * 1250
    s3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] * 1000
    
    s1_score = 0
    s2_score = 0
    s3_score = 0
    max_s = ''
    
    for i in range(len(answers)) : 
        if s1[i] == answers[i] : 
            s1_score += 1
        if s2[i] == answers[i] : 
            s2_score += 1
        if s3[i] == answers[i] : 
            s3_score += 1
        
    return [max(s1_score, s2_score, s3_score)]

최대값이 뭔지는 구했는데 그 최대 값을 갖는 사람을 어떻게 추출해낼 것인가?

 

2차 시도 - 50점

def solution(answers):
    answer = []
    s1 = [1,2,3,4,5]
    s2 = [2, 1, 2, 3, 2, 4, 2, 5]
    s3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    score = {}
    score[1] = 0
    score[2] = 0
    score[3] = 0
    
    for i in range(len(answers)) : 
        if s1[i%len(s1)] == answers[i] : 
            score[1] += 1
        if s2[i%len(s2)] == answers[i] : 
            score[2] += 1
        if s3[i%len(s3)] == answers[i] : 
            score[3] += 1
        
    max = float('-inf')
    for k, v in score.items():
        if v >= max : 
            max = v
            answer.append(k)
    
    return answer
  • 딕셔너리 형태로 값을 저장 → value가 최대값인 key(s) 출력
  • 그런데 위 코드에서는 만약 뒤에서 더 큰 값이 나오면 앞서 저장된 최대값도 answer에 append 됨
  • 예를 들어 value가 [1, 1, 3, 2, 5, 4] 이면 index가 2,4 둘 다 answer의 값에 포함됨

 

3차 시도 - 정답

def solution(answers):
    answer = []
    s1 = [1, 2, 3, 4, 5]
    s2 = [2, 1, 2, 3, 2, 4, 2, 5]
    s3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    score = {}
    score[1] = 0
    score[2] = 0
    score[3] = 0
    
    for i in range(len(answers)) : 
        if s1[i%len(s1)] == answers[i] : 
            score[1] += 1
        if s2[i%len(s2)] == answers[i] : 
            score[2] += 1
        if s3[i%len(s3)] == answers[i] : 
            score[3] += 1
        
    # 최댓값 구하기
    max = float('-inf')
    for k, v in score.items():
        if v >= max :
            max = v
    
    for k, v in score.items():
        if v == max :
            answer.append(k)
    
    return answer

최댓값을 구하고 그 최대값과 같은 value를 가지는 key를 저장

 

다른 사람 코드 1

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

 

다른 사람 코드 2

def solution(answers):
    p = [[1, 2, 3, 4, 5],
         [2, 1, 2, 3, 2, 4, 2, 5],
         [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
    s = [0] * len(p)

    for q, a in enumerate(answers):
        for i, v in enumerate(p):
            if a == v[q % len(v)]:
                s[i] += 1
    return [i + 1 for i, v in enumerate(s) if v == max(s)]