Letter+Bank

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

A letter bank is a word such that all the letters of one letter bank can be used as many times as desired (at least once each) to make a new word. For example, ‘IMPS’ is a bank of ‘MISSISSIPPI.’

Given two words a and b, you are to write a program for deciding whether a is a bank of b. Assume that the first word a has no repeated letters. Every word consists only of capital Roman letters: A, B, …, Z, and no blank.

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

Your program is to read from standard input. The input consists of T (1 ≤ T ≤ 20) test cases. The number T of test case is given in the first line of the input. For each test case, two words are given in one line. There is a single space between the first word and the second word. And each word has length at most 80.

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

Your program is to write a standard output. Print exactly one line for each test case. For each test case, print “YES” if the first word is a bank of the second word. Otherwise, print “NO”.

Sample Input
4 IMPS MISSISSIPPI BLUE BLUE CUNT COCONUT IPC PC

Output for the Sample Input
YES YES NO NO

Reference


Source Code code format="java5" 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; } } code

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

