반응형
×
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
반응형
'Algorithm > Programmers' 카테고리의 다른 글
[Swift 알고리즘] Programmers 이중우선순위큐 (0) | 2022.11.03 |
---|---|
[Swift 알고리즘] Programmers Lv.2 기초 문제들 (0) | 2022.11.03 |
[Swift 알고리즘] Programmers 신고 결과 받기 (0) | 2022.11.01 |
[Swift 알고리즘] Programmers 성격 유형 검사하기 (0) | 2022.10.29 |
[Swift 알고리즘] Programmers 옹알이 (0) | 2022.10.28 |