주녘공부일지

[프로그래머스 C#] Lv.2 두 큐 합 같게 만들기 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 두 큐 합 같게 만들기

주녘 2023. 11. 13. 18:06
728x90

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

 

프로그래머스

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

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

- int형 배열로 주어진 queue1, queue2를 실제로 Queue<int>에 넣어서 목표 숫자(총합 / 2)보다 작으면 다른 큐에서 받아오고, 크면 다른 큐로 내보내기를 반복

- 최대 이동 횟수는 모든 원소의 합 * 2 보다 낮을 것이며, 총합이 홀수일 경우 두 큐의 총합은 같을 수 없음

 -> ( 최대 이동 횟수는 q1이 모든 원소를 주고 q2의 모든 원소를 받는 것을 두번 반복하여 다시 원래의 값이 되는 데에 필요한 이동 횟수보다 적을 것 )

- 매번 배열의 총합을 연산하기엔 비용이 많이 들기 때문에 각 queue의 총합 상태를 변수로 따로 관리함

https://godgjwnsgur7.tistory.com/46

 

[C#] 자료구조 ( 제네릭 컬렉션 )

자료구조(Data Structure)란? 데이터를 효율적으로 접근하고 조작할 수 있게 데이터 구조를 만들어 관리하는 것 - Collections은 C#에서 지원하는 자료구조 클래스 using System.Collections.Generic; 제네릭 컬렉

godgjwnsgur7.tistory.com

주석 참조

    using System;
    using System.Collections.Generic;

    public class Solution
    {
        public int solution(int[] queue1, int[] queue2)
        {
            int moveCount = 0; // 이동 횟수 ( q1 <-> q2 )
            Queue<int> q1 = new Queue<int>();
            Queue<int> q2 = new Queue<int>();
            long sum1 = 0, sum2 = 0;

            // 값 세팅
            for (int i = 0; i < queue1.Length; i++)
            {
                q1.Enqueue(queue1[i]);
                sum1 += queue1[i];
            }
            for (int i = 0; i < queue2.Length; i++)
            {
                q2.Enqueue(queue2[i]);
                sum2 += queue2[i];
            }

            long target = sum1 + sum2; // 총합

            // 총합이 홀수일 경우 q1, q2를 같게 만들 수 없음
            if (target % 2 != 0)
                return -1;

            target /= 2; // 타겟 값 설정 (총합의 / 2)

            // 최대 이동 횟수
            int maxCount = (queue1.Length + queue2.Length) * 2;

            while (moveCount < maxCount)
            {
                if (target == sum1)
                    return moveCount;

                if (target > sum1)
                {
                    int tempNum = q2.Dequeue();
                    q1.Enqueue(tempNum);
                    sum1 += tempNum;
                    moveCount++;
                }
                else // target < sum1
                {
                    int tempNum = q1.Dequeue();
                    q2.Enqueue(tempNum);
                    sum1 -= tempNum;
                    moveCount++;
                }
            }

            return -1;
        }
    }
728x90