
내가 생각했을때 문제에서 원하는부분
N이 주어진다. (1 ≤ N ≤ 1000000)
선우의 방식대로 1부터 차례대로 수를 셌을 때 어떤 수 N이 몇 번째 수에서 처음 등장하는지 출력하시오.
내가 이 문제를 보고 생각해본 부분
사용자 입력 N 받기:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 이 코드는 키보드와 같은 표준 입력으로부터 데이터를 읽어올 준비를 한다.
System.in이 키보드 입력이고, InputStreamReader가 바이트를 문자로, BufferedReader가 그 문자를 효율적으로 읽을 수 있게 한다.
int N = Integer.parseInt(br.readLine()); 사용자가 콘솔에 입력하고 Enter 키를 누르면, br.readLine()이 그 한 줄의 내용을 문자열로 읽어온다.
이 문자열(예: "50"이라는 글자)을 Integer.parseInt() 메서드를 사용하여 실제 정수 (예: 숫자 50)로 변환한 뒤, 변수 N에 저장한다.
N은 우리가 몇 번째 등장하는지를 알고 싶은 바로 그 숫자이다.
카운트 변수 초기화 (count):
int count = 0; 이 count 변수는 문제에서 요구하는 "선우의 방식대로 숫자를 세었을 때의 총 횟수"를 기록하는 역할을 한다.
초기에는 아무것도 세지 않았으므로 0으로 시작한다.
반복문을 이용한 숫자 세기 (for 루프)
for(int i = 1; i <= N; i++) { ... } 이 부분은 i라는 변수를 1부터 N까지 1씩 증가시키면서 반복 작업을 수행한다.
즉, 1, 2, 3, ... N까지의 모든 숫자를 순서대로 "세어보는" 과정이다.
우리가 N이 몇 번째에 처음 등장하는지 찾아야 하므로, N을 포함한 그 이하의 모든 숫자에 대한 카운트가 필요하다.
"50" 포함 여부 확인 로직 (주의가 필요한 부분)
String s = String.valueOf(i - 1); 이 부분이 이 코드의 핵심이자, 문제의 원래 의도와 약간 다를 수 있는 지점이다.
코드는 현재 "세고 있는" 숫자 i가 아니라, 그 **이전 숫자(i - 1)**를 문자열로 변환하여 s에 저장하고 있다.
예를 들어 i가 50일 때, s에는 49가 문자열로 들어간다.
if(s.contains("50")) count += 2; else count++;
s.contains("50")를 사용하여 s 문자열(현재 i-1의 문자열 표현) 안에 "50"이라는 부분이 포함되어 있는지 검사한다.
만약 "50"이 포함되어 있다면 (if 조건이 참): count에 2를 더한다.
이는 문제 규칙에 따라 해당 숫자가 두 번 세어졌음을 의미한다.
"50"이 포함되어 있지 않다면 (else 조건): count에 1을 더한다.
이는 해당 숫자가 한 번만 세어졌음을 의미한다.
다시 강조하지만, 문제의 설명을 엄격히 따르면 "어떤 수" 즉, 현재 세고 있는 숫자 i 자체에 "50"이 포함되는지를 확인해야 한다.
따라서 이 코드를 문제의 의도에 맞게 수정하려면 String s = String.valueOf(i);로 변경해야 한다.
현재 코드는 N=50 예시에서 50번째 카운트가 아니라 다른 결과가 나올 수 있다.
최종 결과 출력
System.out.println(count); for 루프가 N까지 모든 숫자를 처리하고 나면, count 변수에는 N이 처음 등장하는 시점의 총 카운트 횟수가 최종적으로 저장된다.
이 값을 콘솔 화면에 출력하여 프로그램의 결과를 보여준다.
자원 해제:
br.close(); BufferedReader와 같은 입력 스트림은 사용이 끝나면 반드시 close() 메서드를 호출하여 관련된 시스템 자원을 해제해주어야 한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 28135번 문제
public class Main1206 {
public static void main(String[] args) throws IOException {
// 입력 스트림을 효율적으로 읽기 위한 BufferedReader를 생성합니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 사용자 입력 N을 정수로 변환하여 저장합니다.
int N = Integer.parseInt(br.readLine());
// 숫자가 세어진 횟수를 기록할 변수를 초기화합니다.
int count = 0;
// 1부터 N까지 반복하며 각 숫자를 처리합니다.
for(int i = 1; i <= N; i++) {
// 현재 숫자 'i'에서 1을 뺀 값을 문자열로 변환합니다.
String s = String.valueOf(i - 1);
// 변환된 문자열 's'에 "50"이 포함되어 있으면 카운트를 2 증가시킵니다.
if(s.contains("50"))
count += 2;
// 그렇지 않으면 카운트를 1 증가시킵니다.
else
count++;
}
// 최종 계산된 카운트 값을 출력합니다.
System.out.println(count);
// 사용했던 BufferedReader를 닫아 자원을 해제합니다.
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.