https://www.acmicpc.net/problem/2346
- 처음 보자마자, 이건 양방향 연결 리스트를 사용하면 되겠구나 라는 생각이 들었다.
코드
import java.io.*;
import java.util.StringTokenizer;
class Balloon {
public int index;
public int value;
public Balloon prev;
public Balloon next;
public Balloon(int index, int value) {
this.index = index;
this.value = value;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int index = 1;
Balloon head = new Balloon(index, Integer.parseInt(st.nextToken()));
Balloon current = head;
while(st.hasMoreTokens()) {
Balloon balloon = new Balloon(++index, Integer.parseInt(st.nextToken()));
balloon.prev = current;
current.next = balloon;
current = balloon;
}
// 양방향 엮어줘야함
head.prev = current;
current.next = head;
StringBuilder sb = new StringBuilder();
while (N > 0) {
sb.append(head.index).append(" ");
int move = head.value;
// 제거하기
head.prev.next = head.next;
head.next.prev = head.prev;
N--;
if (N == 0) break;
if (move > 0) {
for (int i = 0; i < move; i++) {
head = head.next;
}
} else {
for (int i = 0; i < Math.abs(move); i++) {
head = head.prev;
}
}
}
System.out.println(sb);
}
}
설명
- 양방향 연결 리스트를 사용하면 [이전, 이후]를 기억하기 때문에 arrayIndexOutOfBounds 를 피할 수 있다.!
- 구현은 간단하다.
- 기준점이 되는 head 노드를 만들어두고, 이 후로 들어오는 노드는 current 노드를 통해 이전 이후를 같이 기록하게 된다.
- 그 다음 N개의 숫자를 감소시키면서
- 노드의 인덱스를 stringbuilder에 누적시키면서
- 현재 노드의 앞 뒤를 연결시켜, 현재 노드를 제거한다.
- 그리고 이동할 값을 추출해 그만큼 앞, 뒤로 이동하면 된다. (음수, 양수)
느낀점
- 요즘 다시 풀고 있는데, 정말 잘 기억이 안 나서 힘들다.
'자료구조 & 알고리즘 관련 > 자료구조&알고리즘' 카테고리의 다른 글
Queue 2개로 Stack구현하기 (0) | 2024.02.03 |
---|---|
Stack 두개를 이용하여 Queue구현하기 (0) | 2024.02.03 |
자료구조란? (0) | 2023.12.06 |
링크드리스트 노드의 구현 (0) | 2022.11.28 |
단방향 링크드리스트 구현 (0) | 2022.11.28 |