본문 바로가기

알고리즘(w.KOTLIN)/자료구조

[알고리즘][KOTLIN] 두 큐 합 같게 만들기

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/118667

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이

1. 전체 이동하는 횟수(limit) 를 구한다.

    1-1. 3번 예시를 이용하면 4 * (queue1 의 개수) 로 전체 이동이 되고 원래자리로 돌아오는 것을 알 수 있다.

2. limit 크기 동안 탐색 한다.

3. queue.sum() 을 이용하면 시간 초과가 발생하기 때문에 입력을 각 queue 에 저장 시 sum1, sum2 도 같이 저장한다.

4. queue add/pop 수행 시 sum1, sum2 를 계산한다.

5. 마지막으로 두 큐가 처음부터 합이 같은 경우를 탐색하기 전 찾는다.

코드

import java.util.*

class Solution {
    fun solution(queue1: IntArray, queue2: IntArray): Int {
        var answer: Int = 0
        
        val q1 = LinkedList<Long>()
        val q2 = LinkedList<Long>()
        var sum1 = 0L
        var sum2 = 0L
        var sum = 0L
        
        queue1.forEach { queue ->
            q1.add(queue.toLong())
            sum1 +=queue
        }
        
        queue2.forEach { queue ->
            q2.add(queue.toLong())
            sum2 +=queue
        }
        
        sum = (sum1 + sum2) / 2
        
        var limit = 4 * q1.size
        
        while (limit != 0) {
            if (sum1 == sum2) break
            
            if (sum1 > sum2) {
                val num = q1.pop()
                q2.add(num)
                sum2 += num
                sum1 -= num
            } else {
                val num = q2.pop()
                q1.add(num)
                sum1 += num
                sum2 -= num
            }
            
            answer++
            limit--
        }
        
        if (sum1 != sum2) answer = -1
        
        return answer
    }
}
728x90