BOJ

[BOJ 4614 // C++] Linear Pachinko

measurezero 2024. 4. 28. 10:00

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

 

이번에 볼 문제는 백준 4614번 문제인 Linear Pachinko이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/4614 

 

각 문자에 공이 떨어졌을 때 어떤 확률로 밑으로 떨어질지는 각 공의 움직임을 지문에 주어진 대로 시뮬레이션하는 것으로 알아낼 수 있다. 이 과정에서 주어진 문자열의 맨 왼쪽과 맨 오른쪽에 '.'을 하나씩 추가하고 그 사이의 문자들 각각에서 시뮬레이션을 시도하면 구현을 더 편하게 할 수 있다.

 

각 문자에 공이 떨어질 확률은 균등하므로 위에서 계산한 각 확률을 이용해 문제의 답을 구하자.

 

아래는 제출한 소스코드이다.

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

int N, val;
string s;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> s;
	while (s != "#") {
		N = s.length(), val = 0;
		s = "." + s + ".";
		for (int i = 1; i <= N; i++) {
			if (s[i] == '.') val += 2;
			else if (s[i] == '/') {
				int ii = i - 1;
				while (s[ii] == '_') ii--;
				if (s[ii] == '.') val += 2;
			}
			else if (s[i] == '\\') {
				int ii = i + 1;
				while (s[ii] == '_') ii++;
				if (s[ii] == '.') val += 2;
			}
			else if (s[i] == '|') {
				int ii;
				ii = i - 1;
				while (s[ii] == '_') ii--;
				if (s[ii] == '.') val++;
				ii = i + 1;
				while (s[ii] == '_') ii++;
				if (s[ii] == '.') val++;
			}
		}

		cout << val * 100 / (N * 2) << '\n';
		cin >> s;
	}
}
728x90