📌 TODO
🎢 두 큐 합 같게 만들기
💬 문제
https://school.programmers.co.kr/learn/courses/30/lessons/118667#
💬 Idea
- 첫번째 아이디어
- 배열을 queue로 사용해서 queue1, queue2의 각 합계를 비교한다
- 합계가 더 큰쪽에서 작은쪽으로 원소를 이동시킨다
- 두번째 아이디어
- 투포인터를 사용한다.
- 원리는 1과 같다.
💬 풀이
1️⃣ <1차 풀이>
func solution(_ queue1:[Int], _ queue2:[Int])->Int{varqueue1= queue1
varqueue2= queue2
varans=0while queue1.reduce(0,+)!= queue2.reduce(0,+){letqueue1sum= queue1.reduce(0,+)letqueue2sum= queue2.reduce(0,+)if queue1sum >= queue2sum {
queue2.append(queue1.removeFirst())
ans +=1}else{
queue1.append(queue2.removeFirst())
ans +=1}
// 탈출조건
if queue1.isEmpty || queue2.isEmpty {return-1}}return ans
}정확성 56.7 / 100.0
2️⃣ <2차 풀이>
-> 반복문 내에서 고차함수 reduce를 제외하여 sum(총합)을 계산하는 원리를 변경했다. → 시간초과 일부 해결
func solution(_ queue1:[Int], _ queue2:[Int])->Int{varqueue1= queue1
varqueue2= queue2
varqueue1sum= queue1.reduce(0,+)varqueue2sum= queue2.reduce(0,+)varans=0while queue1sum != queue2sum {if queue1sum >= queue2sum {letremove= queue1.removeFirst()
queue2.append(remove)
queue1sum -= remove
queue2sum += remove
}else{letremove= queue2.removeFirst()
queue1.append(remove)
queue2sum -= remove
queue1sum += remove
}
ans +=1
// 탈출조건
if queue1.isEmpty || queue2.isEmpty {return-1}}return ans
}합계: 83.3 / 100.0
3️⃣ <3차 풀이>
func solution(_ queue1:[Int], _ queue2:[Int])->Int{varmaxCnt= queue1.count + queue2.count
varqueue1= queue1
varqueue2= queue2
varqueue1sum= queue1.reduce(0,+)varqueue2sum= queue2.reduce(0,+)varans=0while queue1sum != queue2sum {if queue1sum >= queue2sum {letremove= queue1.removeFirst()
queue2.append(remove)
queue1sum -= remove
queue2sum += remove
}else{letremove= queue2.removeFirst()
queue1.append(remove)
queue2sum -= remove
queue1sum += remove
}
ans +=1
// 탈출조건
if queue1.isEmpty || queue2.isEmpty || ans > maxCnt {return-1}}return ans
}합계: 86.7 / 100.0
직접 큐(Queue) 자료구조를 이용하지 않고 단순히 배열을 큐로 사용하면 0번 원소를 지우는 과정에서 시간 초과가 발생할 수도 있다….
4️⃣ <4차 풀이 - 풀이방법 투포인터로 변경>
func solution(queue1:[Int], queue2:[Int])->Int{varmaxCnt= queue1.count *4varqueue= queue1 + queue2
varpointer=(0, queue1.count)varqueue1sum= queue1.reduce(0,+)varqueue2sum= queue2.reduce(0,+)varans=0while queue1sum != queue2sum {if queue1sum >= queue2sum {
queue1sum -=queue[pointer.0]
queue2sum +=queue[pointer.0]
pointer.0+= pointer.0+1> queue.count -1?0:1}else{
queue1sum +=queue[pointer.1]
queue2sum -=queue[pointer.1]
pointer.1+= pointer.1+1> queue.count -1?0:1}
ans +=1
// 탈출조건
if ans > maxCnt {return-1}}return ans
}💬 알게된 것
📌 TODO
🎢 두 큐 합 같게 만들기
💬 문제https://school.programmers.co.kr/learn/courses/30/lessons/118667#
💬 Idea💬 풀이1️⃣ <1차 풀이>
정확성 56.7 / 100.0
2️⃣ <2차 풀이>
-> 반복문 내에서 고차함수 reduce를 제외하여 sum(총합)을 계산하는 원리를 변경했다. → 시간초과 일부 해결
합계: 83.3 / 100.0
3️⃣ <3차 풀이>
합계: 86.7 / 100.0
직접 큐(Queue) 자료구조를 이용하지 않고 단순히 배열을 큐로 사용하면 0번 원소를 지우는 과정에서 시간 초과가 발생할 수도 있다….
4️⃣ <4차 풀이 - 풀이방법 투포인터로 변경>
💬 알게된 것queue를 구현하기 위해 단순 배열을 이용하여 dequeue를 할 때 removeFirst는 시간이 많이 걸린다.
maxCnt가 4배인 이유