
내가 생각했을때 문제에서 원하는부분
첫 번째 줄에 알파벳 소문자로 이루어진 산지니의 아이디 S가 주어진다. (1 ≤ |S| ≤ 100)
두 번째 줄에 알파벳 소문자로 이루어진 출력해야 할 문자열 T가 주어진다. (1 ≤ |T| ≤ 10000)
출력해야 할 문자열에는 산지니의 아이디에 포함되지 않은 문자가 적어도 하나 존재한다.
출력해야 할 문자열 중 산지니의 아이디에 들어있는 문자를 제거하고 남은 문자열을 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader는 대량의 텍스트 데이터를 효율적으로 읽을 수 있도록 도와주는 클래스이다.
System.in (표준 입력, 즉 키보드)에서 바이트 스트림을 InputStreamReader를 통해 문자 스트림으로 변환한 후, 이를 BufferedReader가 받아들여 사용한다.
입력 문자열 읽기:
String s = br.readLine();
String t = br.readLine();
br.readLine() 메서드를 두 번 호출하여 첫 번째 줄에서 산지니의 아이디 S를 읽어 s 변수에 저장하고, 두 번째 줄에서 출력해야 할 문자열 T를 읽어 t 변수에 저장한다.
charToRemove 배열 생성:
boolean[] charToRemove = new boolean[26];
boolean 타입의 배열 charToRemove를 크기 26으로 생성한다.
이 배열은 'a'부터 'z'까지 26개의 알파벳 소문자 각각에 대해, 해당 문자가 산지니의 아이디 s에 포함되어 있는지 여부를 저장하는 용도로 사용된다.
기본값은 모두 false이다.
charToRemove[0]은 'a', charToRemove[1]은 'b', ..., charToRemove[25]는 'z'에 해당한다.
산지니 아이디에 포함된 문자 표시:
산지니의 아이디 s를 toCharArray()를 통해 개별 문자 배열로 변환한 후, 각 문자를 순회한다.
c - 'a' 연산을 통해 현재 문자가 알파벳 순서상 몇 번째 문자인지 인덱스로 변환한다. (예: 'a'는 0, 'b'는 1)
해당 인덱스에 해당하는 charToRemove 배열의 값을 true로 설정하여, 이 문자가 산지니의 아이디에 포함되어 있음을 표시한다.
이 과정을 통해 나중에 t 문자열을 검사할 때, 어떤 문자를 제거해야 할지 빠르게 알 수 있다.
StringBuilder 초기화:
StringBuilder sb = new StringBuilder();
최종 결과 문자열을 만들기 위해 StringBuilder 객체 sb를 생성한다.
String 객체는 한 번 생성되면 내용이 변경될 수 없지만, StringBuilder는 내용을 추가하거나 수정할 수 있어서 문자열을 반복적으로 연결하는 작업에서 훨씬 효율적이다.
t에서 문자 제거 및 추가:
출력해야 할 문자열 t를 문자 배열로 변환한 후, 각 문자를 순회한다.
if(!charToRemove[c - 'a']): 현재 문자의 인덱스(c - 'a')에 해당하는 charToRemove 배열의 값이 false인지 확인한다.
false라는 것은 이 문자가 산지니 아이디 s에 포함되어 있지 않다는 의미이다.
만약 s에 포함되어 있지 않은 문자라면, sb.append(c)를 사용하여 StringBuilder sb에 해당 문자를 추가한다.
이렇게 하여 산지니 아이디에 있는 문자는 걸러지고, 없는 문자만 최종 결과에 포함된다.
결과 출력:
System.out.println(sb.toString());
모든 t의 문자를 검사하고 필요한 문자를 sb에 추가한 후, sb.toString()을 호출하여 StringBuilder에 저장된 내용을 String으로 변환하여 최종 결과를 콘솔에 출력한다.
BufferedReader 닫기:
br.close(); 사용을 마친 BufferedReader 자원을 닫아준다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 33845번 문제
public class Main1253 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 1. 산지니의 아이디 S를 읽어들입니다.
String s = br.readLine();
// 2. 출력해야 할 문자열 T를 읽어들입니다.
String t = br.readLine();
// 3. 산지니 아이디에 포함된 문자를 빠르게 확인하기 위한 boolean 배열을 생성합니다.
// 알파벳 소문자는 'a'부터 'z'까지 26개이므로 크기 26의 배열을 사용합니다.
// charToRemove[0]은 'a'를 의미하고, charToRemove[25]는 'z'를 의미합니다.
boolean[] charToRemove = new boolean[26]; // 기본값은 false
// 4. 산지니 아이디 S에 있는 모든 문자를 charToRemove 배열에 표시합니다.
for (char c : s.toCharArray()) {
charToRemove[c - 'a'] = true; // 해당 문자가 S에 있음을 표시 (true)
}
// 5. 결과 문자열을 효율적으로 만들기 위해 StringBuilder를 사용합니다.
StringBuilder sb = new StringBuilder();
// 6. 출력해야 할 문자열 T의 각 문자를 순회합니다.
for (char c : t.toCharArray()) {
// 7. 현재 문자가 charToRemove 배열에 표시되어 있지 않다면 (즉, S에 포함되지 않은 문자라면)
if (!charToRemove[c - 'a']) {
// 8. 결과 StringBuilder에 추가합니다.
sb.append(c);
}
}
// 9. 최종 결과 문자열을 출력합니다.
System.out.println(sb.toString());
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.