다음 주어진 조건에 따라 n개의 수를 처리하면 8자리의 암호를 생성할 수 있다.
8개의 숫자를 입력 받는다.
첫 번째 숫자를 1 감소한 뒤, 맨 뒤로 보낸다.
다음 첫 번째 수는 2 감소한 뒤 맨 뒤로, 그 다음 첫 번째 수는 3을 감소하고 맨 뒤로, 그 다음 수는 4, 그 다음 수는 5를 감소한다.
이와 같은 작업을 한 사이클이라 한다.
숫자가 감소할 때 0보다 작아지는 경우 0으로 유지되며, 프로그램은 종료된다. 이 때의 8자리의 숫자 값이 암호가 된다.
주어지는 각 수는 integer 범위를 넘지 않는다.
마지막 암호 배열은 모두 한 자리 수로 구성되어 있다.
각 테스트 케이스의 첫 줄에는 테스트 케이스의 번호가 주어지고, 그 다음 줄에는 8개의 데이터가 주어진다.
#부호와 함께 테스트케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.
1
9550 9556 9550 9553 9558 9551 9551 9551
2
2419 2418 2423 2415 2422 2419 2420 2415
........
#1 6 2 2 9 4 1 3 0
#2 9 7 9 5 4 3 8 0
.......
import java.io.*;
import java.util.*;
public class Solution_d3_1225_암호생성기_이주희 {
public static void main(String[] args) throws Exception{
//System.setIn(new FileInputStream("res/input_d3_1225.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
while(true) {
String s;
1. if((s=br.readLine()).equals("")) break;
int tc = Integer.parseInt(s);
st = new StringTokenizer(br.readLine(), " ");
2. Queue<Integer> que = new ArrayDeque<Integer>();
for(int i=0; i<8; i++) {
int num = Integer.parseInt(st.nextToken());
que.offer(num);
}
3. exit: while(true) {
for(int d=1; d<=5; d++) {
int val = que.poll()-d;
if(val<0) val=0;
que.offer(val);
if(val==0) {
break exit;
}
}
4. }
sb.append("#").append(tc).append(" ");
for(int i=0; i<8; i++) {
sb.append(que.poll()).append(" ");
}
sb.setLength(sb.length()-1);
sb.append("\n");
}
System.out.println(sb.toString());
}
}
문제 유형 : 큐
1.번 라인
버퍼에서 읽어온 입력이 끝나면 종료한다.
+) 추가.
int tc=0;
try {
tc = Integer.parseInt(br.readLine());
}catch(Exception e) {
break;
}
도 가능하다.
2.번 라인
데이터의 선입선출이 필요하기 때문에 자료구조 Queue를 사용한다.
Queue는 interface이기 때문에 객체를 생성하지 못한다. (Stack는 객체 생성이 가능하다.) 따라서 LinkedList, ArrayDeque, PriorityQueue 등을 사용하여 객체를 생성해야 하는데, LinkedList보다 ArrayDeque이 더 빠르기 때문에 이것을 사용했다.
3.~4.번 라인
한 싸이클은 for문을 통해 구현하였고, 종료 조건인 que의 마지막 원소가 0이 되면 전체 반복문을 빠져나오도록 label exit를 사용했다.