https://school.programmers.co.kr/learn/courses/30/lessons/133502
입력으로 들어온 [2, 1, 1, 2, 3, 1, 2, 3, 1]을 하나의 문자열로 만들고 해당 문자열에서 "1231"이 있으면 "1231" 대신 ""을 넣고 answer를 하나씩 추가하는 방식으로 처리하였다.
[2, 1, 1, 2, 3, 1, 2, 3, 1] -> "211231231" -> "21231" -> "2" 이렇게 말이다. 하지만 시간 초과
가 발생하였다.
import Foundation
extension String {
func replacingFirstOccurrence(of target: String, with replacement: String) -> String {
guard let range = self.range(of: target) else { return self }
return self.replacingCharacters(in: range, with: replacement)
}
}
func solution(_ ingredient:[Int]) -> Int {
var answer = 0
var ingredient: String = ingredient.map{String($0)}.joined()
while true {
if !ingredient.contains("1231") {
break
}
ingredient = ingredient.replacingFirstOccurrence(of: "1231", with: "")
answer += 1
}
return answer
}
첫번째 접근에서 특정 문자열을 대치할 때 ingredient의 크기만큼 비교하기 때문에 시간 초과가 발생한 거 같았다.
stack이라는 Array를 선언하고 ingredient의 원소 하나씩 저장하면서 stack의 크기가 4이상일 경우, stack의 맨 뒤에 있는 4개의 값이 "1231"가 동일하다면 그 4개를 없애고 answer를 하나씩 추가하는 방식을 취했다.
결론적으로 첫번째 접근은 ingredient의 길이만큼 "1231"이 있는지 비교하는 것에 반해, 두번째 접근은 stack의 맨 뒤에 있는 4개의 값이 "1231"인지 비교하면 되기 때문에 시간 초과가 발생하지 않은 것 같다.
import Foundation
func solution(_ ingredient:[Int]) -> Int {
var answer = 0
var stack: [String] = []
var ingredient = ingredient.map{String($0)}
for i in ingredient {
stack.append(i)
while stack.count >= 4 {
if stack[stack.count-4...stack.count-1].joined() == "1231" {
stack.removeLast()
stack.removeLast()
stack.removeLast()
stack.removeLast()
answer += 1
}
else {
break
}
}
}
return answer
}