문제 해결 과정
처음에는 앞, 뒤를 비교해서 같은 값이 나올때 start, 다른 값이 나올때 end를 저장해 해당 부분을 빼주는 식으로 구현했다.
이렇게 하니깐 테스트 케이스는 통과했는데 제출에서 몇 개 통과가 안됐다.
알고보니 스택과 관련된 문제였고, 스택을 통해 구현해보기로 했다.
우선 스택을 하나 생성하고, block을 하나씩 집어넣으면서
stack의 마지막 block과 현재 block이 같지 않을 때 마지막 block의 count가 m보다 크다면 마지막 block 삭제
stack의 마지막 block과 현재 block이 같다면 stack의 마지막 block의 Count += 1, 같지 않으면 새로 append 해주는 방식으로 구현했다.
중간에 이걸 반대로 생각한건 아닌데 아무튼 반대로 해도 될 줄 알아서 좀 막혔었다.
나의 풀이
func puyoPuyo(_ blocks: [String]) -> String {
var stack = [(String, Int)]()
for block in blocks {
// stack의 마지막 block과 현재 block이 같지 않을 때
if let last = stack.last, last.0 != block {
// 마지막 block의 count가 m보다 크다면
if let last = stack.last, last.1 >= m {
// 마지막 block 삭제
stack.removeLast()
}
}
// stack의 마지막 block과 현재 block이 같다면
if let last = stack.last, last.0 == block {
// stack의 마지막 block의 Count += 1
stack[stack.count - 1].1 += 1
} else {
// 같지 않으면 새로 append
stack.append((block, 1))
}
}
// 마지막 남은 값이 m 이상이라면 삭제
for (_, count) in stack {
if count >= m {
stack.removeLast()
}
}
return stack.map { String(repeating: $0.0, count: $0.1) }.joined()
}
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let (n, m) = (input[0], input[1])
let blocks = readLine()!.map { String($0) }
let result = puyoPuyo(blocks)
print(result.count == 0 ? "CLEAR!" : result)
blocks을 다 돌고 나왔을때 남아있는 값이 m 이상이면 삭제해줬다.
return 할때 block을 count만큼 반복해서 배열로 만들어서 joined해줬다.
마지막 print할때 빈 배열이라면 CLEAR! 아니라면 result값을 그대로 출력해줬다.
'Algorithm > Swift' 카테고리의 다른 글
[Swift] 백준 12933 - 오리 (0) | 2024.06.20 |
---|---|
[Swift] 프로그래머스 - 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기 (0) | 2024.06.19 |