🔑 문제
- 첫 번째 숫자를 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(" ")
}
'코딩테스트' 카테고리의 다른 글
[알고리즘] 트리, 그래프에 대하여 (0) | 2023.09.27 |
---|---|
[알고리즘] 선택 정렬, 이진 탐색으로 X보다 큰 정수만 출력하기 (1) | 2023.09.07 |
[백준] Python # 11021 : A+B - 7 (0) | 2023.09.01 |