※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 23326번 문제인 홍익 투어리스트이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/23326
23326번: 홍익 투어리스트
도현이는 홍익 투어리스트가 되어 홍익대학교를 견학하려고 한다. 홍익대학교는 $N$개의 구역이 원형으로 배치된 모습이다. $1$번 구역에서 시계 방향으로 각각 $2$번, ... , $N$번 구역이 존재하고,
www.acmicpc.net
stl의 set을 이용해 자료를 관리하는 것으로 간단히 해결할 수 있다. 특히 lower_bound를 사용하면 주어진 set이 담고 있는 정수 중 제시한 수 이상인 수중 가장 작은 수를 바로 얻을 수 있다.
주어진 배열이 원형배열임을 감안해 현재지점에서 시계방향으로 N번까지 살펴봤을 때 명소를 찾을 수 없다면 1번서부터 시계방향으로 명소를 찾는 시도를 하여 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <set>
using namespace std;
int N, Q, cur = 1;
set<int> st;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> Q;
for (int i = 1; i <= N; i++) {
int x; cin >> x;
if (x) st.insert(i);
}
while (Q--) {
int q; cin >> q;
if (q == 1) {
int i; cin >> i;
if (st.count(i)) st.erase(i);
else st.insert(i);
}
else if (q == 2) {
int x; cin >> x;
cur = (cur + x - 1) % N + 1;
}
else {
auto x = st.lower_bound(cur);
if (x == st.end()) x = st.lower_bound(1);
if (x == st.end()) cout << -1 << '\n';
else {
int p = *x;
if (p >= cur) cout << p - cur << '\n';
else cout << N - cur + p << '\n';
}
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 25204 // C++] 문자열 정렬 (0) | 2023.01.22 |
---|---|
[BOJ 23327 // C++] 리그전 오브 레전드 (0) | 2023.01.22 |
[BOJ 27259 // C++] Разноцветные диагонали (0) | 2023.01.21 |
[BOJ 27226 // C++] Лестница из чисел (0) | 2023.01.20 |
[BOJ 27212 // C++] 미팅 (0) | 2023.01.20 |