728x90
https://programmers.co.kr/learn/courses/30/lessons/77484
구현 level 1
1부터 45까지의 수를 중복없이 6개가 나열된 로또 번호가 2개 주어진다. (배열 2개, 중복없음은 하나의 로또 번호안에서만 해당)
하나는 민우의 손상된 로또 번호로, 0으로 표시된 수가 손상된 수이다.
다른 하나는 당첨 번호를 담은 로또이다.
이때, 민우가 가진 로또가 될 수 있는 최고 순위와 최저 순위를 구하여 순서대로 배열에 담아 반환하는 문제.
접근방법
당첨번호와 일치하는 수의 개수에 따른 로또 순위가 표로 주어져서 딕셔너리를 이용해서 맵핑시켰다. (scoreRankMap)
중복이 없으므로 민우가 가진 번호 중 0이 아닌 수는 당첨 번호에 있는지 확인하여 있다면, 당첨 번호화 일치하는 수의 개수를 담은 변수(correctCount)값을 1 증가 시켰다.
가진 번호가 0이면 불분명한 수의 개수를 담은 변수(unclearCount)값을 1 증가 시켰다.
이미 일치하는 수의 개수가 민우가 맞출 수 있었던 최소 개수이므로 이에 해당하는 순위가 최저순위,
일치하는 수와 불분명한 수를 합한 개수가 맞출 수 있던 최대 개수이므로 이에 해당하는 순위가 최고순위.
각각 개수를 딕셔너리 키로 사용하여 값을 결과로 반환했다.
소스코드
풀이1
forEach 활용 풀이
import Foundation
func solution1(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
let scoreRankMap: [Int:Int] = [0:6, 1:6, 2:5, 3:4, 4:3, 5:2, 6:1]
var correctCount: Int = 0
var unclearCount: Int = 0
lottos.forEach{
if $0 == 0 { unclearCount += 1 }
else if win_nums.contains($0) { correctCount += 1 }
}
let lowestRank = scoreRankMap[correctCount] ?? 0
let highestRank = scoreRankMap[correctCount + unclearCount] ?? 0
return [highestRank, lowestRank]
}
풀이2
고차함수를 사용한 풀이 (시간 효율성 떨어짐)
import Foundation
func solution2(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
let scoreRankMap: [Int:Int] = [0:6, 1:6, 2:5, 3:4, 4:3, 5:2, 6:1]
var correctCount: Int = lottos.filter{ win_nums.contains($0) }.count
var unclearCount: Int = lottos.filter{ $0 == 0 }.count
let highestRank = scoreRankMap[correctCount + unclearCount] ?? 0
let lowestRank = scoreRankMap[correctCount] ?? 0
return [highestRank, lowestRank]
}
728x90
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] #138 문자열 내 마음대로 정렬하기 (Swift) (0) | 2022.02.18 |
---|---|
[프로그래머스] #137 소수 만들기 (Swift) (0) | 2022.02.16 |
[프로그래머스] #135 예산 (Swift) (0) | 2022.02.11 |
[프로그래머스] #134 최소직사각형 (Swift) (0) | 2022.02.11 |
[프로그래머스] #133 K번째수 (Swift) (0) | 2022.02.10 |