[코딩테스트] 프로그래머스 : 모의고사

김은지·2022년 8월 22일
0

코딩테스트

목록 보기
15/17

문제 링크

처음 내 풀이

def solution(answers):
    f = [
        1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4,
        5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5
    ]
    s = [
        2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5,
        2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5
    ]
    t = [
        3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1,
        2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5
    ]

    cnt = [0, 0, 0]

    for i in range(len(answers)):
        idx = i % 40
        if f[idx] == answers[i]:
            cnt[0] += 1
        if s[idx] == answers[i]:
            cnt[1] += 1
        if t[idx] == answers[i]:
            cnt[2] += 1
            
    max_cnt = max(cnt)
    answer = []

    for i in range(len(cnt)):
        if max_cnt == cnt[i]:
            answer.append(i + 1)

    return answer

...어쩌다 f, s, t를 이렇게 작성하게 되었냐면 나 포함 3명이 누가누가 빨리 푸나 대결을 하는 중이어서 일단 풀어야겠다는 생각만 했다.

answers와 f, s, t의 인덱스를 맞춰서 비교해야 한다는 생각으로
각각 f는 5개, s는 8개, t는 10개의 원소가 있었기 때문에
아 공배수. 40개로 맞추자.
그래서 answers의 인덱스를 40의 나머지로 나눠서 비교하자...
라는 생각과 함께 f, s, t의 원소를 40개 씩으로 통일했다.

그러고 카운트 리스트를 만들어 각 인덱스에 수포자 1,2,3(각 -1하면 인덱스임)이 맞힌 문제의 갯수를 저장했다.

그리고 그 중 가장 큰 수를 max_cnt에 저장 한 후,
카운트 리스트를 돌며 비교해서 가장 많이 맞춘 사람의 인덱스를 answer에 담아 리턴했다.

일단 문제는 빨리 풀었다. 그래서 기분은 좋았는데
저렇게 40개나 원소를 저장하는게 맞을까. 싶었고
만약 공배수를 얼른 찾을 수 없었다면...? 하면서 코드를 들여다 보니
개선의 여지가 보였다.

아래는 개선한 내용이다.

def solution(answers):
    
    f = [1, 2, 3, 4, 5]
    s = [2, 1, 2, 3, 2, 4, 2, 5]
    t = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    cnt = [0]*3
    
    for i, v in enumerate(answers):
        if f[i%len(f)] == v :
            cnt[0] += 1
        if s[i%len(s)] == v :
            cnt[1] += 1
        if t[i%len(t)] == v :
            cnt[2] += 1
        
    answer = []
    
    for i in range(len(cnt)):
        if max(cnt) == cnt[i]:
            answer.append(i+1)

    return answer

자주 잊어버리는게 enumerate().
그리고 첫 답안을 작성할 때, 첫 번째 for문 안에 인덱스를 계산하는 부분에서
각각의 리스트마다 인덱스를 어떻게 넣어줘야할지 몰랐는데,
첫 답안을 보면서 생각하니 각각 넣어버리면 되는구나 하는 생각이 들었다.

나머지는 똑같다.

참고용으로 함께 문제를 푼 친구의 코드도 함께 적어놓겠다.


def solution(answers):
    math_quitter1 = [1, 2, 3, 4, 5] # 5
    math_quitter2 = [2, 1, 2, 3, 2, 4, 2, 5] # 8
    math_quitter3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] # 10
    
    students = [math_quitter1, math_quitter2, math_quitter3]
    answer = [] 
    for math_quitter in students:
        cnt = 0
        math_leng = len(math_quitter)
        for i in range(len(answers)):
            if answers[i] == math_quitter[i%math_leng]:
                cnt += 1
        answer.append(cnt)
        
    best_grade = max(answer)
    result = [ k+1 for k in range(len(answer)) if answer[k] == best_grade]
    
    return result

0개의 댓글