백준 2346 풍선 터뜨리기 - JAVA

2025. 1. 27. 18:35·알고리즘/백준

2346 문제 링크


https://www.acmicpc.net/problem/2346

 

문제 설명


 

입출력


 

코드


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.io.*;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int input = Integer.parseInt(br.readLine());
        Deque<Ball> deque = new ArrayDeque<>();
        int[] arr = new int[input];
        StringBuilder sb = new StringBuilder();
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 1; i <= input; i++) {
            int num = Integer.parseInt(st.nextToken());
            arr[i-1] = num;
            deque.offer(new Ball(num, i));
        }
        
        sb.append(1).append(" ");
        
        int bombNum = arr[0];
        deque.pollFirst();
        
        while(!deque.isEmpty()) {
            if(bombNum > 0) {
                for(int i = 1; i < bombNum; i++) {
                    deque.offer(deque.poll());
                }
                Ball next = deque.poll();
                bombNum = next.value;
                sb.append(next.index).append(" ");
            } else {
                for(int i = 1; i < -bombNum; i++) {
                    deque.offerFirst(deque.pollLast());
                }
                Ball next = deque.pollLast();
                bombNum = next.value;
                sb.append(next.index).append(" ");
            }
        }
        bw.write(sb.toString());
        bw.flush();
    }
}
 
class Ball {
    int value;
    int index;
    
    public Ball(int value, int index) {
        this.value = value;
        this.index = index;
    }
}
Colored by Color Scripter
cs

 

알고리즘 설명


해당 문제는 풍선에 적혀있는 숫자만큼 다음 풍선으로 이동하기 때문에,
숫자를 직선이 아닌 원형으로 연결된 것처럼 생각하면 풀이법을 쉽게 생각할 수 있습니다.
풍선에 적힌 수가 양수이면 오른쪽 / 음수이면 왼쪽이므로,
 
양수일 경우에는 원소에 적혀있는 숫자에서 1을 뺀만큼(이미 터진 풍선은 빼고 이동), 맨 앞의 원소를 제거하고, 첫번째 원소에 적힌 숫자만큼 맨 앞의 원소를 제거하고, 제거한 원소를 맨 뒤에 다시 삽입합니다.(다음 원소는 맨 앞 원소)
 
음수일 경우에는 반대로 맨 뒤의 원소를 제거하고, 제거한 원소를 맨 앞에 다시 삽입합니다.(다음 원소는 맨 뒤 원소)
앞뒤로 삽입과 삭제가 가능한 자료구조인 덱을 활용하는것이 핵심입니다.

 

코드 해석


풍선에 적힌 숫자를 입력받아 배열과 덱에 저장합니다. 덱의 인덱스는 1-base-position으로 저장합니다.
배열의 첫번째 원소를 bombNum(터뜨릴 풍선)에 저장하고, 덱의 첫번째 원소도 pollFirst로 제거합니다.
덱의 size가 0이 될때까지,

  • 양수일 경우, 해당 숫자에서 1을 뺀만큼 맨 앞 원소를 맨 뒤로 이동한 뒤, 이동이 끝나면 맨 앞의 원소를 제거하고 제거된 원소의 value를 다음 bombNum으로 설정합니다.
  • 음수일 경우, 해당 숫자에서 1을 뺀 맨 뒤 원소를 맨 앞으로 이동한 뒤, 이동이 끝나면 맨 뒤의 원소를 제거하고 제거된 원소의 value를 다음 bombNum으로 설정합니다.

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 11399 ATM - JAVA  (0) 2025.01.29
백준 1149 RGB거리 - JAVA  (0) 2025.01.28
백준 9184 신나는 함수 실행 - JAVA  (0) 2025.01.24
백준 28278 스택 2 - JAVA  (0) 2025.01.23
백준 17103 골드바흐 파티션 - JAVA  (2) 2025.01.22
'알고리즘/백준' 카테고리의 다른 글
  • 백준 11399 ATM - JAVA
  • 백준 1149 RGB거리 - JAVA
  • 백준 9184 신나는 함수 실행 - JAVA
  • 백준 28278 스택 2 - JAVA
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • 알고리즘 (54)
        • 백준 (45)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    알고리즘 고득점 kit
    Baekjoon
    프로그래머스
    기술질문
    Lv2
    백준
    브루트포스
    java
    Top-Down
    너비 우선 탐색
    깊이 우선 탐색
    CS
    재귀
    백트래킹
    자료구조
    dp
    BFS
    동적 계획
    완전탐색
    DFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
백준 2346 풍선 터뜨리기 - JAVA
상단으로

티스토리툴바