728x90
https://www.acmicpc.net/problem/2346
메모리: 20,528 KB , 시간: 144 ms
사용 알고리즘: 자료 구조, 덱
728x90
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder result = new StringBuilder();
int N = Integer.parseInt(br.readLine());
Deque<int[]> deque = new LinkedList<>();
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
deque.offerLast(new int[] {Integer.parseInt(st.nextToken()), i});
}
int[] now = deque.pollFirst();
result.append(now[1]);
while(!deque.isEmpty()) {
// 이전에 터진 풍선 안의 종이에 적혀있는 값이 양수라면 오른쪽 풍선으로 이동
// 즉, 왼쪽 값을 꺼내 오른쪽에 다시 넣는다
if(now[0] > 0) {
now[0] %= deque.size(); // 반복되는 횟수를 줄이기 위해 나머지 값만큼만 수행
if(now[0] == 0) { // 맨 마지막 풍선으로 이동하는 경우
now = deque.pollLast();
result.append(" ").append(now[1]);
continue;
}
// 원하는 풍선 전까지 왼쪽 풍선 빼서 오른쪽에 추가
for (int i = 1; i < now[0]; i++) {
deque.offerLast(deque.pollFirst());
}
now = deque.pollFirst();
result.append(" ").append(now[1]);
}
// 음수라면 왼쪽 풍선으로 이동
// 즉, 오른쪽 값을 꺼내 왼쪽에 다시 넣는다
else {
now[0] *= -1; // 얼만큼 이동해야 하는지 계산하기 위해 양수값으로 만들어줌
now[0] %= deque.size();
if(now[0] == 0) {
now = deque.pollFirst();
result.append(" ").append(now[1]);
continue;
}
// 원하는 풍선 전까지 오른쪽 풍선 빼서 왼쪽에 추가
for (int i = 1; i < now[0]; i++) {
deque.offerFirst(deque.pollLast());
}
now = deque.pollLast();
result.append(" ").append(now[1]);
}
}
System.out.println(result);
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 1495] 기타리스트 (java) (0) | 2024.10.01 |
---|---|
[백준, BOJ 16971] 배열 B의 값 (java) (1) | 2024.09.24 |
[백준, BOJ 1181] 단어 정렬 (java) (0) | 2024.09.21 |
[백준, BOJ 1996] 지뢰 찾기 (java) (0) | 2024.09.21 |
[백준, BOJ 10162] 전자레인지 (java) (1) | 2024.09.16 |