오늘 푼 문제
https://school.programmers.co.kr/learn/courses/30/lessons/77484#fnref1
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
내 코드
1차 풀이
당첨 번호와 일치하는 번호를 찾아내고, 그 다음에는 알아볼 수 없는 번호(0)의 개수를 추가하여 최대 당첨 가능한 경우의 수를 계산
func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
var arr: Array<Int> = []
var max_count: Int = 0
var min_count: Int = 0
var answer: Array<Int> = []
for num in win_nums {
for lotto in lottos {
if num == lotto {
arr.append(lotto)
}
}
}
min_count = arr.count
for zero in lottos {
if zero == 0 {
arr.append(zero)
}
}
max_count = arr.count
switch max_count {
case 6: answer.append(1)
case 5: answer.append(2)
case 4: answer.append(3)
case 3: answer.append(4)
case 2: answer.append(5)
default: answer.append(6)
}
switch min_count {
case 6: answer.append(1)
case 5: answer.append(2)
case 4: answer.append(3)
case 3: answer.append(4)
case 2: answer.append(5)
default: answer.append(6)
}
return answer
}
보시다시피 코드가 무척 길다. 또한 변수명은 camelCase 를 사용해야 했다..!!
굳이 이렇게 당첨된 번호의 배열의 길이를 계산하기 위해 따로 풀 필요 없이, "일치하는 번호의 개수와, 알아볼 수 없는 번호의 개수를 파악"하기만 해도, 최고/최저 순위를 계산할 수 있다.
2차 풀이
func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
var matchCount: Int = 0
var unknownCount: Int = 0
var maxRank: Int = 0
var minRank: Int = 0
for lotto in lottos {
if lotto == 0 {
unknownCount += 1
}
}
for num in win_nums {
for lotto in lottos {
if num == lotto {
matchCount += 1
}
}
}
// 최고 순위와 최저 순위 계산
// 알아볼 수 없는 번호를 모두 당첨 번호로 가정하여 최고 순위 계산
// 알아볼 수 없는 번호를 모두 당첨 번호와 일치하지 않는다고 가정하여 최저 순위 계산
if matchCount + unknownCount > 1 {
maxRank = 7 - (matchCount + unknownCount)
} else {
maxRank = 6
}
if matchCount > 1 {
minRank = 7 - matchCount
} else {
minRank = 6
}
return [maxRank, minRank]
}
3차 풀이
2차 풀이에서는 일치하는 번호의 개수와 알아볼 수 없는 번호(0)의 개수를 찾기 위해 반복문과 조건문을 활용하였으나,
Swift의 특성을 살려 filter와 count를 사용할 수도 있다!
func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] {
// 일치하는 번호의 개수와 알아볼 수 없는 번호(0)의 개수를 계산
let matchCount = lottos.filter { win_nums.contains($0) }.count
let unknownCount = lottos.filter { $0 == 0 }.count
let maxRank = calculateRank(matchCount + unknownCount)
let minRank = calculateRank(matchCount)
return [maxRank, minRank]
}
// 일치하는 번호의 개수에 따른 순위를 계산하는 함수
func calculateRank(_ matchCount: Int) -> Int {
switch matchCount {
case 6: return 1
case 5: return 2
case 4: return 3
case 3: return 4
case 2: return 5
default: return 6
}
}
또한 이번에는 1차 풀이대로, Switch 문을 활용해보기 위해 위와 같이 matchCount를 파라미터로 하는 calculateRank 라는 함수를 만들어 보았다.
filter 메서드
filter 메서드는 배열의 각 요소에 대해 특정 조건을 만족하는지 확인하고, 그 조건을 만족하는 모든 요소로 구성된 새 배열을 반환.
let unknownCount = lottos.filter { $0 == 0 }.count
이 줄에서 filter는 lottos 배열의 각 요소를 순회하면서, 클로저 { $0 == 0 }에서 정의된 조건 (즉, 요소가 0인 경우)을 만족하는 요소만을 필터링한다.
여기서 $0은 클로저의 첫 번째 인자를 의미하며, (이 경우에는 lottos 배열의 각 요소를 가리킨다.) 해당 조건을 만족하는 요소로만 구성된 배열이 생성되고, 그 배열의 count 속성을 사용하여 요소의 수(즉, 알아볼 수 없는 숫자의 개수)를 계산하는 것이다!
let matchCount = lottos.filter { win_nums.contains($0) }.count
이 줄 역시 filter 메서드를 사용하여 lottos 배열의 각 요소를 순회한다. 클로저 { win_nums.contains($0) }는 win_nums 배열에 현재 요소($0)가 포함되어 있는지 확인한다. (주의: 이 때 0은 숫자 0이 아니라, lottos 의 요소!)
느낀점
이번 문제를 통해서, 조건문과 반복문, switch 구문을 swift 에서 어떻게 쓸 수 있을지 연습해볼 수 있었다.
자주 사용하는 기초적인 문법이므로 계속해서 연습할 필요가 있다.
해당 문제는 아이디어는 쉽지만 filter 메서드를 몰랐다면 코드가 꽤 복잡해진다.
filter는 조건이 true인 모든 요소들 (lottos에서 win_nums에 포함된 번호들)로 구성된 새 배열을 반환하는 메서드! 라는 것을 기억하며 오늘 TIL 을 마친다!