
내가 생각했을때 문제에서 원하는부분
흑묘 복권의 티켓 수 N이 주어진다. (1 ≤ N ≤ 10000000)
당첨 티켓 수를 출력한다.
내가 이 문제를 보고 생각해본 부분
main 메서드:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: BufferedReader를 사용하여 표준 입력을 효율적으로 읽어들인다.
int N = Integer.parseInt(br.readLine());: 첫 번째 줄에서 N 값을 읽어와 정수로 변환한다.
int winningTicketCount = 0;: 당첨 티켓의 총 개수를 저장할 변수입니다. 초기 값은 0이다.
for(int i = 1; i <= N; i++): 1부터 N까지의 모든 시리얼 번호(i)에 대해 반복문을 실행한다.
if(isWinningTicket(i)) { winningTicketCount++; }: 현재 시리얼 번호 i가 당첨 티켓인지 isWinningTicket 메서드를 호출하여 확인한다.
만약 true를 반환하면 winningTicketCount를 1 증가시킨다.
System.out.println(winningTicketCount);: 모든 검사가 끝나면 최종 winningTicketCount를 출력한다.
br.close();: 사용한 BufferedReader를 닫아 리소스를 해제한다.
isWinningTicket 메서드:
private static boolean isWinningTicket(int serialNumber): 이 메서드는 주어진 serialNumber가 "2023" 패턴을 포함하는 당첨 티켓인지 여부를 true 또는 false로 반환한다.
String s = String.valueOf(serialNumber);: 정수형 serialNumber를 문자열로 변환합니다. 문자열로 만들어야 각 자릿수를 하나씩 쉽게 확인할 수 있다.
String target = "2023";: 우리가 찾아야 할 목표 시퀀스인 "2023"을 문자열로 정의한다.
int targetIndex = 0;: target 문자열("2023")에서 현재 찾아야 할 문자의 인덱스를 가리키는 변수이다.
처음에는 '2'(인덱스 0)부터 찾아야 하므로 0으로 초기화된다.
for(int i = 0; i < s.length(); i++): serialNumber의 문자열 s를 앞에서부터 한 글자씩 반복하면서 확인한다.
if(targetIndex < target.length() && s.charAt(i) == target.charAt(targetIndex)):
targetIndex < target.length(): 아직 "2023"의 모든 문자를 찾지 못했음을 의미한다. (예: 2, 0, 2까지 찾고 3을 찾아야 하는 상태)
s.charAt(i) == target.charAt(targetIndex): serialNumber의 현재 자릿수(s.charAt(i))가 target에서 현재 찾아야 할 문자(target.charAt(targetIndex))와 일치하는지 확인한다.
두 조건이 모두 참이면 targetIndex++를 통해 target의 다음 문자를 찾도록 인덱스를 증가시킨다.
예를 들어 '2'를 찾았다면 targetIndex는 1이 되어 다음에는 '0'을 찾게 된다.
return targetIndex == target.length();: 반복문이 끝난 후, targetIndex가 target.length() (즉, 4)와 같으면 "2023"을 성공적으로 모두 찾았다는 의미이므로 true를 반환하고, 그렇지 않으면 false를 반환한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 27494번 문제
public class Main1239 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int winningTicketCount = 0; // 당첨 티켓 수를 저장할 변수
// 1부터 N까지의 모든 시리얼 번호를 확인합니다.
for (int i = 1; i <= N; i++) {
if (isWinningTicket(i)) { // 현재 번호가 당첨 티켓인지 확인
winningTicketCount++;
}
}
System.out.println(winningTicketCount); // 최종 당첨 티켓 수 출력
br.close();
}
// 주어진 숫자가 '2023' 시퀀스를 포함하는지 확인하는 메서드
private static boolean isWinningTicket(int serialNumber) {
String s = String.valueOf(serialNumber); // 숫자를 문자열로 변환
String target = "2023"; // 찾아야 할 목표 시퀀스
int targetIndex = 0; // target 문자열에서 현재 찾아야 할 문자의 인덱스
// 시리얼 번호 문자열의 각 문자를 순서대로 확인합니다.
for (int i = 0; i < s.length(); i++) {
// 아직 target의 모든 문자를 찾지 못했고, 현재 문자가 target의 해당 인덱스 문자와 일치하면
if (targetIndex < target.length() && s.charAt(i) == target.charAt(targetIndex)) {
targetIndex++; // target의 다음 문자를 찾도록 인덱스를 증가시킵니다.
}
}
// targetIndex가 target의 길이와 같으면 (즉, 2, 0, 2, 3을 모두 찾았으면) true를 반환합니다.
return targetIndex == target.length();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.