sggnology
하늘속에서IT
sggnology
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • Algorithm (31)
      • Programmers (27)
      • Baekjoon (4)
    • WIKI (4)
      • VirtualBox (1)
      • Power Toys (1)
    • NodeJS (4)
      • nvm (1)
      • React (1)
      • Vue (1)
    • Dev Language (3)
      • Java (2)
      • Kotlin (1)
    • Spring Boot (17)
      • Gradle (1)
      • JPA (3)
    • DB (4)
      • MariaDB (3)
      • Redis (0)
    • Android (6)
      • Debug (3)
    • Nginx (3)
      • Debug (1)
    • Intellij (0)
    • Network (1)
    • Git (2)
      • GitHub (2)
    • Chrome Extension (0)
    • ETC (5)
      • Monitoring (2)
    • Linux (1)
      • WSL (1)
    • Visual Studio (1)
    • Side Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • 티스토리챌린지
  • java
  • JPA
  • 알고리즘
  • DB
  • 안드로이드 스튜디오
  • docker
  • mariadb
  • kotlin
  • 레벨2
  • 오블완
  • 연습문제
  • spring boot
  • 고득점 Kit
  • 프로그래머스
  • 고득점KIT
  • nginx
  • 레벨3
  • Android Studio

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sggnology

하늘속에서IT

Programmers :: 2022 tech internship :: 두 큐 합 같게 만들기
Algorithm/Programmers

Programmers :: 2022 tech internship :: 두 큐 합 같게 만들기

2022. 8. 30. 15:32
728x90

큐의 형태

풀이

import java.util.*

class Solution {
    fun solution(queue1: IntArray, queue2: IntArray): Int{
        var answer = -2

        /**
         * 설명
         * - 두큐의 값 교환에 대한, 최악의 수
         *
         * 예
         * - 1번큐: [1,1,1...](300,000개)
         * - 2번큐: [1,1,1..,599999,1](300,000개)
         * - 위 두큐의 값이 같아지려면
         * - 2번큐에서 299,999 번 이동하고
         * - 1번큐에서 599.998 번 이동해야 한다.
         * */
        val oneCycleCounts: Long = queue1.size.toLong() * 3 - 3

        val firstQueue: Queue<Int> = LinkedList(queue1.toMutableList())
        val secondQueue: Queue<Int> = LinkedList(queue2.toMutableList())

        var firstQueueSum = getSum(firstQueue)
        var secondQueueSum = getSum(secondQueue)
        
        val totalSum = firstQueueSum + secondQueueSum
        /**
         * 설명
         * - 두큐합의 절반이다.
         * */
        val halfSum = totalSum / 2

        /**
         * 설명
         * - 예외조건이다.
         * - 두큐합은 홀수가 되면 안된다.
         * */
        if(totalSum % 2 == 1L){
            return -1
        }

        /**
         * 설명
         * - 두큐가 같아지기 위한 동작 횟수
         * */
        var numberOfOperations = 0L

        while(true){

            /**
             * 설명
             * - 만일 한쪽의 큐가 비게된다는것은 값의 균형이 맞지 않는다는 소리와 같으니, `-1`을 return 한다.
             * */
            if(firstQueue.isEmpty() || secondQueue.isEmpty()){
                return -1
            }

            /**
             * 설명
             * - 최악의 경우의 수보다 더 많은 경우를 시도하려 하는것은 더이상 옳은 경우가 없다는 것이다.
             * */
            if(oneCycleCounts < numberOfOperations){
                return -1
            }

            /**
             * 설명
             * - 하나의 큐라도 절반의 값을 가진다면 정답 조건이다.
             * */
            if(firstQueueSum == halfSum){
                answer = numberOfOperations.toInt()
                break
            }
            /**
             * 설명
             * - firstQueue 가 halfSum 보다 작다는 것은 firstQueue < secondQueue 과 같은 의미
             * */
            else if(firstQueueSum < halfSum){
                firstQueueSum += secondQueue.peek()
                secondQueueSum -= secondQueue.peek()
                queue2ToQueue1(firstQueue, secondQueue)
            }
            else{
                firstQueueSum -= firstQueue.peek()
                secondQueueSum += firstQueue.peek()
                queue1ToQueue2(firstQueue, secondQueue)
            }

            numberOfOperations += 1

        }

        return answer
    }

    private fun getSum(list: Queue<Int>): Long{

        var sum = 0L

        sum = list.sumOf { it.toLong() }

        return sum
    }

    private fun queue1ToQueue2(queue1: Queue<Int>, queue2: Queue<Int>){
        queue2.add(
            queue1.remove()
        )
    }

    private fun queue2ToQueue1(queue1: Queue<Int>, queue2: Queue<Int>){
        queue1.add(
            queue2.remove()
        )
    }

}

출처

 

프로그래머스

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

programmers.co.kr


 

 

 

GitHub - sggnology/programmers-algorithm: 프로그래머스 알고리즘 코드 정리입니다.

프로그래머스 알고리즘 코드 정리입니다. Contribute to sggnology/programmers-algorithm development by creating an account on GitHub.

github.com

 

728x90

'Algorithm > Programmers' 카테고리의 다른 글

Programmers :: 고득점 kit :: 이중우선순위큐  (0) 2022.09.21
Programmers :: 연습문제 :: 최솟값  (0) 2022.09.17
Programmers :: 2021 카카오 채용연계형 인턴십 :: 거리두기 확인하기  (0) 2022.08.16
Programmers :: Summer/Winter Coding(2019) :: 멀쩡한 사각형  (0) 2022.08.04
Programmers 동적계획법 :: 레벨3 :: N 으로 표현  (0) 2022.07.26
    'Algorithm/Programmers' 카테고리의 다른 글
    • Programmers :: 고득점 kit :: 이중우선순위큐
    • Programmers :: 연습문제 :: 최솟값
    • Programmers :: 2021 카카오 채용연계형 인턴십 :: 거리두기 확인하기
    • Programmers :: Summer/Winter Coding(2019) :: 멀쩡한 사각형
    sggnology
    sggnology
    하늘은 파란색이니까 내 삶도 파란색이길 ㅎㅎ

    티스토리툴바