본문 바로가기

코딩테스트

[알고리즘] 코틀린으로 큐(Queue) 구현하기



🔑 문제

  • 첫 번째 숫자를 1 감소한 뒤, 맨 뒤로, 다음 첫 번째 수는 2감소한 뒤 맨 뒤로, 첫 번째 수는 3을 감소, 그 다음 수는 4, 그 다음 수는 5를 감소해 다음 오는 첫 번째 수는 다시 1을 감소한 후 맨 뒤로 보낸다. 이 작업을 반복한다.
  • 숫자가 감소할 때 0보다 작아지는 경우 0, 맨 뒤로 보내는 숫자가 0일 경우에도 수를 맨 뒤로 보낸 이후 한 과정이 종료된다.
  • 이 때의 8자리의 숫자 값이 암호가 된다.

[조건]

  • 문제는 queue를 사용해 해결해야 한다.
  • 지인의 학교 수업 문제로, 저작권 상 자세한 설명은 생략

 

🧸 풀이

 

코틀린에서는 Queue를 바로 사용할 수 없고, 자바의 기능을 사용해야 한다

LinkedList 사용!

java.util.LinkedList를 import 해주어야 한다

// 입력 받기
    var a = readLine()
    var A = a?.split(" ")

    if (A?.size != 8) {
        print("8개의 정수를 입력해야 합니다.")
        return
    }

    val queue: Queue<Int> = LinkedList()
    for (i in 0..7) {
        queue.add(A[i].toInt())
    }
    
    print(queue)

Queue 선언

val queue: Queue<Int> = LinkedList()

 

 

Queue 값 삽입

add() 용량 제한이 발생하면 Exception

offer() Exception 발생 X

LinkedList에서 용량 제한이 발생하기는 힘들기 때문에 큰 차이는 없음

 

 

Queue 첫 값 확인

elememnt() 큐에 값이 없을 때 → NoSuchElementException

peek() 큐에 값이 없을 때 → null

 

 

코틀린의 여러 반복문

for (i in 1..10) {
	pring(i)
}
// 12345678910

step

for (i in 1..10 step 2) {
	println(i)
}

2씩 증가

1 3 5 7 9

감소

for (i in 10 downTo 5) {
    println(i)
}

5까지, 1씩 감소

10 9 8 7 6 5

 

 

 

 

🔥 트러블 슈팅

  • 테스트 여러번 했을 때 여러번 반복하게 하는 것을 함수로 어떻게 구현할 지, 코틀린 queue 자체를 처음해보는 것
  • 일단 코틀린으로 알고리즘 푸는 것 자체가 어색어색 🥹
  • 검색으로 푸는 것을 최대한 안하려고 노가다,, 코드가 안 예쁘다..! ㅠ ㅠ
  • 팀원의 코드 리뷰로 도움 받은 것
    • forEach() 문을 이용하여 코드 간결화를 해보자!
    • while문을 벗어나는 코드가 보이질 않아 무한루프에 빠질 수 있다

 

💎 전체 코드

package com.example.plugins.pooh_week2

//1.암호 만들기
//
//[입력]
//
//8개의 숫자를 입력받는다.
//첫 번째 숫자를 1 감소한 뒤, 맨 뒤로 보낸다. 다음 첫 번째 수는 2감소한 뒤 맨 뒤로, 첫 번째 수는 3을 감소하고 맨 뒤로, 그 다음 수는 4, 그 다음 수는 5를 감소해 다음 오는 첫 번째 수는 다시 1을 감소한 후 맨 뒤로 보낸다. 이와 같은 작업을 반복한다.
//숫자가 감소할 때 0보다 작아지는 경우 0이 되며, 맨 뒤로 보내는 숫자가 0일 경우에도 수를 맨 뒤로 보낸 이후 한 과정이 종료된다. 이 때의 8자리의 숫자 값이 암호가 된다.
//[조건]
//
//문제는 queue를 사용해 해결해야 한다.
//마지막 암호 배열은 모두 한 자리 수로 구성되어 있다.
//주어지는 수는 0이상 10000 이하의 수이다.
//한 차레 암호 만드는 과정이 완료되면, 프로그램을 종료하지 않고 다음 입력을 기다린다.
//[출력]
//
//#부호와 함께 테스트 케이스의 번호를 출력한 뒤, 테스트 케이스의 답을 출력한다.
//모든 입력이 종료된 후에 한번에 출력해야한다.

import java.util.*

fun main() {
    var test = 0
    while (true) {
        var queueList : Queue<Int>

        inputTest().let {
            queueList = it?.let { it1 -> toQueue(it1) }!!
        }

        printKey(test, queueList)
        test++
    }


    println()

}

fun toQueue(list: List<String>): Queue<Int> {

    val queue: Queue<Int> = LinkedList()
    for (i in 0..7) {
        queue.add(list[i].toInt())
    }

    toKey(queue)

    return queue
}


fun inputTest(): List<String>? {
    // 입력 받기
    var a = readLine()
    var A = a?.split(" ")

 if (A?.size != 8) {
        print("8개의 정수를 입력해야 합니다.")
    }

    return A
}

fun toKey(queue: Queue<Int>) {
    var minus = 1

    while (queue.element() != 0) {
        var new = queue.poll()
        new -= minus
        if(new > 0) {
            queue.add(new)
        } else {
            new = 0
            queue.add(new)
            break
        }
        minus++
        if (minus == 6) {
            minus = 1
        }
    }
}

fun printKey(test : Int, queue: Queue<Int>) {
    print("#${test} ")
    for (i in 0..7) {
        print(queue.poll())
        print(" ")
    }