[C++] 백준 2346. 풍선 터뜨리기

멋진감자·2024년 12월 8일
1

알고리즘

목록 보기
34/64
post-thumbnail

문제

풀이

덱에 넣고 이쪽 저쪽으로 돌려가면서 확인하는 문젠데
중간 중간 헷갈리는 부분들이 있어서 푸는 데 시간이 좀 걸렸다.
예를 들어 정수 a와 정수 b사이의 (a, b 포함) 정수의 개수를 세려면
b-a가 아니라 b-a+1을 해줘야 하는 것과 비슷한 류의 헷갈림이었다.

또, 풍선의 위치가 계속 바뀌는데 터지는 풍선의 인덱스 값이 필요하므로
deque<pair<int, int>> 타입으로 선언해줬다.

먼저 첫 번째 풍선 터뜨리고 그 값을 저장해뒀다가
음수인지 양수인지에 따라 애들을 뒤로 돌릴 지 앞으로 돌릴 지 결정한다.
move가 갱신되기 전까진 양수인지 항상 알고 있어야 하는데
얼마나 돌렸는지도 알아야하니 cnt라는 변수를 맹글어주고
양수면 move - 1, 음수면 move + 1 해줬다.
왜냐면 풍선 하나가 이미 터졌고 이것은 한 번 확인한 것과 같기 때문.

다른 건 다 바꿔놓고
while 문 직전에 있는 cnt 계산식을 cnt = move로 둬서 자꾸 틀렸다.

어떤 변수의 계산 방식이 바뀌었다면
다른 줄에서 사용되는 그 변수의 계산식도 수정할 것 (당연)

코드

#include <iostream>
#include <deque>
using namespace std;

int main() {
	int n, num;
	deque<pair<int, int>> dq;

	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> num;
		dq.push_back({ i, num });
	}

	int move = dq.front().second;
	dq.pop_front();
	cout << "1 ";

	int cnt = move > 0 ? move - 1 : move + 1;
	while (!dq.empty()) {
		if (move > 0) {
			if (cnt == 0) {
				cout << dq.front().first;
				if (dq.size() != 1) cout << " ";
				move = dq.front().second;
				cnt = move > 0 ? move - 1 : move + 1;
				dq.pop_front();
			}
			else {
				dq.push_back(dq.front());
				dq.pop_front();
				cnt--;
			}
		}
		else {
			if (cnt == 0) {
				cout << dq.back().first;
				if (dq.size() != 1) cout << " ";
				move = dq.back().second;
				cnt = move > 0 ? move - 1 : move + 1;
				dq.pop_back();
			}
			else {
				dq.push_front(dq.back());
				dq.pop_back();
				cnt++;
			}
		}
	}

	return 0;
}

채점

profile
난멋져

0개의 댓글