https://www.acmicpc.net/problem/23326
23326번: 홍익 투어리스트
도현이는 홍익 투어리스트가 되어 홍익대학교를 견학하려고 한다. 홍익대학교는 $N$개의 구역이 원형으로 배치된 모습이다. $1$번 구역에서 시계 방향으로 각각 $2$번, ... , $N$번 구역이 존재하고,
www.acmicpc.net
[ 문제풀이 ]
1. set 자료구조를 활용하여 명소의 위치를 저장합니다.
2. arr배열을 만들어 해당 좌표가 명소인지 아닌지 체크합니다.
3. 1번 명령이 주어지면 명소인지 아닌지 arr배열로 체크하고, 명소라면 arr[ i ]를 0으로 바꾸고, set에서 erase 합니다. 반대의 경우 arr[ i ]를 1로 바꾸고, set에 insert 합니다.
4. 2번 명령이 주어지면 x %= N 후 현재 좌표에 x를 더해주고, 이후 좌표가 N보다 크다면 N을 빼줍니다.
5. 3번 명령이 주어지면 set이 비어있다면 -1을 출력하고, 그렇지 않다면 현재 좌표를 기준으로 lower_bound를 해주고, 그 값에 현재 좌표를 뺀 값을 출력합니다.
6. 5번에서 lower_bound의 결과가 set.end()라면 N - cur + lower_bound(0)을 출력해 줍니다.
[ 소스코드 ]
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 | #include<iostream> #include<set> using namespace std; int N, Q; int cur = 1; int arr[500001]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> Q; set<int> s; for (int i = 1; i <= N; i++) { cin >> arr[i]; if (arr[i] == 1) { s.insert(i); } } for (int i = 0; i < Q; i++) { int cmd; cin >> cmd; if (cmd == 1) { int i; cin >> i; if (arr[i] == 0) { arr[i] = 1; s.insert(i); } else { arr[i] = 0; s.erase(i); } } else if (cmd == 2) { int x; cin >> x; if (x > N) { x %= N; } cur += x; if (cur > N) { cur -= N; } } else { if (s.empty()) { cout << -1 << '\n';; } else { if (s.lower_bound(cur) == s.end()) { cout << N - cur + (*s.lower_bound(0)) << '\n';; } else { cout << (*s.lower_bound(cur)) - cur << '\n';; } } } } } | cs |
'백준' 카테고리의 다른 글
[ 백준 ] 2800번 - 괄호 제거(C++) (0) | 2023.07.22 |
---|---|
[ 백준 ] 1990번 - 소수인팰린드롬(C++) (0) | 2023.07.21 |
[ 백준 ] 21939번 - 문제 추천 시스템 Version 1 (C++) (0) | 2023.07.19 |
[ 백준 ] 15243번 - Tiling (C++) (0) | 2023.07.18 |
[ 백준 ] 4811번 - 알약 (C++) (0) | 2023.07.17 |