[프로그래머스] 햄버거 만들기

silverCastle·2022년 11월 4일
0

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
}

0개의 댓글