제7회 대학생 프로그래밍 경시대회 문제 A Letter Bank

문제

문자 저장소는 새로운 단어를 만들기 위해 여러번(최소한 한번 이상) 사용된 모든 문자들로 구성된 단어이다. 예를들어 IMPS는 MISSISSIPPI의 문자 저장소이다. a 와 b의 두 단어를 입력으로 받고, 당신은 a가 b의 문자 저장소인지 판단하는 프로그램을 작성한다. 첫번째 단어가 (문자들이) 반복된 단어가 아니라고 가정해라. 모든 단어들은 오직 대문자들만 포함한다.(A, B, …, Z, 공백 없음)

입력

프로그램은 표준 입력으로부터 입력받는다. 입력은 T(1 ≤ T ≤ 20) 개의 테스트 조건을 갖는다. 테스트 조건의 개수인 T는 입력의 첫번째 줄에 주어진다. 각각의 테스트 조건들은 한줄에 두 단어가 주어진다. 첫번째 단어와 두번째 단어 사이에는 하나의 공백이 존재한다. 그리고 각 단어는 최대 80글자를 가진다.

출력

프로그램은 표준 출력으로 출력한다. 각 테스트 조건은 정확히 한줄에 하나씩 출력해라. 각 테스트 조건에 대해, 만약 첫번째 단어가 두번째 단어의 저장소이면 YES, 그렇지 않으면 NO를 출력해라.

소스코드

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
import java.util.Scanner;
public class LetterBank {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int T = scan.nextInt(); // 테스트 케이스 개수
for(int i = 0; i < T; i++) {
String a = scan.next(); // 첫번째 단어
String b = scan.next(); // 두번째 단어
process(a, b);
}
}
public static void process(String bank, String word) {
if(isBank(bank, word)) {
System.out.println("YES");
}
else {
System.out.println("NO");
}
}
public static boolean isBank(String bank, String word) {
boolean[] alpha = new boolean[26];
// word에 나온 글자에 다 체크한다.
for(int i = 0 ; i < word.length(); i++) {
alpha[word.charAt(i) - 'A'] = true;
}
// bank의 글자에 체크 반전시킨다.
for(int i = 0; i < bank.length(); i++) {
alpha[bank.charAt(i) - 'A'] = !alpha[bank.charAt(i) - 'A'];
}
// 모두 처음의 값이면 성공한 것이다.
for(int i = 0 ; i < alpha.length; i++) {
if(alpha[i]) {
return false;
}
}
return true;
}
}

주절주절

중복한 문자들을 어떻게 처리할 수 있을까 생각하던중… 배열을 이용하기로 하였다. 괜찮은 판단이었던 것 같다. ㅋㅋ

Share Comments