
내가 생각했을때 문제에서 원하는부분
편지의 내용 S(1 ≤ S 의 길이 ≤ 1,000)가 주어진다.
문자열 S는 알파벳 대문자로 이루어져 있다.
수정된 편지의 내용을 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 처리:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 표준 입력(콘솔)으로부터 데이터를 읽기 위한 BufferedReader 객체를 생성한다.
String s = br.readLine();: 사용자로부터 한 줄의 문자열(편지 내용)을 입력받아 s 변수에 저장한다.
규칙 적용 조건 확인:
boolean hasA = s.contains("A");, boolean hasB = s.contains("B");, boolean hasC = s.contains("C");: 입력받은 문자열 s에 'A', 'B', 'C' 문자가 각각 포함되어 있는지 확인하고, 그 결과를 hasA, hasB, hasC 세 개의 boolean 변수에 저장한다.
이 변수들은 편지 수정 규칙의 우선순위를 결정하는 데 사용된다.
문자열 수정 준비:
StringBuilder sb = new StringBuilder(s);: String은 한 번 생성되면 내용을 변경할 수 없다.
따라서 문자열의 내용을 효율적으로 수정하기 위해 StringBuilder 객체를 생성하고, s의 내용을 초기값으로 설정한다.
규칙에 따른 문자열 수정:
if(hasA) { ... } (1단계): 만약 문자열에 'A'가 하나라도 있다면 이 블록이 실행된다.
for(int i = 0; i < sb.length(); i++) { ... }: StringBuilder sb의 모든 문자를 순회한다.
char ch = sb.charAt(i);: 현재 순회 중인 문자를 ch에 저장한다.
if(ch == 'B' || ch == 'C' || ch == 'D' || ch == 'F') { sb.setCharAt(i, 'A'); }: 만약 현재 문자가 'B', 'C', 'D', 'F' 중 하나라면, 해당 문자를 'A'로 변경한다.
else if(hasB) { ... } (2단계): 'A'는 없지만 'B'가 있다면 이 블록이 실행된다. (1단계 조건이 false일 때만 검사)
마찬가지로 StringBuilder를 순회하며 현재 문자가 'C', 'D', 'F' 중 하나일 경우, 해당 문자를 'B'로 변경한다.
else if(hasC) { ... } (3단계): 'A'와 'B'는 없지만 'C'가 있다면 이 블록이 실행된다. (1, 2단계 조건이 false일 때만 검사)
StringBuilder를 순회하며 현재 문자가 'D', 'F' 중 하나일 경우, 해당 문자를 'C'로 변경한다.
else { ... } (4단계): 'A', 'B', 'C' 모두 없다면 이 블록이 실행된다. (모든 상위 조건이 false일 때)
StringBuilder를 순회하며 모든 문자를 'A'로 변경한다.
결과 출력 및 자원 해제:
System.out.println(sb.toString());: 모든 수정이 완료된 StringBuilder sb의 내용을 toString() 메서드를 통해 String으로 변환하여 화면에 출력한다.
br.close();: 사용한 BufferedReader 자원을 닫아 시스템 자원 누수를 방지한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 23027번 문제
public class Main1207 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
boolean hasA = s.contains("A"); // 'A' 포함 여부 확인
boolean hasB = s.contains("B"); // 'B' 포함 여부 확인
boolean hasC = s.contains("C"); // 'C' 포함 여부 확인
StringBuilder sb = new StringBuilder(s); // 문자열 수정을 위해 StringBuilder 사용
// 규칙에 따라 문자열을 수정합니다.
// 각 if-else if 블록은 상위 조건이 충족되면 아래 조건은 확인하지 않습니다.
if(hasA) {
// 1단계: 'A'가 있다면 'B', 'C', 'D', 'F'를 모두 'A'로 변경
for(int i = 0; i < sb.length(); i++) {
char ch = sb.charAt(i);
if(ch == 'B' || ch == 'C' || ch == 'D' || ch == 'F') {
sb.setCharAt(i, 'A');
}
}
} else if(hasB) {
// 2단계: 'A'는 없고 'B'가 있다면 'C', 'D', 'F'를 모두 'B'로 변경
for(int i = 0; i < sb.length(); i++) {
char ch = sb.charAt(i);
if(ch == 'C' || ch == 'D' || ch == 'F') {
sb.setCharAt(i, 'B');
}
}
} else if(hasC) {
// 3단계: 'A', 'B'는 없고 'C'가 있다면 'D', 'F'를 모두 'C'로 변경
for(int i = 0; i < sb.length(); i++) {
char ch = sb.charAt(i);
if(ch == 'D' || ch == 'F') {
sb.setCharAt(i, 'C');
}
}
} else {
// 4단계: 'A', 'B', 'C' 모두 없다면 모든 문자를 'A'로 변경
for(int i = 0; i < sb.length(); i++) {
sb.setCharAt(i, 'A');
}
}
System.out.println(sb.toString()); // 수정된 편지 내용을 출력합니다.
br.close(); // BufferedReader를 닫아줍니다.
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.