[Java] SWEA 1225번: 암호생성기

U·2023년 8월 8일

SWEA

목록 보기
7/10

문제

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

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

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

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

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

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

[제약 사항]

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

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

[입력]

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

[출력]

#부호와 함께 테스트케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.


일단 생각하기!

  • 가장 앞의 값을 뒤로 보내는 과정을 반복하므로 Queue를 이용했다! 감소할 수인 count를 증가시키며 가장 앞의 값에서 count만큼 감소하고 삭제한 뒤, 가장 뒤에 추가한다. 그리고 count가 5가 되면 다시 1로 설정한 뒤 반복하며 count만큼 뺀 수가 0 이하일때, 0을 넣은 뒤 반복을 중지한다.

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

/**
 * @author 김유나
 * [문제] SWEA 1225번 암호생성기
 * - 8개의 숫자를 입력 받아 첫번째 숫자를 1 감소한 뒤 맨뒤로 보내고, 두번째 숫자를 2 감소한뒤 맨뒤로 보낸다. 다섯번째 숫자까지 반복한 뒤 다시 1을 감소시키는 사이클로 돌아간다.
 * - 이때, 감소한 값이 0 이하일때, 0으로 하여 맨뒤로 보낸 숫자열이 최종 암호다.
 * [아이디어]
 * - 가장 앞의 값을 뒤로 보내는 과정을 반복하므로 Queue를 사용한다.
 * - 감소할 수인 count를 증가시키며 가장 앞의 값에서 count만큼 감소하고 삭제한 뒤, 가장 뒤에 추가한다.
 * - count가 5가 되면 다시 1로 설정한 뒤 반복하며 count만큼 뺀 수가 0 이하일때, 0을 넣은 뒤 반복을 중지한다.
 *
 * 메모리 : 24,316kb 실행 시간 : 120ms
 */
public class D3_1225_암호생성기_김유나 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		for (int T = 1; T <= 10; T++) {
			int tc = Integer.parseInt(br.readLine()); // 테스트 케이스
			Queue<Integer> q = new LinkedList<>(); // 8개의 숫자를 넣을 Queue
			StringTokenizer st = new StringTokenizer(br.readLine()); // 입력받은 숫자 한 줄
			StringBuilder sb = new StringBuilder();
			
			for (int i = 0; i < 8; i++) {
				q.offer(Integer.parseInt(st.nextToken())); // Queue에 숫자 8개 입력
			}
			
			int count = 1; // 감소할 값 count
			
			while (true) {
				int first = q.poll() - count++;
				// poll() : 가장 앞의 값 반환한 뒤 삭제
				// count만큼 감소 후 ++
				
				if (first <= 0) { // 감소한 값이 0 이하일 경우
					q.offer(0); // 0을 넣은 뒤
					break; // break
				}
				
				if (count == 6) count = 1; // count가 6이 되면 1로 다시 초기화 : 새 사이클 시작
				
				q.offer(first); // 감소된 값 넣기
			}
			
			sb.append("#").append(T).append(" ");
			
			for (int i = 0; i < 8; i++) {
				sb.append(q.poll()).append(" ");
			}
			
			System.out.println(sb);
		}
	}

}
profile
백엔드 개발자 연습생

0개의 댓글