기본 틀 :
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 |