티스토리 뷰
문제
https://school.programmers.co.kr/learn/courses/30/lessons/118667
풀이
swift에는 Queue 자료구조가 없고, 이용하기 위해서는 직접 만들어야한다. 두 개의 배열을 이용해서 구현할 수도 있지만, 나는 큐에서 원소를 제거하지않고 포인터와 append만을 이용하였다.
일단 원소의 합이 더 큰 큐에서 원소를 옮겨야한다는 것은 당연하다. 그래서 합이 더 큰 큐의 앞 원소를 다른 큐에 append해주어야한다.
예를 들어, 첫 번째 큐에서 두 번째 큐로 원소를 옮긴다고 가정해보자. firstP는 firstQ의 맨 앞 원소를 가리키고 있다. 맨 앞 원소를 빼게 되면 firstP를 1 증가시켜주기만 하면 firstQ[firstP]는 맨 앞 원소를 가리키는 것과 동일하다. 원소를 뺏으므로 첫번째 큐의 원소합을 나타내는 first변수에서 값을 빼준다.
위에서 했던 것들을 마찬가지로 second에 반대로 적용해준다. firstQ에서 뺀 값을 secondQ에 append해주고, second 변수에 그 값만큼 더해주기만 하면된다.
이렇게 하다가 first의 값과 second의 값이 같다면 그때의 count값을 반환해주면된다.
이때, 생각해야할 점이 두 가지 있는데 먼저 두 개의 큐의 포인터가 처음 queue1과 queue2의 count보다 커진다면 두 큐가 서로 바뀌었다는 얘기이다. 그렇기때문에 break를 통해 -1을 반환해준다.
다음으로, 합이 더 큰 큐에서 작은 큐로 원소를 옮겼는데 옮긴 큐의 원소가 0이 된다면 두 큐는 같아질 수 없는 것이기 때문에 마찬가지로 break를 걸어주었다.
import Foundation
func solution(_ queue1:[Int], _ queue2:[Int]) -> Int {
var first = queue1.reduce(0) { $0 + $1 }
var second = queue2.reduce(0) { $0 + $1 }
var firstP = 0
var secondP = 0
var count = 0
var firstQ = queue1
var secondQ = queue2
while true {
if first == second {
return count
}
if firstP >= queue1.count && secondP >= queue2.count {
break
}
if firstP == firstQ.count || secondP == secondQ.count {
break
}
if first < second {
let sFirst = secondQ[secondP]
firstQ.append(sFirst)
first += sFirst
second -= sFirst
secondP += 1
} else {
let fFirst = firstQ[firstP]
secondQ.append(fFirst)
second += fFirst
first -= fFirst
firstP += 1
}
count += 1
}
return -1
}
_____________________________________________________________________________________________________
카카오 2단계는 뭔가 다른 2단계보다 어려운느낌
'PS' 카테고리의 다른 글
[Swift] 백준_암호 만들기(1759) (0) | 2023.02.18 |
---|---|
[Swift] 프로그래머스_양궁대회 (0) | 2023.02.15 |
[Swift] 프로그래머스_미로 탈출 명령어 (0) | 2023.02.13 |
[Swift] 프로그래머스_이모티콘 할인행사 (0) | 2023.02.13 |
[Swift] 프로그래머스_택배 배달과 수거하기 (0) | 2023.02.13 |
- Total
- Today
- Yesterday