백준 풀만한문제

KIMYEONGJUN·2025년 12월 20일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫 번째 줄에 잡초의 크기 J와 자라고 있는 문제의 수 N이 공백으로 구분되어 주어진다. (1 ≤ J, N ≤ 500)
두 번째 줄부터 N개 줄에 걸쳐, 영어 대소문자와 숫자 및 공백으로 이루어진 문제들이 한 줄에 하나씩 주어진다.
문제의 길이는 1 이상 100 이하이며, 공백으로 시작되거나 끝나지 않는다.

풀만한문제의 수를 출력한다.

내가 이 문제를 보고 생각해본 부분

main 메서드 시작:
public static void main(String[] args) throws IOException은 자바 프로그램의 시작점이다. 
throws IOException은 입력 출력 작업 중 발생할 수 있는 예외(오류)를 처리하겠다는 의미이다.
BufferedReader 객체 생성:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.in은 표준 입력(키보드 입력)을 의미이다.
InputStreamReader는 바이트 단위의 System.in을 문자 단위로 읽을 수 있도록 변환해 준다.
BufferedReader는 InputStreamReader를 통해 읽은 문자를 버퍼에 저장해 두었다가 한 번에 읽어와 성능을 향상시킨다.
첫 번째 줄 입력 처리 (잡초 크기 J와 문제 수 N 읽기):
String[] firstLine = br.readLine().split(" ");
br.readLine(): 첫 번째 줄 전체를 문자열로 읽어온다 (예: "8 4").
.split(" "): 읽어온 문자열을 공백(" ")을 기준으로 나누어 String 배열 firstLine에 저장한다 (예: {"8", "4"}).
int J = Integer.parseInt(firstLine[0]);: 배열의 첫 번째 요소("8")를 정수형 J로 변환한다.
int N = Integer.parseInt(firstLine[1]);: 배열의 두 번째 요소("4")를 정수형 N으로 변환한다.
pullableProblemCount 변수 초기화:
int pullableProblemCount = 0;
이 변수는 최종적으로 풀만한 문제의 총 개수를 저장할 변수입니다. 초기에는 0으로 설정해둔다.
N개의 문제 문자열 반복 처리(for 루프):
for(int i = 0; i < N; i++) { ... }
N은 총 문제의 수이므로, 이 루프는 N번 반복하면서 각 문제 문자열을 하나씩 처리한다.
각 문제 문자열 처리:
String problem = br.readLine();: 루프가 한 번 돌 때마다 한 줄씩 문제 문자열(예: "Quatro cheese pizza")을 읽어 problem 변수에 저장한다.
int problemSize = 0;: 현재 처리 중인 문제의 크기를 계산하기 위한 변수를 0으로 초기화한다.
각 문제마다 새로 계산해야 하므로 루프 안에서 선언된다.
문제 크기 계산 (for-each 루프):
for(char c : problem.toCharArray()) { ... }
problem.toCharArray(): 현재 problem 문자열을 char 배열로 변환한다. (예: {'Q', 'u', 'a', 't', 'r', 'o', ...}).
이 for-each 루프는 problem 문자열의 각 문자 c를 하나씩 가져와 처리한다.
문자 종류별 크기 합산:
if(Character.isUpperCase(c)) { problemSize += 4; }: 현재 문자 c가 대문자인지 확인하여 맞다면 problemSize에 4를 더한다.
else if (Character.isDigit(c) || Character.isLowerCase(c)) { problemSize += 2; }: 대문자가 아니라면, 숫자이거나 소문자인지 확인하여 맞다면 problemSize에 2를 더한다.
else if (c == ' ') { problemSize += 1; }: 숫자나 소문자도 아니라면, 공백(' ')인지 확인하여 맞다면 problemSize에 1을 더한다.
이 3가지 조건으로 문제에서 제시된 모든 문자 종류를 처리한다.
풀만한 문제인지 판단 및 카운트:
if(problemSize <= J) { pullableProblemCount++; }
현재 문제의 크기 problemSize가 잡초의 크기 J보다 작거나 같으면, pullableProblemCount를 1 증가시켜 풀만한 문제로 기록한다.
결과 출력:
System.out.println(pullableProblemCount);
모든 N개의 문제 처리가 끝나면, 최종적으로 계산된 pullableProblemCount 값을 화면에 출력한다.
BufferedReader 닫기:
br.close();
마지막으로, 사용한 BufferedReader 자원을 해제한다.

코드로 구현

package baekjoon.baekjoon_31;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 29716번 문제
public class Main1242 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 첫 번째 줄에서 잡초의 크기 J와 문제의 수 N을 읽어옵니다.
        String[] firstLine = br.readLine().split(" ");
        int J = Integer.parseInt(firstLine[0]); // 잡초의 크기
        int N = Integer.parseInt(firstLine[1]); // 문제의 수

        int pullableProblemCount = 0; // 풀만한 문제의 개수를 저장할 변수

        // N개의 문제 문자열을 읽고 처리합니다.
        for (int i = 0; i < N; i++) {
            String problem = br.readLine(); // 문제 문자열 읽기
            int problemSize = 0; // 현재 문제의 크기를 저장할 변수

            // 문자열의 각 문자를 순회하며 크기를 계산합니다.
            for (char c : problem.toCharArray()) {
                if (Character.isUpperCase(c)) { // 대문자인 경우
                    problemSize += 4;
                } else if (Character.isDigit(c) || Character.isLowerCase(c)) { // 숫자 또는 소문자인 경우
                    problemSize += 2;
                } else if (c == ' ') { // 공백인 경우
                    problemSize += 1;
                }
                // 그 외의 문자는 문제에서 정의되지 않았으므로 무시하거나 기본값 처리 (여기서는 문제 조건에 따라 위 세 가지 경우만 처리)
            }

            // 계산된 문제 크기가 잡초 크기 J보다 작거나 같으면 풀만한 문제로 카운트합니다.
            if (problemSize <= J) {
                pullableProblemCount++;
            }
        }

        // 최종적으로 풀만한 문제의 개수를 출력합니다.
        System.out.println(pullableProblemCount);
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글