본문 바로가기
코딩테스트 연습

프로그래머스 모의 고사 Level 1

by 동배_ 2021. 8. 14.

https://programmers.co.kr/learn/courses/30/lessons/42840?language=python3 

 

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

처음 문제 해석 및 풀이 방법

1. 1번 방식 1,2,3,4,5라는 패턴, 2번방식 패턴, 3번방식 패턴을 시험문제의 최대값으로 리스트를 생성해준다

2. 그후 반복문을 통해 answers 리스트 값을 하나씩 3개의 출제자들을 각각 정답인지 비교한다

3. 맞으면 정답 갯수 추가. 아니면 추가안함

4. 그리고 순위를 비교한후 정답으로 반환한다.

 

내가 작성한 소스코드

def solution(answers):

    tester1= [1,2,3,4,5] * 2000
    tester2= [2,1,2,3,2,4,2,5] * 1250
    tester3= [3,3,1,1,2,2,4,4,5,5] * 1000
    tester_correct=[0,0,0]
    tester_index=0
    
    for i in answers:
        if tester1[tester_index] == i:
            tester_correct[0] += 1
        if tester2[tester_index] == i:
            tester_correct[1] += 1
        if tester3[tester_index] == i:
            tester_correct[2] += 1
        
        tester_index += 1
     
    res_list = list(filter(lambda x: tester_correct[x] == max(tester_correct), range(len(tester_correct))))
    return [i+1 for i in res_list]

각 출제자의 패턴을 문제의 최대크기로 설정함

 

그 후 정답의 크기만큼 반복문을 돌며 3개의 출제자리스트들의 인덱스를 0~len(answers)크기까지 하나씩 리스트의 같은 인덱스의 추출값을 비교한 후 다른 출제자들의 인원수의 크기로 이루어진 리스트에 각 출제자 들의 정답수 삽입(tester_correct)

 

그리고 tester_correct의 각 리스트 사이에서 순위를 구함 (동점일 시 순서대로) lambda식의 풀이는tester_correct[0]~ tester_correct[2] 즉 tester_correct의 크기만큼 리스트 인덱스 삽입 후 반복 하는데 max(tester_correct)를 통해 큰 크기 순서대로 오름차순으로 정렬한 값을 res_list에 삽입한다.

 

그러면 res_list에 삽입하면. 순서대로 잘 나오나 인덱스 값을 기준으로 정렬 했기 때문에 +1을 해준 후 리턴값 반환

 

결론 및 고찰 

이 문제는 처음에 for문으로 풀어보려고 하고 그랬었다. 하지만 계속 막혔었고 결국 Level 1이라는걸 인지했기 때문에 그냥 주먹구구식으로 했었다. 그런데 되는 것을 보고 의아해 했다. 

 

이 문제를 풀면서 느낀 것이 평소에 코딩테스트를 풀면서 좀 코드를 줄이는 방법으로 코드를 구현하려고 했던 것 같다.

그렇게 하다 잘 안되면 일단 먼저 만들고 나중에 리팩토링을 하는 것이 낫다라는 생각이 들었다. 그리고 Lambda 식을 사용했다. 예전 파이썬 수업을 듣던 시절 지뢰찾기를 이용할때 lambda많이 사용했던 경험이 있어서 if문 for문을 조잡하게 여러개 사용하지 않고 만들 수 있었다.

 

 

소요 시간 30

댓글