✔ 암호생성기
문제 분석하기
큐를 이용하여 숫자를 하나씩 꺼내 1부터 증가하며 감소한 후 다시 큐에 넣어줌
숫자가 감소하여 0보다 작아질 때 암호가 되므로 이를 반환
손으로 풀어보기
- 숫자를 큐에 저장
- 1부터 시작하여 1씩 증가하며 숫자를 하나 꺼내 감소한 후 다시 큐에 넣어줌
- 숫자가 6이 된다면 한 사이클을 돈 것이므로 다시 처음부터 시작하도록 함
- 이때 0이 된다면 마지막으로 큐에 집어넣고 종료
- 암호를 반환
슈도코드 작성하기
T(테스트 케이스 수) = 10
for(T만큼) {
t(테스트 케이스 번호)
queue(암호 저장 큐)
queue에 암호 숫자 8개 저장
queue = 암호 변환 함수
StringBuilder sb = new StringBuilder
sb에 암호와 공백 추가
#T와 sb 반환
}
암호 변환 함수 {
index(감소 숫자) = 1
while(true) {
큐에서 숫자를 하나 꺼냄
if(숫자에서 index를 뺀 숫자가 0보다 작다면) {
큐에 0을 저장
프로그램 종료
}
else {
큐에 숫자에서 index를 뺀 숫자 저장
index 증가
}
if(index가 6이라면) {
한 사이클을 완료했으므로 index를 원래대로 초기화
}
}
코드 구현하기
/**
* 1225) 암호생성기
*/
public class D001_1225 {
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
// T(테스트 케이스 수) = 10
int T = 10;
// T만큼
for (int test_case = 1; test_case <= T; test_case++) {
// t(테스트 케이스 번호)
int t = sc.nextInt();
// queue(암호 저장 큐)
Queue<Integer> queue = new LinkedList<>();
// queue에 암호 숫자 8개 저장
for (int i = 0; i < 8; i++) {
queue.add(sc.nextInt());
}
// queue = 암호 변환 함수
queue = generate(queue);
// sb에 암호와 공백 추가
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 8; i++) {
sb.append(queue.poll() + " ");
}
// #T와 sb 반환
System.out.println("#" + t + " " + sb);
}
}
// 암호 변환 함수
private static Queue<Integer> generate(Queue<Integer> queue) {
// index(감소 숫자) = 1
int index = 1;
while (true) {
// 큐에서 숫자를 하나 꺼냄
int num = queue.poll();
// 숫자에서 index를 뺀 숫자가 0보다 작다면
if (num - index <= 0) {
// 큐에 0을 저장
queue.add(0);
// 프로그램 종료
break;
} else {
// 큐에 숫자에서 index를 뺀 숫자 저장
queue.add(num - index);
// index 증가
index++;
}
// index가 6이라면
if (index == 6) {
// 한 사이클을 완료했으므로 index를 원래대로 초기화
index = 1;
}
}
return queue;
}
}
'Coding Test > 알고리즘 실전' 카테고리의 다른 글
[1227] 미로2 (0) | 2023.11.20 |
---|---|
[1226] 미로1 (0) | 2023.11.20 |
[1224] 계산기3 (0) | 2023.11.19 |
[1223] 계산기2 (0) | 2023.11.19 |
[1222] 계산기1 (0) | 2023.11.19 |