[프로그래머스/Swift] lv1 : 모의고사

문제

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

풀이

완전탐색으로 풀었다.

  • 1,2,3번 수포자들이 찍는 패턴을 배열로 저장

  • answers 배열과 대조하기 위해서 인덱스를 idx % 패턴 개수 로 처리

  • 정답 개수를 딕셔너리에 저장

  • 딕셔너리를 순회하며 정답 배열 만들기

import Foundation

func solution(_ answers:[Int]) -> [Int] {
    let one = [1,2,3,4,5]
    let two = [2,1,2,3,2,4,2,5]
    let three = [3,3,1,1,2,2,4,4,5,5]
    // 각 수포자들의 정답을 딕셔너리에 저장 [Int : Int]
    var counts = [1 : 0, 2 : 0, 3 : 0]

    // answers 배열과 대조하여 정답 개수 카운팅
    for i in 0 ..< answers.count {

        if answers[i] == one[i % one.count] {
            counts[1]! += 1
        }

        if answers[i] == two[i % two.count] {
            counts[2]! += 1
        }

        if answers[i] == three[i % three.count] {
            counts[3]! += 1
        }
    }
    // 정렬된 값을 리턴해야함으로 정렬부터 진행
    // filter 함수를 활용하여 딕셔너리의 최댓값을 value로 가지는 아이템만 필터링
    // map 함수를 활용하여 키만 배열로 저장 후 배열 리턴
    return counts.sorted{ $0.key < $1.key }.filter { $0.value == counts.values.max() }.map { $0.key }
}

후기

처음 문제를 풀이할 때 딕셔너리를 사용하지 않았더니 코드가 복잡해졌다. 아직 Swift로 코테 공부를 많이 해보질 않아서 딕셔너리 사용이 익숙하지 않았다. 딕셔너리 다루는 것도 빨리 익숙해져야겠음

dictionary 사용법 간단 정리

// 딕셔너리 선언
// [Int:Int]
var dict = [ 1:0, 2:0, 3:0 ]
// [String:Int]
var dict2 = [ "hello":2, "foo":5, "bar":2 ]

// 딕셔너리 for loop
// 순서가 랜덤임. 저장한 순서로 순회하진 않는다.
for (k,v) in dict {
    print(k)
    print(v)
}

// 딕셔너리에도 고차함수 활용이 가능하다.
dict.sorted{ $0.key < $1.key }
dict.map { $0.key } // 키만 저장한 배열 리턴