본문 바로가기

알고리즘

[백준] 암호생성기 문제 / JAVA

반응형

 [ 문제 ]

 

다음 주어진 조건에 따라 n개의 수를 처리하면 8자리의 암호를 생성할 수 있다.

- 8개의 숫자를 입력 받는다.

- 첫 번째 숫자를 1 감소한 뒤, 맨 뒤로 보낸다. 

다음 첫 번째 수는 2 감소한 뒤 맨 뒤로, 그 다음 첫 번째 수는 3을 감소하고 맨 뒤로, 그 다음 수는 4, 그 다음 수는 5를 감소한다.

이와 같은 작업을 한 사이클이라 한다.

- 숫자가 감소할 때 0보다 작아지는 경우 0으로 유지되며, 프로그램은 종료된다. 이 때의 8자리의 숫자 값이 암호가 된다.

 

 

[제약 사항]

주어지는 각 수는 integer 범위를 넘지 않는다.

마지막 암호 배열은 모두 한 자리 수로 구성되어 있다.
 
[입력]

각 테스트 케이스의 첫 줄에는 테스트 케이스의 번호가 주어지고, 그 다음 줄에는 8개의 데이터가 주어진다.

 

ex. 9550 9556 9550 9553 9558 9551 9551 9551 
[출력]
ex. 6 2 2 9 4 1 3 0

[Java Code]

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class 암호생성기 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		Queue<Integer> code = new LinkedList<>();
		int cnt =0;
		boolean find = false;
		
		for ( int tc = 1; tc <=10 ; tc++) {
			sc.nextInt(); // case number
			find = false;
			// 저장			
			for ( int i=0; i< 8; i++) {
				code.offer(sc.nextInt());
			}
			
			//System.out.println(code.toString());
			//System.out.println(code.poll());
			while ( true) {
				// 1cycle : 5개 만큼 뒤로 보내기
				
				cnt =1;
				while ( cnt != 6) {
					int first = code.poll(); // 앞에있는거 꺼내서
					first -= cnt ; // cnt 감소 후
					
					if ( first <= 0 ) 	{
						first =0;
						code.offer(first);
						//System.out.println(code.toString());
						find = true;
						break;
					}
					else code.offer(first); // 다시 뒤에다가 넣기
					
					
					cnt ++;
				}
				if ( find) break;
			}
			System.out.print("#" +tc+" ");
			for( int i=0; i<8; i++) {
				System.out.print(code.poll()+" ");
			}
			System.out.println();
			code.clear();
		}
		
	}
}
Queue<Integer> code = new LinkedList<>();

 - 큐의 offer , poll 메소드를 응용한 문제

반응형