[Java] 백준 30034 Slice String

rse·2023년 9월 20일
0

알고리즘

목록 보기
37/44

문제 링크 : 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);
    }
}
profile
기록을 합시다

0개의 댓글