728x90
[Swift] 프로그래머스 숫자 짝궁(lv. 1)
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/131128
2. 접근
"두 수에서 공통된 숫자를 모아서 가장 큰 수를 만들어라"
요약하면 이렇게 된다.
그러면 0~9까지의 수만 하나씩 필터링 하면서 세면 되지 않을까?
그리고 나중에 이 숫자를 다시 내림차순으로 정렬해야 하는데, 그 개수를 index로 활용해서 세면 되지 않을까?
라는 생각이 들었다.
정렬의 방식 중 계수 정렬이 떠올랐고, 이를 활용해서 문제를 풀어보았다.
0 ~ 9까지 인덱스를 가지는 빈 배열을 가지고, X.filter 함수를 사용하여 각 숫자 별로 개수를 세주었다.
Y도 똑같은 방법으로 내부의 숫자를 세주었다.
그 다음, 그 계수를 활용하여 반복문을 통해 Character배열에 계수만큼 숫자를 append 해주었다.
반복문은 각 조건에 따라 분기하여 실행되게 해주었다.
크게 둘 중 하나가 0인 경우, 같지 않은 경우로 나누고, 같지 않은 경우에는 둘 중 누가 계수가 큰 지에 따라서 로직을 달리 해주었다.
(둘 중 하나가 0이면, 공통된 숫자가 아니라는 뜻이기 때문에 패스)
그런 다음 String으로 배열을 return 해주면 끝.
3. 코드
import Foundation
func solution(_ X:String, _ Y:String) -> String {
var innerX = [Int](repeating: 0, count: 10)
for i in 0 ... innerX.count - 1 {
var count = X.filter({ $0 == Character(String(i)) }).count
innerX[i] = count
}
var innerY = [Int](repeating: 0, count: 10)
for i in 0 ... innerY.count - 1 {
var count = Y.filter({ $0 == Character(String(i)) }).count
innerY[i] = count
}
var answer = [Character]()
var j = 0
for i in innerX {
if i == 0 || innerY[j] == 0 {
} else if i >= innerY[j] {
for _ in 1 ... innerY[j] {
answer.append(Character(String(j)))
}
} else {
for _ in 1 ... i {
answer.append(Character(String(j)))
}
}
j += 1
}
return answer.count == 0 ? "-1" : answer.sorted(by: >)[0] == "0" ? "0" : String(answer.sorted(by: >))
}
728x90
'Problem Solving' 카테고리의 다른 글
[Swift] 프로그래머스 크레인 인형뽑기 게임(lv. 1) (0) | 2023.02.14 |
---|---|
[Swift] 프로그래머스 키패드 누르기(lv. 1) (0) | 2023.02.13 |
[Swift] 프로그래머스 명예의 전당 (1)(lv. 1) (0) | 2023.02.09 |
[Swift] 프로그래머스 체육복(lv. 1) (0) | 2023.02.08 |
[Swift] 프로그래머스 로또의 최고 순위와 최저 순위(lv. 1) (0) | 2023.02.06 |
댓글