๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

 

16637๋ฒˆ: ๊ด„ํ˜ธ ์ถ”๊ฐ€ํ•˜๊ธฐ

๊ธธ์ด๊ฐ€ N์ธ ์ˆ˜์‹์ด ์žˆ๋‹ค. ์ˆ˜์‹์€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 9๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์™€ ์—ฐ์‚ฐ์ž(+, -, ×)๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„๋Š” ๋ชจ๋‘ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆ˜์‹์„ ๊ณ„์‚ฐํ•  ๋•Œ๋Š” ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ˆœ

www.acmicpc.net


1. ๋ฌธ์ œ์š”์•ฝ

๊ธธ์ด๊ฐ€ N์ธ ์ˆ˜์‹์—์„œ ์ˆซ์ž 2๊ฐœ, ์—ฐ์‚ฐ์ž 1๊ฐœ๋งŒ ๊ด„ํ˜ธ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๊ณ , ๊ด„ํ˜ธ๋Š” ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ ์ค‘ ์ตœ๋Œ€๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์—ฌ๊ธฐ์„œ, N์€ ํ•ญ์ƒ ํ™€์ˆ˜์ด๋ฉฐ, ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

 

2. ํ’€์ด

๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•œ ํ›„, ๋งค๋ฒˆ ์ตœ๋Œ€๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

๋ชจ๋“  ๊ฒฝ์šฐ๋ผํ•จ์€,

์ง€๊ธˆ ์œ„์น˜์—์„œ ๊ด„ํ˜ธ๋ฅผ ๋ฌถ์ง€ ์•Š๊ณ  ์‹์˜ ๋๊นŒ์ง€ ๊ณ„์‚ฐํ–ˆ์„ ๊ฒฝ์šฐ,

์ง€๊ธˆ ์œ„์น˜์—์„œ ๊ด„ํ˜ธ๋ฅผ ๋ฌถ๊ณ  ์‹์˜ ๋๊นŒ์ง€ ๊ณ„์‚ฐํ–ˆ์„ ๊ฒฝ์šฐ์ด๋‹ค. 

 

1. N์€ ํ™€์ˆ˜ ๊ณ ์ •์ด๋ฏ€๋กœ ์ˆ˜์‹์˜ ์ง์ˆ˜์ž๋ฆฌ์—๋Š” ์ˆซ์ž, ํ™€์ˆ˜์ž๋ฆฌ์—๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฌด์กฐ๊ฑด ์˜ฌ ๊ฒƒ์ด๋‹ค.

์ง์ˆ˜์ž๋ฆฌ๋ฉด ์ˆซ์ž ArrayList, ํ™€์ˆ˜์ž๋ฆฌ๋ฉด ์—ฐ์‚ฐ์ž ArrayList์— ๊ฐ๊ฐ ๋„ฃ์–ด์คฌ๋‹ค.

 

2. ๋˜, ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ์—†์ด ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ณ„์‚ฐํ•˜๋ฏ€๋กœ calc ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ค˜์„œ ์—ฐ์‚ฐ์ž, ์–‘ ์˜† ์ˆซ์ž๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ calc ์•ˆ์—์„œ ์—ฐ์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ returnํ–ˆ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ ์ธ๋ฑ์Šค์ด๋‹ค. ์—ฌ๊ธฐ์„œ ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ,

๋งจ ์ฒ˜์Œ sum์€ ๋งจ ์•ž ์ˆซ์ž๋กœ ๋„ฃ์–ด์ฃผ๊ณ  ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ๋Ÿผ ๋งจ ์•ž ์ˆซ์ž๋Š” ๊ด„ํ˜ธ๋ฅผ ์น  ์ˆ˜ ์—†์ง€ ์•Š์„๊นŒ?๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ,

์ด๊ฑด ๊ณ ๋ คํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค.

์–ด์ฐจํ”ผ ์—ฐ์‚ฐ์€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์‹œ์ž‘์ด๋‹ค. ๊ด„ํ˜ธ๋ฅผ ๋ฌถ์ง€ ์•Š๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๋งจ ์ฒ˜์Œ ์ˆซ์ž์™€ ๊ทธ ๋‹ค์Œ ์ˆซ์ž๊ฐ€ ๊ณ„์‚ฐ๋œ๋‹ค.

์ฆ‰, ์ด ๋‘˜์„ ๊ด„ํ˜ธ๋กœ ๋ฌถ์€๊ฑฐ๋‚˜ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. 

 

3. ๊ด„ํ˜ธ ์•ˆํ–ˆ์„ ๊ฒฝ์šฐ ์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ, ๊ด„ํ˜ธ ํ–ˆ์„ ๊ฒฝ์šฐ ์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

๊ธฐ์ €์กฐ๊ฑด์€ ์ง€๊ธˆ ์ˆซ์ž/์—ฐ์‚ฐ์ž๊ฐ€ ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ”์„ ๊ฒฝ์šฐ, max ๊ฐฑ์‹  ํ›„ return ํ•ด์ฃผ์—ˆ๋‹ค.

 

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€ ์ •๋‹ต์€ 2^31๋ณด๋‹ค ์ž‘๊ณ , -2^31๋ณด๋‹ค ํฌ๋‹ค. ์ด ๋ถ€๋ถ„์ด๋‹ค.

2^31 = 2147483648 ์ด๋‹ค. ์ฆ‰, ์ตœ๋Œ€๊ฐ’์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋Š” -2147482648 < max < 2147482648

์–ด๋””์„œ ๋งŽ์ด ๋ณธ ์ˆซ์ž๋‹ค. ๋ฐ”๋กœ int ๋ฒ”์œ„์™€ ๋น„์Šทํ•˜๋‹ค.

๋‚˜๋Š” ์ฒ˜์Œ์— max = 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์คฌ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ์ถœํ•˜๋ฉด ํ•ญ์ƒ ํ‹€๋ ธ๋‹ค๊ณ  ๋–ด๋‹ค.. 

์ตœ๋Œ€๊ฐ’์œผ๋กœ -2147483647์ด ๋‚˜์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ max = 0์ด ์•„๋‹Œ max = -2147483648๋กœ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

max = Integer.MIN_VALUE; ๋กœ ํ•˜๋‹ˆ๊นŒ ๋งž์•˜๋‹ค.

 

3. ๋ฌธ์ œ์ 

์™œ ํ‹€๋ ธ๋Š”์ง€ ๊ณ ๋ฏผํ•  ๋•Œ ๋ฒ”์œ„๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”๊ฐ€.. ์‹ถ์–ด์„œ ๋ถ„๋ช… ์ € ๋ฌธ๊ตฌ๋ฅผ ๋ดค๋‹ค

'์ •๋‹ต์€ 2^31๋ณด๋‹ค ์ž‘๊ณ , -2^31๋ณด๋‹ค ํฌ๋‹ค.'

์ •๋‹ต์ด๋ผ๊ณ  ์ ํ˜€์žˆ์–ด์„œ ์ตœ๋Œ€๊ฐ’์˜ ๋ฒ”์œ„๋ผ๊ณ  ์ƒ๊ฐ๋ชปํ•˜๊ณ  ์ง€๋‚˜์ณค๋‹ค. 

ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋Š” ๋‹ค ๋งž๋Š”๋ฐ ํ‹€๋ ธ๋‹ค๊ณ  ๋œฐ ๊ฒฝ์šฐ, ๋ฒ”์œ„๋ฅผ ๋ณด๊ณ  ๋˜ ๋ณด์ž..

 

4. ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class ๊ด„ํ˜ธ์ถ”๊ฐ€ํ•˜๊ธฐ {

	static int N, max;
	static String sik;
	static List<Character> op = new ArrayList<>();
	static List<Integer> num = new ArrayList<>();

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		sik = br.readLine();
		for (int i = 0; i < sik.length(); i++) {
			if (i % 2 == 0)
				num.add(sik.charAt(i) - '0');
			else
				op.add(sik.charAt(i));
		}

		max = Integer.MIN_VALUE;
		dfs(num.get(0), 0, 1);
		System.out.println(max);
	}

	static void dfs(int sum, int opIdx, int numIdx) {
		if (numIdx >= num.size() || opIdx >= op.size()) {
			max = Math.max(max, sum);
			return;
		}

		// ๊ด„ํ˜ธX
		int res1 = calc(sum, op.get(opIdx), num.get(numIdx));
		dfs(res1, opIdx + 1, numIdx + 1);
		
		// ๊ด„ํ˜ธO
		if (numIdx+1 < num.size()) {
			int res2 = calc(sum, op.get(opIdx), calc(num.get(numIdx), op.get(opIdx + 1), num.get(numIdx + 1)));
			dfs(res2, opIdx + 2, numIdx + 2);
		}

	}

	static int calc(int num1, char oper, int num2) { // ์—ฐ์‚ฐ ์šฐ์„ ์ˆœ์œ„ ์—†์•ฐ
		switch (oper) {
		case '+':
			return num1 + num2;
		case '-':
			return num1 - num2;
		case '*':
			return num1 * num2;
		}
		return 1;
	}
}