본문 바로가기
Problem Solving/프로그래머스

[프로그래머스] 완전탐색 "모의고사" (파이썬)

by 청량리 물냉면 2022. 4. 30.
반응형
문제

https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

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

programmers.co.kr

완전 탐색(Brute Force): 가능한 모든 경우의 수를 다 시도해 보는 것

 

 

코드
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]
    scores = [0,0,0]
    max_score = 0
    for i in range(len(answers)):
        if(s1[i%5] == answers[i]): scores[0] = scores[0] + 1
        if(s2[i%8] == answers[i]): scores[1] = scores[1] + 1
        if(s3[i%10] == answers[i]): scores[2] = scores[2] + 1
    max_score = max(scores)
    for i in range(len(scores)):
        if (scores[i] == max_score):
            answer.append(i+1)
    return answer

 

 

코드 설명

s1: 첫번째 학생의 정답 리스트

s2: 두번째 학생의 정답 리스트

s3: 세번째 학생의 정답 리스트

scores: 세 학생의 정답 갯수

max_scores: scores 리스트 중 가장 큰 값

answers: 입력으로 받은 정답 리스트

answer: 최종 정답 리스트, return할 값

 

  1. 입력으로 받은 answers 리스트의 값과 s1, s2, s3의 값을 하나씩 비교해 보며 두 값이 일치하면 scores 리스트의 값을 1씩 증가시킨다. answers 리스트의 값이 s1, s2, s3보다 클 수 있으므로(시험은 최대 10,000 문제라고 명시되어 있다) 모듈러 연산을 통해 값이 반복되게 해 준다.
  2. 위 작업이 모두 끝나면 scores 리스트 값 중 가장 큰 값을 추출해 내고 이를 max_score 변수에 저장한다.
  3. scores 리스트를 반복문으로 돌며 max_score 값과 동일한 값이 있을 시 새로운 배열 answer에 인덱스 값을 추가한다. 이때 i는 0부터 시작하고 학생은 1부터 시작하므로 i에 1을 더해 학생 번호와 값을 맞추어 준다.
  4. answer 리스트를 리턴한다.

 

 

마무리

푸는 데 시간이 정말 오래 걸렸다.
아직도 모듈러 연산이 헷갈린다. 기본에 충실하여 더 연습해야겠다.

 

 
+ 추가
 for i in range(len(answers)):
        if(s1[i%len(s1)] == answers[i]): scores[0] += 1
        if(s2[i%len(s2)] == answers[i]): scores[1] += 1
        if(s3[i%len(s3)] == answers[i]): scores[2] += 1
이렇게도 코드 작성이 가능하다.
반응형