algorithm/Greedy

[C++] BOJ 15889 호 안에 수류탄이야!!

gartenhh 2022. 1. 12. 00:27

문제

백준 15889번 호 안에 수류탄이야!! https://www.acmicpc.net/problem/15889

 

15889번: 호 안에 수류탄이야!!

게임이 조용히 마무리 될 수 있으면 “권병장님, 중대장님이 찾으십니다”를, 그렇지 않으면 “엄마 나 전역 늦어질 것 같아”을 출력한다.

www.acmicpc.net

코드

#include<iostream>
#include<algorithm>
using namespace std;
int pos[30003], dist[30003];
bool visited[30003];

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) cin >> pos[i];
	if (n == 1) {
		cout << "권병장님, 중대장님이 찾으십니다";
		return 0;
	}
	for (int i = 0; i < n - 1; i++) {
		cin >> dist[i];

		int next = dist[i] + pos[i];
		int idx = i+1;
		if (next < pos[idx] && !visited[idx]) {
			cout << "엄마 나 전역 늦어질 것 같아";
			return 0;
		}
		while (next >= pos[idx]) {
			visited[idx] = true;
			idx++;
		}
	}

	if (visited[n - 1]) cout << "권병장님, 중대장님이 찾으십니다";
	else cout << "엄마 나 전역 늦어질 것 같아";

}

풀이방법

n이 1이면 자기 자신이 끝번이므로 무조건 성공한다. 그게 아니라면, for문을 돌리며 다음으로 갈 수 있는 최대위치를 계산해서 그 거리까지의 visited를 true로 바꿔준다. 다음 위치까지 가는 방법이 존재하지 않으면 실패한다. for문이 끝나고 n-1번째에 갈 수 있다면, 성공이고 아니면 실패다.

고민과정

처음에 그냥 무작정 벡터로 받아와서 sort하고 다음 사람한테 보낼 수 있는지 여부만 체크했다가 틀렸다. 여러 사람 건너서 보낼 수도 있고, 같은 위치에 여러 사람이 있을 수도 있다는 조건을 간과했다. 너무 오랜만에 알고리즘 문제를 풀었더니 뇌가 굳었나보다ㅠ

조건에 <=를 써야하는데 <를 썼다가 99%에서 실패하는 진귀한 경험도 해봤다............ㅎ 다시는 하고싶지 않은 경험이다.

그리고 비주얼스튜디오를 업데이트 안하고 그냥 돌렸더니 자꾸 말도안되는 오류가 나서 돌아버리는 줄 알았다. 놀랍게도 업데이트하고 났더니 잘만 실행됐다. 아무리 귀찮아도 업데이트는 일단 하고 보는거로,,,

dist[]배열은 굳이 안써도 될거같긴 하다. 솔직히 고치기 귀찮았다. 그리고 엄밀하게 따지면 배열 이름을 visited가 아니라 visitable로 해야하지 않을까 싶다.