[SWEA]1225. 암호생성기(d3)

Developer Log·2022년 2월 8일
0

Algorithm PS

목록 보기
10/76

문제

다음 주어진 조건에 따라 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());
		
	}

}

.java

풀이

문제 유형 : 큐

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를 사용했다.

profile
개발 공부 일지

0개의 댓글