내가 생각했을때 문제에서 원하는부분
첫 번째 줄에 자릿수 N이 주어진다. (1 ≤ N ≤ 10^6)
두 번째 줄에 자연수 K가 주어진다. (1 ≤ K)
양의 정수 K가 0으로 시작하는 경우는 주어지지 않는다.
첫 번째 줄에 주어진 자연수가 짝짝수면 0, 홀홀수면 1, 둘 다 아니라면 -1을 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
표준 입력(System.in)으로부터 데이터를 읽기 위한 BufferedReader 객체를 생성한다.
이를 통해 사용자 입력을 효율적으로 받을 수 있다.
int N = Integer.parseInt(br.readLine());
첫 번째 줄에서 N 값을 읽어온다.
br.readLine()은 한 줄을 문자열로 읽어오고, Integer.parseInt()는 이 문자열을 정수형으로 변환한다.
문제에서 N은 K의 자릿수를 의미하지만, K를 문자열로 처리하면 K.length()로 자릿수를 알 수 있어 N이 필수적이지 않을 수도 있다.
하지만 문제 조건에 N이 주어진다고 명시되어 있으므로, 읽어두는 것이 좋다.
String K = br.readLine();
두 번째 줄에서 자연수 K를 문자열 형태로 읽어온다.
K가 최대 100만 자릿수까지 올 수 있으므로 int나 long 같은 숫자 자료형으로는 저장할 수 없고, 반드시 String으로 처리해야 한다.
int evenCount = 0; int oddCount = 0;
K의 각 자릿수를 확인하면서 짝수의 개수를 세어 저장할 evenCount 변수와 홀수의 개수를 세어 저장할 oddCount 변수를 각각 0으로 초기화한다.
for (int i = 0; i < N; i++) { ... }
이 for 반복문은 K 문자열의 첫 번째 자릿수부터 마지막 자릿수까지 하나씩 순회하며 처리하기 위한 것이다.
K.charAt(i)를 사용해 i번째 자릿수에 해당하는 문자를 가져온다.
반복은 N번, 즉 K의 자릿수만큼 실행된다.
int digit = K.charAt(i) - '0';
K.charAt(i)는 i번째 위치에 있는 문자를 반환한다.
예를 들어, '1' 같은 문자이다.
이 문자를 실제 숫자 값(정수 1)으로 변환하기 위해 '0' 문자의 아스키 코드 값을 빼준다.
예: '5' - '0'은 53 - 48 = 5가 된다.
이렇게 변환된 digit은 해당 자릿수의 실제 숫자 값(0부터 9까지)을 가지게 된다.
if (digit % 2 == 0) { ... } else { ... }
변환된 숫자 digit이 짝수인지 홀수인지 판별하는 조건문이다.
% 연산자는 나머지를 구합니다. digit % 2의 결과가 0이면 digit은 짝수이다 (예: 2, 4, 6, 8, 그리고 문제에서 특별히 짝수로 간주하는 0).
나머지가 0이면 evenCount를 1 증가시키고, 그렇지 않으면 (나머지가 1이면) oddCount를 1 증가시킨다.
if (evenCount > oddCount) { ... } else if (oddCount > evenCount) { ... } else { ... }
모든 자릿수에 대한 홀짝 판별 및 개수 세기가 끝나면, evenCount와 oddCount의 값을 비교하여 최종 결과를 판별한다.
evenCount가 oddCount보다 크면 0을 출력 (짝짝수).
oddCount가 evenCount보다 크면 1을 출력 (홀홀수).
두 개수가 같으면 -1을 출력 (둘 다 아님).
br.close();
BufferedReader 사용이 끝났으므로, 열려있던 스트림 자원을 닫아준다.
코드로 구현
package baekjoon.baekjoon_30;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 31867번 문제
public class Main1148 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// N은 자릿수 K의 길이이므로, K를 문자열로 받으면 N은 K.length()로 알 수 있어 굳이 N을 별도로 읽을 필요는 없습니다.
// 하지만 문제에 N이 입력으로 주어진다고 되어 있으니, 읽어두는 것이 좋습니다.
int N = Integer.parseInt(br.readLine()); // 첫 번째 줄에서 N을 읽습니다.
String K = br.readLine(); // 두 번째 줄에서 K를 문자열로 읽습니다.
int evenCount = 0; // 짝수 자릿수 개수를 저장할 변수
int oddCount = 0; // 홀수 자릿수 개수를 저장할 변수
// K의 각 자릿수를 순회하며 홀짝을 판별합니다.
for(int i = 0; i < N; i++) {
// 현재 자릿수 문자를 숫자로 변환합니다. (char에서 int로)
// '0' 문자를 빼면 해당 숫자의 실제 int 값을 얻을 수 있습니다.
int digit = K.charAt(i) - '0';
// 숫자가 짝수인지 홀수인지 판별합니다.
// 0도 짝수로 간주합니다.
if(digit % 2 == 0) {
evenCount++; // 짝수 자릿수 카운트 증가
} else {
oddCount++; // 홀수 자릿수 카운트 증가
}
}
// 짝수 개수와 홀수 개수를 비교하여 결과 출력
if(evenCount > oddCount) {
System.out.println(0); // 짝짝수
} else if(oddCount > evenCount) {
System.out.println(1); // 홀홀수
} else {
System.out.println(-1); // 둘 다 아님
}
br.close(); // BufferedReader를 닫습니다.
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.