적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Algorithm/Programmers

[Swift 알고리즘] Programmers 햄버거 만들기

hongssup_ 2022. 11. 2. 00:57
반응형

×

Level 1 연습문제 

햄버거 만들기

문제 설명
함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다.
상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.
제한사항
- 1 ≤ ingredient의 길이 ≤ 1,000,000
- ingredient의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.

입출력 예시

print(solution([2, 1, 1, 2, 3, 1, 2, 3, 1])) //2
print(solution([1,2,3,1,1,2,3,1])) //0

최근에 새로 추가된 문제인거 같은데.. 음~ 이거 1단계 아니야~

 

1차 시도 : 64.7점 답 틀림

많이들 하는 실수인 것 같다.. 처음에 그냥 문자열로 다 붙여서 "1231" 들을 다 count 해주면서 없애가는 방식으로 코드를 짰는데, 그러면 오류가 생긴다. 1, 2, 3, 1 을 일괄 삭제 하는 것이 아니라, 앞에서부터 순서대로 삭제해나가는 것이 중요!

func solution(_ ingredient:[Int]) -> Int {
    var str = ""
    var result = 0
    
    for i in ingredient {
        str += "\(i)"
    }

    while str.contains("1231") {
        str = str.replacingOccurrences(of: "1231", with: ".")
        result += str.filter{ $0 == "." }.count
        str = str.replacingOccurrences(of: ".", with: "")
    }

    return result
}

2차 시도 : 47.1점 시간초과

로직은 맞는 것 같은데 시간 초과가 뜬다. 배열 길이가 최대 100만개라 그런가..

func solution(_ ingredient:[Int]) -> Int {
    var stack = ""
    var result = 0
    
    for i in ingredient {
        stack += "\(i)"
        if stack.count > 3 && stack.hasSuffix("1231") {
            result += 1
            stack = String(stack.dropLast(4))
        }
    }
    return result
}

replacingOccurrences 대신 contains("1231")를 사용하여 앞에서부터 순서대로 없애가도록 만들어주었다.

어짜피 둘 다 시간초과 떠서 큰 차이는 없어보이지만, .contains("1231") 쓰는 것 보다 .hasSuffix("1231") 사용해서 뒷자리만 확인해주는 것이 시간적으로 더 효율적인듯 하다. 

마찬가지로 마지막에 "1231" 지워주는 것도 .replacingOccurrences(of: "1231", with: "") 보다 .dropLast(4) 해주는 것이 더 빠르다.

아니 근데 그래서.. 이게 1단계라구요..? 이렇게 시간초과 띄울거면서??? 🤢

 

오늘은 gg.... 다음에 다시 도전해봐야지.. 

 

+ 오늘의 유우머 🤣 ㅋㅋㅋㅋㅋㅋㅋㅋ  

 

728x90
반응형