내가 생각했을때 문제에서 원하는부분
첫째 줄에 직사각형 빙고판의 크기를 뜻하는 n(1 ≤ n ≤ 500)과 m(1 ≤ m ≤ 500)이 주어진다.
다음 줄부터 n개의 줄에 걸쳐 각 줄마다 m개의 숫자들이 주어진다.
이는 크기가 n×m인 짝꿍의 빙고판의 상태를 나타내며, 빙고판에는 10,000 이하의 음이 아닌 정수가 적힌다.
준오가 몇 대 맞아야 하는지 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader와 StringTokenizer를 사용하여 입력값을 효율적으로 읽어온다.
n과 m은 빙고판의 크기를 나타낸다.
board[n][m]는 빙고판의 각 숫자를 저장하지만, 이 문제에서는 숫자 자체보다는 숫자에 포함된 '9'의 개수만 중요하므로, 실제로 board 배열을 저장하지 않고 바로 9의 개수를 카운트해도 무방하다. (현재 코드는 저장하고 있지만, 효율성을 위해 생략 가능하다.)
totalNineCount: 빙고판에 있는 모든 9의 총 개수를 기록한다.
rowNineCounts[i]: i번째 행에 있는 9의 개수를 저장한다.
colNineCounts[j]: j번째 열에 있는 9의 개수를 저장한다.
이중 for 문을 사용하여 n행 m열의 빙고판 모든 숫자를 하나씩 처리한다.
각 숫자를 String.valueOf(num)을 통해 문자열로 변환한다.
이는 숫자 안에 여러 개의 9가 있을 수 있기 때문이다(예: 99).
변환된 문자열의 각 문자를 확인하여 '9'가 있을 경우, totalNineCount, 해당 rowNineCounts[i], 해당 colNineCounts[j]를 모두 1씩 증가시킨다.
이 부분은 10000 이하의 음이 아닌 정수라는 조건이 있기 때문에 중요하다.
예를 들어 99라는 숫자는 9가 2번 포함된 것으로 세어야 한다.
minRemainingNine 변수를 totalNineCount로 초기화한다.
이는 어떠한 행이나 열도 제거하지 않았을 때의 9의 개수이며, 이것보다 더 많아질 수는 없으므로 합리적인 초기값이다.
첫 번째 for 문에서는 각 행(i)을 제거하는 경우를 생각해야한다.
전체 9의 개수(totalNineCount)에서 해당 행의 9의 개수(rowNineCounts[i])를 빼면, 그 행을 부쉈을 때 빙고판에 남는 9의 개수를 알 수 있다.
이 값을 minRemainingNine과 비교하여 더 작은 값으로 업데이트해준다.
두 번째 for 문은 각 열(j)을 제거하는 경우에 대해 동일한 작업을 수행하여 minRemainingNine을 업데이트한다.
모든 경우를 고려하여 얻은 minRemainingNine 값을 출력한다.
br.close();: 사용이 끝난 BufferedReader 객체를 닫아 자원을 해제한다.
코드로 구현
package baekjoon.baekjoon_30;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 14647번 문제
public class Main1162 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 행의 수
int m = Integer.parseInt(st.nextToken()); // 열의 수
int[][] board = new int[n][m]; // 빙고판
int totalNineCount = 0; // 전체 9의 개수
int[] rowNineCounts = new int[n]; // 각 행의 9의 개수를 저장
int[] colNineCounts = new int[m]; // 각 열의 9의 개수를 저장
// 빙고판 입력 받기 및 9의 개수 카운트
for(int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j < m; j++) {
int num = Integer.parseInt(st.nextToken());
board[i][j] = num;
// 숫자에 9가 몇 번 등장하는지 확인
// 예를 들어, 99는 9가 2번 등장
String sNum = String.valueOf(num);
for(char c : sNum.toCharArray()) {
if(c == '9') {
totalNineCount++;
rowNineCounts[i]++;
colNineCounts[j]++;
}
}
}
}
// 최소로 남는 9의 개수 계산
// 초기값은 최대 가능한 값 (전체 9의 개수)으로 설정
int minRemainingNine = totalNineCount;
// 각 행을 제거했을 때 남는 9의 개수 확인
for(int i = 0; i < n; i++) {
int remaining = totalNineCount - rowNineCounts[i];
if(remaining < minRemainingNine) {
minRemainingNine = remaining;
}
}
// 각 열을 제거했을 때 남는 9의 개수 확인
for(int j = 0; j < m; j++) {
int remaining = totalNineCount - colNineCounts[j];
if (remaining < minRemainingNine) {
minRemainingNine = remaining;
}
}
System.out.println(minRemainingNine);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.