import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class 큐 {
static Queue <Integer> q;
static int N, front, rear;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int tc = 1; tc <= 10; tc++) {
N = sc.nextInt();
q = new LinkedList <Integer>();
for (int i = 0; i < 8; i++) {
int tmp = sc.nextInt();
q.offer(tmp);
if(i == 7) {
rear = tmp; //제일 끝 인덱스 값 넣어주기
}
}
while(rear > 0) {
// 싸이클 돌리기
for (int i = 1; i <= 5; i++) {
front = q.poll();
rear =front - i;
if(rear <= 0) {rear = 0;
q.offer(rear);
break;
}
q.offer(rear);
}
}
System.out.print("#" + tc + " ");
while(!q.isEmpty()) {
System.out.print(q.poll() + " ");
}
System.out.println();
}
}
}
// 뭔가 티스토리가 코드 붙여넣으면 글이 작성이 잘 안될 떄가 있어서 부가 설명은 여기다가 적겠다.
// 푸는 방법이야 여러가지 있겠지만 나는 제일 끝에 들어가는 마지막(rear) 변수를 들고 있으면서
// 그 변수의 값이 0보다 작거나 같은지를 검사해주도록 짰다.
새로운 접근법 ============================
공통의 배수를 미리 뺀다는 아이디어
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class ImprovedQueueVer {
static Queue <Integer> q;
static int N, front, rear, Min, tmp;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int tc = 1; tc <= 10; tc++) {
q = new LinkedList <Integer>();
N = sc.nextInt();
// 수의 범위가 인티저를 넘지 않는다고 했으므로 max value 넣어줌
Min = Integer.MAX_VALUE;
for (int i = 0; i < 8; i++) {
tmp = sc.nextInt();
// 입력 값중에 최소값을 찾자
q.offer(tmp);
if(tmp < Min) {
Min = tmp;
}
}
// 수가 돌다가 자기 자리로 갈 때 빠지는 수(값)는 15임
// 최솟값을 15로 나눠 공통의 배수를 뽑는다 -> 이 부분 이해 잘해야함
// 그니까 9550을 15로 나눈 몫은 636이자나 근데 다른 수들한테 636 빼는건 의미가 없지
// 636 * 15를 해줘야 9540이라는 변수가 나오는거니까
// 그렇게 해서 10 16 10 13 18 11 11 11 이라는 값을 얻는다
// 이거는 일단 제자리로 돌아오는 연산을 636번 한 경우 그걸 일일히 하나하나 돌리지 않고 미리 빼준거임
// 그래서 일단 이 val 변수는 수가 한바퀴 (1~5사이클이 아니라 돌다가 자기 원래 자리로 가는 거)
// 를 돌 때 도는 바퀴수를 저장해주는 것 그래서 일일히 돌 필요 없이 공평하게 자 몇바퀴 돌았다고 생각하자 이러고 미리 그 돈 횟수만큼 빼주면 되니까
// 그런데 만약에 15로 나누어 떨어지는 수라면 나머지가 0 이 되니까 큐의 마지막 원소가 0이 된다면 종료한다는 문제 조건에 어긋난다
// 그래서 그런 경우에는 15를 더해주어야 한다. (몫에서는 하나를 빼줘야겟지)
int val = 0;
if(Min % 15 == 0) {
val = Min / 15 * 15 - 15;
}
else {
val = Min / 15 * 15;
}
// 공통의 배수 다 빼주자
for (int i = 0; i < 8; i++) {
tmp = q.poll() - val;
q.offer(tmp);
if(i == 7) {
rear = tmp;
}
}
while(rear > 0) {
// 싸이클 돌리기
for (int i = 1; i <= 5; i++) {
front = q.poll();
rear =front - i;
if(rear <= 0) {rear = 0;
q.offer(rear);
break;
}
q.offer(rear);
}
}
System.out.print("#" + tc + " ");
while(!q.isEmpty()) {
System.out.print(q.poll() + " ");
}
System.out.println();
}
}
}
'알고리즘 문제 풀이' 카테고리의 다른 글
백준 1065 한수 (Java 자바) (0) | 2021.02.08 |
---|---|
SWEA 퍼펙트 셔플 (0) | 2021.02.05 |
백준2164 카드2 (0) | 2021.02.04 |
SWEA 괄호 짝짓기 (0) | 2021.02.04 |
SWEA) 중간값 찾기 (0) | 2021.02.03 |