[Java] 백준(실버-5) 11723번 - 집합
문제 풀이
이번 문제는 문제의 요구사항대로 구현만 잘 하면 풀 수 있는 문제이다.
아이디어 도출
연산마다 문자열이 주어지는데, 공백을 기준으로 첫번째 문자열은 명령, 두번째 문자열은 명령을 수행할 수가 된다. 명령이 add, remove, check, toggle, all, empty 일 때마다 다른 연산을 수행해야 하는데, 그 중 check 명령일 때만 출력을 수행한다.
명령마다 수행해야 할 내용은 다음과 같다. 참고로 필자는 문제에서 말하는 공집합 S를 ArrayList로 정의하고 풀었다.
- add: 리스트 S에 x가 존재하지 않는다면, x를 삽입한다.
- remove: 리스트 S에 x가 존재한다면, x를 제거한다.
- check: 리스트 S에 x가 존재한다면 “1”을, 아니라면 “0”을 출력한다.
- toggle: 리스트 S에 x가 존재한다면, x를 제거하고, 아니라면 x를 삽입한다.
- all: 리스트 S를 비운 뒤, S의 원소를 1~20까지의 수로 다시 채운다.
- empty: 리스트 S를 비운다.
ArrayList를 공집합으로 두고 연산을 수행하면 되니 간단하다.
다만, 유의할 점은 모든 명령이 “명령 x”로 들어오는게 아니다.
all
이나empty
의 경우 x가 없는 공백없는 문자열로 들어오게 되니 x가 항상 입력으로 주어지는 것으로 판단하면 안된다.
문제 풀이를 위해 작성한 코드는 아래와 같다.
작성코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int M = Integer.parseInt(br.readLine());
ArrayList<Integer> S = new ArrayList<>();
for(int i=0; i<M; i++) {
String[] input = br.readLine().split(" ");
String cmd = input[0];
int x = 0;
if(input.length > 1) {
x = Integer.parseInt(input[1]);
}
switch(cmd) {
case "add":
if(!S.contains(x)) S.add(x);
break;
case "remove":
if(S.contains(x)) S.remove(S.indexOf(x));
break;
case "check":
if(S.contains(x)) bw.write("1"+"\n");
else if(!S.contains(x)) bw.write("0"+"\n");
break;
case "toggle":
if(S.contains(x)) S.remove(S.indexOf(x));
else if(!S.contains(x)) S.add(x);
break;
case "all":
S.clear();
for(int j=1; j<=20; j++) {
S.add(j);
}
break;
case "empty":
S.clear();
break;
default:
break;
}
}
bw.close();
br.close();
}
}
출처
- 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.