๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 4466_A Smart Brain is a Tasty Brain

๋ฟŒ์•ผ._. 2025. 7. 18. 14:55
๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/4466)

< A Smart Brain is a Tasty Brain >

 

๋ฌธ์ œ ํ’€์ด 

 

Stack์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ๊ด„ํ˜ธ ์•ˆ์˜ ํ‘œํ˜„์‹์„ ๊ณ„์‚ฐํ•œ๋‹ค.

 

* ! ์—ฐ์‚ฐ ์ˆœ์„œ๋ฅผ ์กฐ์‹ฌํ•œ๋‹ค.

 

my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;

public class _4466_ { // A Smart Brain is a Tasty Brain

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		int x = Integer.parseInt(bf.readLine());

		Stack<Character> stack = new Stack<>();
		for (int i = 0; i < x; i++) {
			st = new StringTokenizer(bf.readLine());

			String str = st.nextToken();
			st.nextToken();
			char evaluation = st.nextToken().charAt(0);

			for (int j = 0; j < str.length(); j++) {
				if (str.charAt(j) != ')') {
					stack.add(str.charAt(j));
				} else {
					calc(stack);
				}
			}
			while (stack.size() > 1) {
				calc(stack);
			}

			if (stack.pop() == evaluation) {
				bw.write((i + 1) + ": Good brain\n");
			} else {
				bw.write((i + 1) + ": Bad brain\n");
			}
		}
		bw.flush();
	}

	private static void calc(Stack<Character> stack) {
		char a = stack.pop();
		while (!stack.isEmpty() && stack.peek() != '(') {
			if (stack.peek() == '!') {
				stack.pop();
				a = (a == 't') ? 'f' : 't';
			} else {
				char op = stack.pop();
				char b = stack.pop();
				while (stack.peek() == '!') {
					stack.pop();
					b = (b == 't') ? 'f' : 't';
				}

				if (op == '&') {
					a = (a == 't' && b == 't') ? 't' : 'f';
				} else {
					a = (a == 't' || b == 't') ? 't' : 'f';
				}
			}
		}
		if (!stack.isEmpty() && stack.peek() == '(') {
			stack.pop();
		}
		if (!stack.isEmpty() && stack.peek() == '!') {
			stack.pop();
			a = (a == 't') ? 'f' : 't';
		}
		stack.add(a);
	}
}
๋ณ€์ˆ˜)
x : ํ‘œํ˜„์‹ ๊ฐœ์ˆ˜
stack : Stack <Character>
str : ํ‘œํ˜„์‹
evaluation : ํ‘œํ˜„์‹ ๋‹ต

 

Main

ํ‘œํ˜„์‹ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ํ‘œํ˜„์‹ ๊ฐœ์ˆ˜๋งŒํผ ํ‘œํ˜„์‹์„ ์ž…๋ ฅ๋ฐ›์•„ ๋‹ค์Œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

1) ํ‘œํ˜„์‹๊ณผ ํ‘œํ˜„์‹ ๋‹ต์„ ๊ฐ๊ฐ str๊ณผ evaluation ๋ณ€์ˆ˜์— ์ €์žฅ

2) ํ‘œํ˜„์‹์„ ์ˆœ์ฐจ ํƒ์ƒ‰ํ•˜๋ฉฐ ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ stack์— ์ €์žฅ, ๋‹ซ๋Š” ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ calc ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ

3) stack์˜ ํฌ๊ธฐ๊ฐ€ 1๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์•„์ง ๊ณ„์‚ฐ์ด ๋‚จ์•„์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๋‹ค์‹œ calc ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ

4) stack์—์„œ pop ํ•œ ๊ฐ’์ด ํ‘œํ˜„์‹ ๋‹ต๊ณผ ์ผ์น˜ํ•˜๋‹ค๋ฉด "Good brain"์„, ์ผ์น˜ํ•˜์ง€ ์•Š๋‹ค๋ฉด "Bad brain"์„ ์ถœ๋ ฅ

 

Calc

stack์—์„œ ๊ฐ’์„ ์ œ๊ฑฐํ•˜์—ฌ ๋ณ€์ˆ˜ a์— ์ €์žฅํ•œ๋‹ค. stack์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , stack์˜ ๊ฐ’์ด ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ์•„๋‹ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

1) stack์˜ ๊ฐ’์ด !๋ผ๋ฉด NOT ์—ฐ์‚ฐ

2) stack์˜ ๊ฐ’์ด !๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด stack์—์„œ ๊ฐ’์„ 2๊ฐœ pop ํ•˜์—ฌ ๊ฐ๊ฐ op์™€ b ๋ณ€์ˆ˜์— ์ €์žฅ ํ›„ ๊ฐ ์—ฐ์‚ฐ์ž์— ๋งž๊ฒŒ ์—ฐ์‚ฐ (์ด๋•Œ, b ์•ž์—๋„ NOT ์—ฐ์‚ฐ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ™•์ธํ•œ๋‹ค.)

 

stack์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , stack์˜ ๊ฐ’์ด ์—ด๋ฆฐ ๊ด„ํ˜ธ๋ผ๋ฉด ์—ด๋ฆฐ ๊ด„ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ๊ด„ํ˜ธ ๊ณ„์‚ฐ ํ›„ ์•ž์— NOT ์—ฐ์‚ฐ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ stack์— ์ €์žฅํ•œ๋‹ค.



 

'๐ŸŒžAlgorithm > ๐Ÿ”ฅBaekjoon' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Baekjoon] 30949_Equal Schedules  (2) 2025.07.22
[Baekjoon] 9400_Calculate the Fence Needed  (3) 2025.07.21
[Baekjoon] 17585_Circuit Math  (2) 2025.07.17
[Baekjoon] 8594_Program  (0) 2025.07.16
[Baekjoon] 9523_Arithmetic with Morse  (1) 2025.07.15