내가 생각했을때 문제에서 원하는부분
첫째 줄에 L과 R이 주어진다.
L은 2,000,000,000보다 작거나 같은 자연수이고, R은 L보다 크거나 같고, 2,000,000,000보다 작거나 같은 자연수이다.
첫째 줄에 L보다 크거나 같고, R보다 작거나 같은 자연수 중에 8이 가장 적게 들어있는 수에 들어있는 8의 개수를 구하는 프로그램을 작성하시오.
내가 이 문제를 보고 생각해본 부분
L, R의 자리 수가 다른 경우(첫번째 경우)
L: 823부터 R: 8812 까지 사이의 수 중 900 1000 등 8의 개수가 0인 수가 존재하게 된다.
만약 이 두 수의 사이의 간격이 넓어서 이러한 수가 있다고 생각한다면 다른 예시를 생각해보자.
L: 8, R: 11 인 경우에도 9, 10, 11 등 8의 개수가 0인 수가 존재하게 된다.
그러므로 L, R의 자리 수가 다른 경우에는 답은 0이 된다.
L, R의 자리 수가 같은 경우(두번째 경우)
L: 2314부터 R: 3241 까지 사이의 수에는 L, R 자신을 포함하여 8의 개수가 0인 수가 존재하므로 이러한 경우도 답이 0이 나온다.
하지만 만약 세번째의 경우 처럼 L 또는 R에 8이 포함되어 있는 경우 최소 개수가 0이 아닐 수 있다.
세번째의 경우 처럼 L: 8808, R: 8880인 경우 앞의 두 자리인 88이 겹치게 되므로 최소 2개의 8을 갖게 된다.
그러므로 자리 수가 같은 경우 두 수를 가장 큰 자리 수부터 비교를 하며 같은 자리에 있는 수가 달라질 때까지 8의 개수를 조사하면 된다.
그러므로 L, R의 자리 수가 같은 경우에는 가장 큰 자리 수부터 같은 자리에 있는 수가 달라질 때까지 존재하는 8의 개수가 답이 된다.
코드로 구현
package baekjoon.baekjoon_24;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 1105번 문제
public class Main858 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String L = st.nextToken();
String R = st.nextToken();
int answer = 0;
if(L.length() != R.length()){ // 자리 수가 다른 경우 답은 0이다.
System.out.println(answer);
} else { // 자리 수가 같은 경우 각 맨 앞자리 수 부터 비교하며 8의 개수를 센다.
int i = 0;
while(i < L.length() && L.charAt(i) == R.charAt(i)) {
if(L.charAt(i) == '8') {
answer++;
}
i++;
}
System.out.println(answer);
}
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.