link : https://www.acmicpc.net/problem/2346
풍선 터뜨리기 성공
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 4 MB | 1912 | 716 | 582 | 41.189% |
문제
N개의 풍선이 있다. 각 풍선 안에는 -N부터 N까지의 수가 적혀있는 종이가 들어 있다. 이 풍선들을 다음과 같은 규칙으로 터뜨린다.
우선, 제일 처음에는 1번 풍선을 터뜨린다. 다음에는 풍선 안에 있는 종이를 꺼내어 그 종이에 적혀있는 값만큼 이동하여 다음 풍선을 터뜨린다. 양수가 적혀 있을 경우에는 오른쪽으로, 음수가 적혀 있을 때는 왼쪽으로 이동한다. 풍선은 원형으로 놓여 있다고 생각한다. 즉, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선이 있는 것이다. 이동할 때에는 이미 터진 풍선은 빼고 생각한다.
예를 들어 다섯 개의 풍선 안에 차례로 3, 2, 1, -3, -1이 적혀 있었다고 하자. 이 경우 3이 적혀 있는 1번 풍선, -3이 적혀 있는 4번 풍선, -1이 적혀 있는 5번 풍선, 1이 적혀 있는 3번 풍선, 2가 적혀 있는 2번 풍선의 순서대로 터지게 된다.
입력
첫째 줄에 자연수 N(1≤N≤1,000)이 주어진다. 다음 줄에는 차례로 각 풍선 안의 종이에 적혀 있는 수가 주어진다. 편의상 0은 적혀있지 않다고 가정하자.
출력
첫째 줄에 터진 풍선의 번호를 차례로 나열한다.
예제 입력 1
5 3 2 1 -3 -1
예제 출력 1
1 4 5 3 2
원형 이중 연결리스트를 공부하면서 해결한 문제이다.
직접 STL을 구현해서 하려고하니 너무너무너무 귀찮았지만 결국 성공했다.
원리는 어렵지 않으니 패스하겠다.
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | #include<iostream> using namespace std; template <typename T> class LinkedList { private: class Node { public: T data; Node* nextNode; Node* preNode; }; void valid(int); int size; Node *Head = new Node; Node *cur; public: LinkedList(); ~LinkedList(); T get_data(int, bool); bool isEmpty(); int get_size(); void insert(T); void insert(T, int); void change(T, int); void remove(int, bool); }; template<typename T> LinkedList<T>::LinkedList() { LinkedList::Head->data = NULL; LinkedList::Head->nextNode = Head; LinkedList::Head->preNode = Head; LinkedList::cur = LinkedList::Head; LinkedList::size = 0; } template<typename T> LinkedList<T>::~LinkedList() { Node *t = LinkedList::Head; Node *de = LinkedList::Head; for (int i = 0; i < LinkedList::size; i++) { t = t->nextNode; delete de; de = t; } } template<typename T> void LinkedList<T>::valid(int Count) { if (Count > LinkedList::size) { throw "Error : 유효하지 않은 index입니다."; } } template<typename T> bool LinkedList<T>::isEmpty() { return LinkedList::size > 0 ? false : true; } template<typename T> int LinkedList<T>::get_size() { return LinkedList::size; } template<typename T> T LinkedList<T>::get_data(int index, bool dir) { Node* temp = LinkedList::cur; if (dir) { for (int i = 0; i < index; i++) { temp = temp->nextNode; } } else if (!dir) { for (int i = 0; i < index; i++) { temp = temp->preNode; } } return temp->data; } template<typename T> void LinkedList<T>::insert(T data) { Node * NewNode = new Node; NewNode->data = data; NewNode->nextNode = NewNode; NewNode->preNode = NewNode; if (LinkedList::Head->data == NULL) { LinkedList::Head = NewNode; LinkedList::cur = Head; } else { Node* temp = LinkedList::Head; for (int i = 0; i < LinkedList::size - 1; i++) { temp = temp->nextNode; } temp->nextNode = NewNode; NewNode->preNode = temp; NewNode->nextNode = LinkedList::Head; LinkedList::Head->preNode = NewNode; } LinkedList::size++; } template<typename T> void LinkedList<T>::insert(T data, int index) { Node * NewNode = new Node; NewNode->data = data; NewNode->nextNode = NewNode; NewNode->preNode = NewNode; if (LinkedList::Head->data == NULL) { LinkedList::Head = NewNode; LinkedList::cur = Head; } else if (LinkedList::Head->nextNode == LinkedList::Head) { LinkedList::Head->nextNode = NewNode; LinkedList::Head->preNode = NewNode; NewNode->nextNode = LinkedList::Head; NewNode->preNode = LinkedList::Head; } else { Node* temp = LinkedList::Head; for (int i = 0; i < index - 1; i++) { temp = temp->nextNode; } NewNode->nextNode = temp->nextNode; NewNode->preNode = temp; temp->nextNode = NewNode; } LinkedList::size++; } template<typename T> void LinkedList<T>::change(T data, int index) { Node* temp = LinkedList::Head; for (int i = 0; i < index; i++) { temp = temp->nextNode; } temp->data = data; } template<typename T> void LinkedList<T>::remove(int index, bool dir) { Node* temp = LinkedList::cur; Node* remove = LinkedList::cur; if (cur == Head && index == 0) { if (LinkedList::size == 1) { delete remove; LinkedList::size--; LinkedList::Head = NULL; return; } else { LinkedList::Head->preNode->nextNode = Head->nextNode; LinkedList::Head->nextNode->preNode = Head->preNode; LinkedList::Head = LinkedList::Head->preNode; } } else if(dir){ for (int i = 0; i < index - 1; i++) { temp = temp->nextNode; remove = remove->nextNode; } remove = remove->nextNode; temp->nextNode = remove->nextNode; remove->nextNode->preNode = temp; if (remove == LinkedList::Head) { LinkedList::Head->preNode->nextNode = Head->nextNode; LinkedList::Head->nextNode->preNode = Head->preNode; LinkedList::Head = LinkedList::Head->preNode; } } else if (!dir){ for (int i = 0; i < index; i++) { temp = temp->preNode; remove = remove->preNode; } temp = temp->preNode; temp->nextNode = remove->nextNode; remove->nextNode->preNode = temp; if (remove == LinkedList::Head) { LinkedList::Head->preNode->nextNode = Head->nextNode; LinkedList::Head->nextNode->preNode = Head->preNode; LinkedList::Head = LinkedList::Head->preNode; } } LinkedList::cur = remove->preNode; LinkedList::cur->nextNode = remove->nextNode; remove->nextNode = NULL; remove->preNode = NULL; delete remove; LinkedList::size--; } int main() { LinkedList<int> list; int N, ary[1001], num = 0, q; cin >> N; for (int i = 1; i <= N; i++) cin >> ary[i]; for (int i = 1; i <= N; i++) list.insert(i); for (int i = 0; i < N; i++) { if(num >= 0) q = list.get_data(num, true); else q = list.get_data(-(num+1), false); cout << q << " "; if(num >= 0) list.remove(num, true); else list.remove(-(num+1), false); num = ary[q]; } return 0; } | cs |
'Programming > BOJ Solutions' 카테고리의 다른 글
[백준 11404번] 플로이드 (0) | 2018.07.10 |
---|---|
[백준 13160번] 최대 클리크 구하기 (0) | 2018.07.09 |
[백준 1158번] 조세퍼스 문제 (0) | 2018.07.07 |
[백준 13163번] 닉네임에 갓 붙이기 (0) | 2018.07.04 |
[백준 13164번] 행복 유치원 (0) | 2018.07.04 |