https://school.programmers.co.kr/learn/courses/30/lessons/131128
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
분명히 1단계인데... 한 3시간은 걸린것 같아서 올리는 글
맨처음에는 중복을 빼고 해야하나? 하면서 Set을 활용했는데 그게 아니라
사고의 흐름
- 일단 중복된 숫자를 알아내기
- 중복된 숫자를 카운팅해서 x,y 중에 적게 카운팅 되는 쪽에 맞춰서 답을 리턴해야함
그래서.. 돌고 돌다가 숫자는 0-9 까지 밖에 없으니
크기가 10이고, 값은 모두 0인 배열을 만들어서
x,y 각각 해당 index == x의 값 인 것을 찾아서 +1을 한 배열을 만들자
이렇게 되면
"5525" 일때 [0,0,1,0,0,3,0,0,0,0] 이런 배열이 1개
"1255" 일때 [0,1,1,0,0,2,0,0,0,0] 이런 배열 1개
총 2개의 배열이 나오고, 저 두 배열의 값을 비교해서 답을 찾아내는데
큰 짝꿍 숫자를 뽑아야하기 때문에 index 값을 9부터 시작해서 0까지 비교를 하고,
동일한 index 값중에서 최솟값을 찾아서 그 최솟값 만큼 string에 더해주면 되겠다
라고 생각하고 코드를 작성했습니다.
일단 각 index의 값이 0이면서 크기가 10인 배열은 repeating 을 통해서 생성할 수 있습니다.
var xNumberCount = Array(repeating: 0, count: 10)
var yNumberCount = Array(repeating: 0, count: 10)
그런 다음 각 값을 돌아가며 위에서 설명한 배열을 만들고..
for number in X {
xNumberCount[Int(String(number))!] += 1
}
for number in Y {
yNumberCount[Int(String(number))!] += 1
}
최솟값을 계산하면서 분기 처리를 해줍니다.
머저 최솟값은 각 배열을 9부터 0까지 돌면서 구하구요.
최솟값이 0이상이면, while문을 통해서 최솟값이 0보다 클때까지
anwer에 append로 해당 index 값을 추가하도록 구현했습니다.
예시를 들면, 5525, 1255 같은 문제에서 5가 각각 +3, +2일때, 최솟값인 2를 기준으로
answer에 55 이렇게 2번 추가되도록 구현한거에요.
이제 분기처리를 하자면,,,
짝궁 숫자가 0뿐이면 0을 리턴하라고 했으니까 만약 바로 위에서 만든 배열들의
0번째 인덱스("0"이 카운팅된 값)들의 최솟값이 0보다 크면서 아직 answer가 없을때
answer에 0을 넣고 바로 리턴하도록 설정했어요.
(예시를 들면, 100 1000 처럼 0만 각각 +2, +3 됐을때)
짝궁 숫자가 없으면 -1을 리턴해야 하니까
위의 조건을 다 만족하지 못하고 answer가 "" 빈 배열값 그대로 일때는
"-1"을 리턴하도록 설정했습니다.
// MARK: - 계산하기
for index in stride(from: 9, through: 0, by: -1) {
// 최소한의 겹치는 숫자만큼의 크기 뽑아내기
let minCount = min(xNumberCount[index], yNumberCount[index])
if index == 0, 0 < minCount, answer.isEmpty {
answer = "0"
break
}
var i = 0
while minCount > i {
answer.append(String(index))
i += 1
}
}
return answer.isEmpty ? "-1" : answer
총 코드
func solution(_ X:String, _ Y:String) -> String {
var answer = ""
var xNumberCount = Array(repeating: 0, count: 10)
var yNumberCount = Array(repeating: 0, count: 10)
for number in X {
xNumberCount[Int(String(number))!] += 1
}
for number in Y {
yNumberCount[Int(String(number))!] += 1
}
// MARK: - 계산하기
for index in stride(from: 9, through: 0, by: -1) {
// 최소한의 겹치는 숫자만큼의 크기 뽑아내기
let minCount = min(xNumberCount[index], yNumberCount[index])
if index == 0, 0 < minCount, answer.isEmpty {
answer = "0"
break
}
var i = 0
while minCount > i {
answer.append(String(index))
i += 1
}
}
return answer.isEmpty ? "-1" : answer
}
레벨 1인데.. 생각보다 어려웠네요.. 🥹
그래도 +16점이나 주는거보니 마냥 쉬웠던건 아닌거 같은데..
모든 사고과정은 노션에 기록하긴 하는데
얘는 좀 시간이 걸린것 같아서 블로깅에 추가!
'알고리즘' 카테고리의 다른 글
LeetCode - 104. Maximum Depth of Binary Tree (Swift) (1) | 2024.02.08 |
---|---|
LeetCode - 236. Lowest Common Ancestor of a Binary Tree (Swift) (0) | 2024.02.08 |
백준 1181 - Swift (1) | 2024.02.05 |
LeetCode - 160. Intersection of Two Linked Lists (Swift) (0) | 2024.01.19 |
[알고리즘] Python으로 LinkedList 구현하기 (0) | 2023.04.24 |