[프로그래머스] 모의고사

YoungHyun Kim·2023년 11월 22일
1

매일매일 알고리즘

목록 보기
7/30

문제

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


풀이

일단, 나는 이 문제 이해하는데 한참 걸렸다. 이유는 위에 있는 찍는 방식을 간과하고 넘어갔기 때문에... 절대 나와 같은 실수를 하지 마씨요

  • 일단 굉장히 많은 변수를 선언해뒀다.
    • temp : answers 배열에서 요소를 하나씩 꺼내 저장할 변수
    • answer : 입력으로 받은 answers 배열은 요소를 꺼낸다던지의 조작이 불가능하기 때문에, 조작이 가능하도록 입력으로 받은 배열을 저장하는 배열
    • score1, score2, score3 : 각 번호의 수포자가 받은 점수를 저장하는 변수
    • winner : 제일 점수를 많이 받은 수포자의 번호를 저장할 배열(solution 함수의 반환값이 배열이기 때문에 배열로 선언)
    • pick1, pick2, pick3 : 각 번호의 수포자가 문제를 찍는 패턴을 저장하는 배열
  • 자세히 보면, 각 수포자마다 문제를 찍는 패턴이 있다. 이 패턴을 활용해서 정답자를 가려내야 한다. 방법은 패턴의 갯수로 인덱스를 나눈 나머지를 활용하는 것.
  • 이렇게 정답자를 가려내면, score1, score2, score3 변수에 정답자만 1을 더해서 저장하면 문제가 모두 끝났을 때 각 수포자의 수학 점수를 알아낼 수 있다.

위의 과정을 코드로 나타내면 아래와 같이 나온다.

import Foundation

func solution(_ answers:[Int]) -> [Int] {
    var temp = 0, answer = answers, result: [Int] = [], score1 = 0, score2 = 0, score3 = 0, winner: [Int] = []
    let pick1 = [1,2,3,4,5], pick2 = [2,1,2,3,2,4,2,5], pick3 = [3,3,1,1,2,2,4,4,5,5]
    while answer.count > 0 {
        for i in 0..<answer.count {
            temp = answer.removeFirst()
            score1 = temp == pick1[i % 5] ? score1 + 1 : score1
            score2 = temp == pick2[i % 8] ? score2 + 1 : score2
            score3 = temp == pick3[i % 10] ? score3 + 1 : score3
        }
    }
    result = [score1, score2, score3]
    for i in 1...result.count {
        if result[i-1] == result.max() {
            winner.append(i)
        }
    }
    return winner.sorted()
}

회고

마지막에, 제일 많이 정답을 맞춘 수포자를 어떻게 선발할 것인지 고민하는 시간을 꽤 길게 가졌다. 그동안에는 비교할 대상이 둘이라서 같거나, 크거나, 작거나 세 가지 경우의 수만 따지면 되었는데(그마저도 < 나 > 연산자 하나로 구분이 가능했던...), 비교해야 할 대상이 3개가 되어버리니 머리가 갑자기 멈췄다.
조금의 시간을 가지고 나니, 이 세 가지의 값을 배열에 저장한 후 배열의 최대값과 각 요소들을 비교하면 해결할 수 있겠다는 생각이 들어서 Array.max() 메소드를 사용했다.
열심히 고민하면 방법은 다 있더라... 문제를 해결할 수 있어서 다행이다!

profile
iOS 개발자가 되고 싶어요

0개의 댓글