내가 생각했을때 문제에서 원하는부분
입력은 여러 개의 비트 스트링으로 이루어져 있다.
각 비트 스트링은 한 줄로 이루어져 있고, 길이는 1~31비트이다.
또, 비트 스트링의 마지막 문자는 e 또는 o이다. (e: 짝수 패리티, o: 홀수 패리티) 마지막 줄에는 '#'이 주어진다.
입력으로 주어진 각각의 비트 스트링에 대해서, 마지막 문자를 올바른 비트로 바꾼 비트 스트링을 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 표준 입력(키보드)으로부터 데이터를 효율적으로 읽어올 수 있도록 BufferedReader 객체를 생성한다.
StringBuilder sb = new StringBuilder();: 결과 문자열을 하나하나 직접 System.out.println()으로 출력하는 대신, 모든 결과를 StringBuilder에 모아둔 후 마지막에 한 번에 출력하기 위해 사용한다.
이는 특히 출력이 많은 문제에서 성능상 이점을 제공한다.
입력 처리 및 반복 (Input Processing Loop):
String line;: 입력받은 한 줄을 저장할 변수를 선언한다.
while (!(line = br.readLine()).equals("#")): 이 부분이 핵심적인 입력 루프이다.
br.readLine(): BufferedReader를 통해 한 줄을 읽어와 line 변수에 할당한다.
line.equals("#"): 읽어온 줄이 종료 조건인 "S"와 같은지 비교한다.
!: 만약 읽어온 줄이 "S"가 아니라면 (즉, 아직 종료 조건이 아니라면) 루프를 계속 실행한다.
비트 스트링 및 패리티 분리 (Extracting Bit String and Parity):
String bitString = line.substring(0, line.length() - 1); // 마지막 문자를 제외한 부분
char parityChar = line.charAt(line.length() - 1); // 마지막 문자 (e 또는 o)
line.substring(0, line.length() - 1): 입력받은 line에서 마지막 문자('e' 또는 'o')를 제외한 비트 스트링 부분만 추출하여 bitString에 저장한다.
line.charAt(line.length() - 1): line의 마지막 문자('e' 또는 'o')를 추출하여 parityChar에 저장한다.
'1'의 개수 세기 (Counting Ones):
int countOnes = 0;: bitString 내의 '1'의 개수를 세기 위한 카운터 변수이다.
for (char bit : bitString.toCharArray()): bitString을 문자 배열로 변환하여 각 문자를 순회한다. (예: "101" -> '1', '0', '1' 순서로)
if (bit == '1') { countOnes++; }: 만약 현재 문자가 '1'이라면 countOnes를 1 증가시킨다.
마지막 비트 결정 및 결과 저장 (Determining Last Bit and Appending Result):
if (parityChar == 'e'): 원하는 패리티가 짝수(even)일 경우이다.
if (countOnes % 2 == 0): 현재 센 '1'의 개수가 짝수라면, 마지막에 '0'을 붙여도 전체 '1'의 개수는 여전히 짝수가 되므로 '0'을 추가한다.
else: 현재 센 '1'의 개수가 홀수라면, 마지막에 '1'을 붙여야 전체 '1'의 개수가 짝수가 되므로 '1'을 추가한다 (홀수 + 1 = 짝수).
else: 원하는 패리티가 홀수(odd)일 경우입니다. (parityChar는 'o'일 수밖에 없다)
if (countOnes % 2 == 0): 현재 센 '1'의 개수가 짝수라면, 마지막에 '1'을 붙여야 전체 '1'의 개수가 홀수가 되므로 '1'을 추가한다 (짝수 + 1 = 홀수).
else: 현재 센 '1'의 개수가 홀수라면, 마지막에 '0'을 붙여도 전체 '1'의 개수는 여전히 홀수가 되므로 '0'을 추가한다.
각 조건에 따라 bitString에 결정된 마지막 비트를 추가하고, 줄 바꿈 문자(\n)를 붙여 StringBuilder에 저장한다.
최종 출력 및 자원 해제 (Final Output and Resource Closure):
System.out.print(sb.toString()); // 모든 결과를 한 번에 출력
br.close(); // BufferedReader를 닫아 자원을 해제한다.
System.out.print(sb.toString());: 루프가 끝나면 StringBuilder에 저장된 모든 완성된 비트 스트링들을 한 번에 출력한다.
println 대신 print를 사용하는 이유는 sb.append('\n')으로 이미 줄 바꿈 문자를 추가했기 때문이다.
br.close();: BufferedReader 사용이 끝났으므로, 열린 자원을 닫아준다.
코드로 구현
package baekjoon.baekjoon_30;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 4597번 문제
public class Main1154 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder(); // 결과를 효율적으로 저장하기 위한 StringBuilder
String line;
// 입력이 '#'이 아닐 때까지 반복합니다.
while(!(line = br.readLine()).equals("#")) {
// 마지막 문자는 패리티 정보이므로, 이를 제외한 순수한 비트 스트링을 추출합니다.
String bitString = line.substring(0, line.length() - 1);
char parityChar = line.charAt(line.length() - 1); // 마지막 문자를 패리티 문자로 가져옵니다.
int countOnes = 0; // '1'의 개수를 세는 변수
// 비트 스트링을 순회하며 '1'의 개수를 셉니다.
for(char bit : bitString.toCharArray()) {
if(bit == '1') {
countOnes++;
}
}
// 현재 '1'의 개수와 요구되는 패리티에 따라 마지막 비트를 결정합니다.
if(parityChar == 'e') { // 짝수 패리티를 원하는 경우
if(countOnes % 2 == 0) { // 현재 '1'의 개수가 짝수이면
sb.append(bitString).append('0').append('\n'); // 마지막에 '0'을 붙여 짝수 패리티 유지
} else { // 현재 '1'의 개수가 홀수이면
sb.append(bitString).append('1').append('\n'); // 마지막에 '1'을 붙여 짝수 패리티로 만듦 (홀수+1=짝수)
}
} else { // 홀수 패리티를 원하는 경우 ('o')
if(countOnes % 2 == 0) { // 현재 '1'의 개수가 짝수이면
sb.append(bitString).append('1').append('\n'); // 마지막에 '1'을 붙여 홀수 패리티로 만듦 (짝수+1=홀수)
} else { // 현재 '1'의 개수가 홀수이면
sb.append(bitString).append('0').append('\n'); // 마지막에 '0'을 붙여 홀수 패리티 유지
}
}
}
System.out.print(sb.toString()); // 모든 결과를 한 번에 출력
br.close(); // BufferedReader를 닫아 자원을 해제합니다.
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.