내가 생각했을때 문제에서 원하는부분
The first line in the data file is an integer that represents the number of data sets to follow.
Each data set is a single string.
The length of the string is less than 100.
Each string only contains uppercase alphabetical letters.
Print the deduped string.
내가 이 문제를 보고 생각해본 부분
테스트 케이스 개수 읽기:
int numTestCases = Integer.parseInt(br.readLine());
br.readLine(): BufferedReader를 사용하여 입력의 첫 번째 줄(테스트 케이스의 개수)을 문자열로 읽어온다.
Integer.parseInt(): 읽어온 문자열을 정수형(int)으로 변환하여 numTestCases 변수에 저장한다.
각 테스트 케이스 처리 루프:
for (int i = 0; i < numTestCases; i++): numTestCases만큼 반복하는 루프이다.
각 반복마다 하나의 테스트 케이스(문자열)를 처리한다.
String inputString = br.readLine();: 현재 테스트 케이스에 해당하는 문자열을 한 줄씩 읽어와 inputString 변수에 저장한다.
StringBuilder dedupedString = new StringBuilder();: 중복이 제거된 결과를 효율적으로 구성하기 위해 StringBuilder 객체를 생성한다.
String 객체는 불변(immutable)이어서 문자열을 계속 수정하면 성능 저하가 발생할 수 있지만, StringBuilder는 가변(mutable)이어서 문자열 추가 및 수정에 유리하다.
중복 제거 로직:
if (inputString.length() > 0): 빈 문자열이 입력으로 들어올 수 있으므로, 길이가 0보다 큰 경우에만 중복 제거 로직을 실행하도록 조건을 추가한다.
dedupedString.append(inputString.charAt(0));: 입력 문자열의 첫 번째 문자는 비교 대상이 없으므로 무조건 dedupedString에 추가한다.
이것이 초기 기준이 된다.
for (int j = 1; j < inputString.length(); j++): 입력 문자열의 두 번째 문자(j=1)부터 끝까지 순회한다.
첫 번째 문자는 이미 추가했기 때문이다.
inputString.charAt(j): 현재 순회 중인 문자를 가져온다.
dedupedString.charAt(dedupedString.length() - 1): dedupedString에 마지막으로 추가된 문자를 가져온다.
if (inputString.charAt(j) != dedupedString.charAt(dedupedString.length() - 1)): 현재 문자가 dedupedString의 마지막 문자와 다를 경우에만 (즉, 중복이 아닐 경우에만) 현재 문자를 dedupedString에 추가한다.
이 조건이 연속되는 중복 문자를 걸러내는 핵심 로직이다.
결과 출력 및 자원 해제:
System.out.println(dedupedString.toString());: StringBuilder에 저장된 최종 문자열을 toString() 메서드를 통해 String으로 변환한 후 콘솔에 출력한다.
각 테스트 케이스마다 결과가 한 줄씩 출력된다.
br.close();: BufferedReader 자원을 닫아준다.
코드로 구현
package baekjoon.baekjoon_30;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 5357번 문제
public class Main1140 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫 줄에서 테스트 케이스의 개수를 읽습니다.
int numTestCases = Integer.parseInt(br.readLine());
// 각 테스트 케이스를 처리합니다.
for(int i = 0; i < numTestCases; i++) {
String inputString = br.readLine(); // 한 줄씩 문자열을 읽습니다.
StringBuilder dedupedString = new StringBuilder(); // 중복이 제거된 문자열을 저장할 StringBuilder
// 문자열의 각 문자를 순회하며 중복을 제거합니다.
if(inputString.length() > 0) { // 빈 문자열이 아닌 경우에만 처리
dedupedString.append(inputString.charAt(0)); // 첫 번째 문자는 항상 추가합니다.
for(int j = 1; j < inputString.length(); j++) {
// 현재 문자가 StringBuilder에 마지막으로 추가된 문자와 다를 경우에만 추가합니다.
if(inputString.charAt(j) != dedupedString.charAt(dedupedString.length() - 1)) {
dedupedString.append(inputString.charAt(j));
}
}
}
System.out.println(dedupedString.toString()); // 결과 출력
}
br.close(); // BufferedReader 닫기
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.