[Java] SWEA / 사칙연산 유효성검사 / 1233번

정현명·2022년 2월 10일
0

SW Expert Academy

목록 보기
6/16
post-thumbnail

[Java] SWEA / 사칙연산 유효성검사 / 1233번

문제

사칙연산 유효성검사 문제 링크

문제의 저작권은 SW Expert Academy에 있습니다

입력

각 테스트 케이스의 첫 줄에는 각 케이스의 트리가 갖는 정점의 총 수 N(1≤N≤200)이 주어진다.

그 다음 N줄에 걸쳐 각각의 정점 정보가 주어진다.

해당 정점에 대한 정보는 해당 정점의 알파벳, 해당 정점의 왼쪽 자식, 오른쪽 자식의 정점번호가 차례대로 주어진다.

정점 번호는 1부터 N까지의 정수로 구분된다. 입력에서 정점 번호를 매기는 규칙은 위와 같으며, 루트 정점의 번호는 반드시 1이다.

입력에서 이웃한 숫자 또는 연산자, 자식 정점의 번호는 모두 공백으로 구분된다.

위의 예시에서, 숫자 8이 4번 정점에 해당하면 “4 8”으로 주어지고, 연산자 ‘/’가 2번 정점에 해당하면 두 자식이 각각 숫자 ‘8’인 4번 정점과 숫자 ‘2’인 5번 정점이므로 “2 / 4 5”로 주어진다.

총 10개의 테스트 케이스가 주어진다.

171
1 - 2 3
2 - 4 5
3 + 6 7
4 / 8 9
5 - 10 11
6 + 12 13
7 - 14 15
8 - 16 17
9 * 18 19
10 7 20 21
11 * 22 23
12 - 24 25
13 * 26 27
14 / 28 29
15 + 30 31
16 - 32 33
17 / 34 35
18 * 36 37
19 * 38 39
20 3 40 41
21 + 42 43
22 - 44 45
23 / 46 47
24 * 48 49
25 * 50 51
26 / 52 53
27 - 54 55
28 - 56 57
29 + 58 59
30 / 60 61
31 / 62 63
32 * 64 65
33 / 66 67
34 / 68 69
35 - 70 71
36 / 72 73
37 + 74 75
38 - 76 77
39 * 78 79
40 + 80 81
41 2 82 83
42 * 84 85
43 / 86 87
44 - 88 89
45 - 90 91
46 - 92 93
47 * 94 95
48 / 96 97
49 * 98 99
50 + 100 101
51 * 102 103
52 + 104 105
53 * 106 107
54 / 108 109
55 * 110 111
56 - 112 113
57 / 114 115
58 * 116 117
59 - 118 119
60 * 120 121
61 * 122 123
62 * 124 125
63 * 126 127
64 + 128 129
65 - 130 131
........


출력

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 정답을 출력한다.

#1 0
#2 0
.......


접근 방식

  1. 리프노드인 노드와 리프노드가 아닌 노드로 나눈다
  2. 각각을 구별하는 방법은 입력받은 각 줄에서 자식 노드가 있는지로 확인한다
  3. 리프노드가 아니면서 숫자를 가지거나 리프노드이면서 연산자를 가진 경우 연산을 할 수 없는 상황이기 때문에 나머지 줄을 넘기고 0을 출력한다


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution_1233_정현명 {

	public static void main(String[] args) throws IOException{
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		for(int tc=1;tc<=10;tc++) {
			
			int n = Integer.parseInt(br.readLine());
			int answer = 1;
			
			for(int node=1;node<=n;node++) {
				// 한줄을 nodeInfo에 저장 
				String[] nodeInfo = br.readLine().split(" ");
				
				// 리프노드가 아니면서 값이 숫자이거나 , 리프노드이면서 연산자일 경우 탈출
				if(nodeInfo.length>=3 && nodeInfo[1].charAt(0) >='0' || nodeInfo.length==2 && nodeInfo[1].charAt(0)<'0') {
					// 나머지 줄을 할당하지 않고 버림
					for(int i=node+1;i<=n;i++) {
						br.readLine();
					}
					answer = 0;
					break;
				}
				
			}
			sb.append("#").append(tc).append(" ").append(answer).append("\n");
		}
		System.out.println(sb);
	}

}
profile
꾸준함, 책임감

0개의 댓글