알고리즘
[Java] 백준 2346번 풍선 터뜨리기
달려라 태깅이
2023. 9. 21. 20:31
https://www.acmicpc.net/problem/2346
2346번: 풍선 터뜨리기
1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선
www.acmicpc.net
핵심
시간초과 : Queue<Integer> q = new LinkedList<>()
해결방법 : ArrayDeque<int[]> list = new ArrayDeque<>();
→ ArrayDeque를 이용해서 {풍선번호, 종이값} 과 같은 형태로 큐의 요소 저장.
포인트
• 종이에 적힌 이동칸 수가 양수 또는 음수일 경우에 요소의 이동
offerFirst(), offerLast() 메소드와
pollFirst(), pollLast() 메소드로
큐에서 앞의 요소를 뒤로, 뒤의 요소를 앞으로 옮길 수 있다. (양방향)
import java.util.*;
/*
1.ArrayDeque<int[]> list 를 이용해서 풍선번호, 종이값을 배열에 담는다.
2.list에서 요소를 꺼낸 뒤, 번호는 sb에 추가하고 종이값만큼 이동한다.
양수 : 1 ~ 값 - 1 만큼 이동
음수 : 값 ~ -1 만큼 이동
3.2번 작업을 반복하여 문자열 완성한 뒤 반환
*/
public class Main{
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
ArrayDeque<int[]> list = new ArrayDeque<>();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 1; i <= n; i++) {
int[] arr = {i, sc.nextInt()};
list.add(arr);
}
while(list.size() > 1) {
int[] arr = list.pollFirst();
sb.append(arr[0]).append(" ");
int move = arr[1];
if(move > 0) {
for(int i = 1; i < move; i++)
list.offerLast(list.pollFirst());
}
else {
for(int i = move; i < 0; i++)
list.offerFirst(list.pollLast());
}
}
sb.append(list.poll()[0]);
System.out.println(sb.toString());
}
}
기억하자 메소-드
✅ offerFirst(), offerLast() : 큐의 처음, 큐의 마지막에 원소 추가
✅ pollFirst(), pollLast() : 큐의 처음, 큐의 마지막 요소를 제거
✅ Map.getOrDefault(Object key, V defaultValue)
key | 찾을 키 값 |
defaultValue | 키가 맵에 없을 경우 반환할 기본값 |
(예시) map.getOrDefault(c,0) + v | 키 c가 맵에 없을경우 값을 0으로 설정하고 그게 아니라면 v를 더함 |