문제 링크 : https://www.acmicpc.net/problem/30034
문제만 봤을 때는 그렇게 어려워보이는 문제가 아니였다.
단순히 기존 문자열에서 구분자와 병합자를 골라 구분자라면 구분지어주고, 병합자라면 그대로 두면 되는 문제였는데 생각보다 구현하는 부분에서 어려웠다.
나는 Set 으로 문제를 풀었다.
맨 처음 문자 구분자를 set에 넣어주고 숫자 구분자 역시 set에 넣어준다.
병합자는 ch 라는 변수에 저장해준다.
그리고 set에 있는 구분자 중 병합자에 해당하는게 있다면 삭제시켜준다.
최종적으로 기존 문자열에서 구분자에 해당하는게 있다면 제외하고 구분자가 아닌 문자만 sb 라는 변수에 추가해준다.
그리고 구분자에 해당하는 부분에서 한 줄 내림은 한번만 진행이 되어야한다.
예로들어
문자 구분자 : b c d
숫자 구분자 : 1
병합자 : e
기존 문자열 : abcde1
입력이 주어질 경우
출력형식
a
e
되어야 한다는 의미이다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
HashSet<Character> set = new HashSet<>();
StringTokenizer st = new StringTokenizer(br.readLine());
while(n --> 0) { // n이 0이 될 때까지 반복
set.add(st.nextToken().charAt(0)); // 문자 구분자 저장
}
int m = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
while (m --> 0) {
set.add(st.nextToken().charAt(0)); // 숫자 구분자 저장
}
int k = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
while (k --> 0) {
char ch = st.nextToken().charAt(0); // 병합자 저장
if (set.contains(ch)) { // set(구분자) 중 병합자와 같은게 있다면 제거
set.remove(ch);
}
}
br.readLine();
boolean flag = false;
StringBuilder sb = new StringBuilder();
for (char c : br.readLine().toCharArray()) { // 기존 문자열 반복
if (set.contains(c) || c == ' ') { // 구분자이거나 공백이라면
if (flag) { // flag 가 true 인 경우만
sb.append("\n"); // 한 줄 내림 진행.
flag = false;
}
continue;
}
sb.append(c);
flag = true;
}
System.out.println(sb);
}
}