※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts