문제 풀기/C#

110. 두 큐 합 같게 만들기

kagan-draca 2025. 5. 1. 01:55

 

기본 틀 : 

 

using System;

public class Solution {
    public int solution(int[] queue1, int[] queue2) {
        int answer = -2;
        return answer;
    }
}

 

처음에는 간단하게 Queue로 요소를 저장하고

 

sum1 = queue1.Sum()과  sum2 = queue2.Sum()로 합을 저장한 후

 

total = sum1 + sum2를 한 값이 홀수이면 -1을 반환하고

 

아닐 경우 나누기 2를 해준 후  while()문으로 sum1과 sum2가 total과 동일해지면 동작 횟수를 반환해줄 생각이었다.

 

 이때, 동작 횟수가 두 배열의 길이 합에 곱하기 2일 경우 sum1과 sum2가 total이 될 수 없는 상황이 된다.

 

(이유 : 두 배열의 요소가 한 쪽으로 완전히 왔다갔다 했음을 의미)

 

 

using System;
using System.Linq;
using System.Collections.Generic;

public class Solution {
    public long solution(int[] array1, int[] array2) 
    {
        Queue<int> queue1 = new Queue<int>(array1);
        Queue<int> queue2 = new Queue<int>(array2);
        
        long sum1 = array1.Sum();
        long sum2 = array2.Sum();
        
        long total = sum1 + sum2;
        
        if(total % 2 == 1) return -1;
        
        total /= 2;
        
        long count = 0, len = (array1.Length + array2.Length) * 2;
        
        while(count <= len)
        {
            if(sum1 == total) return count;
            else if(sum1 > total && queue1.Count > 0)
            {
                int temp = queue1.Dequeue();
                sum1 -= temp;
                
                sum2 += temp;
                queue2.Enqueue(temp);
            }
            else if(sum1 < total && queue2.Count > 0)
            {
                int temp = queue2.Dequeue();
                sum2 -= temp;
                
                sum1 += temp;
                queue1.Enqueue(temp);
            }
            
            count++;
        }
        
        return -1;
    }
}

 

그 결과,

 

런타임 애러로 부분적인 성공만 거뒀다...

 

런타임 애러를 찾기 위해 Queue의 동작을 살펴봤지만 크게 이상은 없었다...

 

그래도 문제를 해결하지 못 해서 완전히 코드를 갈아 엎어서

 

Queue<(int value, int index, int source)> queue = new Queue<(int, int, int)>

var peek = queue.Peek()

 

Queue와 값 튜플(Value Tuple) 및 Queue의 Peek() 함수를 사용해

 

While()의 진행에 따른 이동할 요소가 Queue의 첫 번째 요소일 경우 -1을 반환하는 형식으로

 

수정도 해보았지만 동일한 결과가 도출됐다.

 

이틀 동안 수 차례 원인을 찾기 위해 코드를 수정 및 분석을 한 결과...

 

        long sum1 = array1.Sum();
        long sum2 = array2.Sum();

 

 

위의 코드에서 오류가 발생했었다...

 

이유로는 Sum() 메서드의 결과는 int형으로 array1과  array2의 모든 결과의 합이

 

int형을 벗어나는 상황이 발생할 수 있기 때문이었다.

 

그 사실을 알게 된 후

 

        long sum1 = array1.Sum(x => (long)x);
        long sum2 = array2.Sum(x => (long)x);

 

Sum() 메서드를 람다식(lambda)으로 Sum 메서드에

 

입력된 매개변수들을 long 타입 변환 및 반환 값을 long 타입으로 바꿔 문제를 해결할 수 있었다...

 

그 결과...

 

 

모든 테스트 케이스를 통과할 수 있었다...

 

이 사건을 계기로

 

'C#의 Linq 메서드를 아무 생각 없이 막 사용하고 있었던게 아닌가'

 

라는 생각 및 다음부터는 C# Linq 메서드를 사용할 때 

 

입력값과 반환값에 더 유의해야겠다는 생각을 가지게 됐다...

 

전체 코드 : 

using System;
using System.Linq;
using System.Collections.Generic;

public class Solution {
    public int solution(int[] array1, int[] array2) 
    {
        Queue<int> queue1 = new Queue<int>(array1);
        Queue<int> queue2 = new Queue<int>(array2);
        
        long sum1 = array1.Sum(x => (long)x);
        long sum2 = array2.Sum(x => (long)x);
        
        long total = sum1 + sum2;
        
        if(total % 2 == 1) return -1;
        
        total /= 2;
        
        int count = 0, len = (array1.Length + array2.Length) * 2;
        
        while(count <= len)
        {
            if(sum1 == total) return count;
            
            if(sum1 > total)
            {
                if(queue1.Count == 0) return -1;
                
                int temp = queue1.Dequeue();
                sum1 -= temp;
                
                sum2 += temp;
                queue2.Enqueue(temp);
            }
            else
            {
                if(queue2.Count == 0) return -1;
                
                int temp = queue2.Dequeue();
                sum2 -= temp;
                
                sum1 += temp;
                queue1.Enqueue(temp);
            }
            
            count++;
        }
        
        return -1;
    }
}

 

'문제 풀기 > C#' 카테고리의 다른 글

109. 연속된 부분 수열의 합  (0) 2025.04.28
108. 삼각 달팽  (0) 2025.04.24
107. 큰 수 만들기  (0) 2025.04.22
105. 쿼드압축 후 개수 세기  (0) 2025.04.22
106. 택배상자  (0) 2025.04.03