프로그래머스 swift 코딩 테스트 연습 - 모의고사(궁금한점)

KIMTAEKON·2022년 3월 5일
0
post-thumbnail
import Foundation

func solution(_ answers:[Int]) -> [Int] {
    let arr1 = [1,2,3,4,5]
    let arr2 = [2,1,2,3,2,4,2,5]
    let arr3 = [3,3,1,1,2,2,4,4,5,5]
    
    var dic : [Int: Int] = [:]
    
    for i in 0..<answers.count {
        if answers[i] == arr1[i%arr1.count] { dic[1] = (dic[1] ?? 0) + 1 }
        if answers[i] == arr2[i%arr2.count] { dic[2] = (dic[2] ?? 0) + 1 }
        if answers[i] == arr3[i%arr3.count] { dic[3] = (dic[3] ?? 0) + 1 }
    }
    
    let max = dic.values.max()!
    
    let result = dic.filter { $0.value == max }.keys.sorted()
    
    return result
    
    
    
}

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번부터 10000번까지 있다고 할때, 가장 많이 맞춘 수포자는 누구일까?

문제의 정답배열과 각 수포자들의 찍기배열을 비교해서 일치하는 값이 가장 많은

수포자의 찍기배열을 찾아서 return한다면 답을 찾을 수 있겠구나!


가정1) 1번부터 5번의 답이 1,2,3,4,5 라면??
1번 수포자가 답을 가장 많이 맞췄으니 1번 수포자 찍기배열이 return되고
그다음, 2,3번 수포자는 답이 없으니 nil이 와야겠다.
가정2) 1번부터 10000번의 답이 1,2,3,4,5 라면?
가정1과 같이 1번 수포자가 가장 답이 많이 나올것이고
그다음 아마 3번, 2번 순일것.
가정3) 1번부터 5000번의 답이 1,2,3,4,5이고 5001번부터 10000번까지 2,1,2,3,2,4,2,5 라면?
1번 수포자가 가장 많을 것이고, 그다음 2와 3중 비교해야할 것이다.

—어느 문제의 정답이 나오든 모든 수포자의 찍기배열에 대응이 되어야한다.


1번 수포자의 배열을 정답과 비교하여야 한다.
1번 수포자의 key값에 찍기배열을 넣고 이 정답배열과 문제의 답이 일치할때마다
value에 +1을 추가해준다면?

그렇다면 key값에 배열을 반복해주고(for) 정답배열을 가져와 비교(if)를 해야한다.
어느 수포자의 배열속 인덱스와 정답배열속 인덱스(if)가 참이라면
value에 +1을 해주고 아니라면 다음 정답배열 속 인덱스와 비교!

모든 비교를 완료시키고나면 각 수포자들의 value값이 리턴될 것인데,

각 수포자들의 리턴된 value값을 불러와 오름차순으로 정렬하면

조건을 만족하는 함수가 나올 것이다.


코딩을 보고 모르겠던 것
1. (_ answers:[Int]) -> [Int] 이쪽에 있는 _
2. { dic[1] = (dic[1] ?? 0) 이쪽에 있는 ??
3. Dic.filter {$0.value == max } 이쪽에 있는 $0.value

1번!! 와일드카드 패턴.
값을 무시해라.
이 자리에 무엇이 올것이든 상관하지마라. 맞나?
그렇다면 그냥 answers에 정수배열들이 온다면 그대로 정수배열로 출력. 이렇게 해석하면 될까.

2번!! Nil 병합 연산자 (Nil-Coalescing Operator) 이다.
a ?? b 로 예시를 들면
옵셔널 a가 nil 일 경우 b를 반환하고 이외에는 a를 반환한다.
a는 옵셔널 상태여야하며 a,b의 타입은 일치해야한다.
즉, dic배열의 인덱스1이 nil이라면 int 0을 반환하고,
인덱스1이 int데이터를 가지고있다면 int데이터를 반환한다.

3번!! 클로저의 인자와 타입이 생략되서(ex: s1 : String) 표기한 방법이라고 한다.
클로저에 대한 추가 공부가 필요할 것같다.

0개의 댓글