728x90
문제 풀이
▶ 브루트 포스 --> 시간초과
더보기
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(System.out) );
int n = Integer.parseInt( br.readLine() );
br.close();
int a[] = new int[10], i, t;
for( i = 1; i <= n; i++ ) {
t = i;
while( t > 0 ) {
a[ t % 10 ]++;
t /= 10;
}
}
for( int aa : a )
bw.write( aa + " " );
bw.write("\n");
bw.flush();
bw.close();
}
}
▶ 문제 변형해서 풀기
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(System.out) );
int a[] = new int[10], i;
int n = Integer.parseInt( br.readLine() ), s = 1, e = n, d = 1, t;
// num, start, end, digit, tmp
while( s <= e ) {
while( e % 10 != 9 && s <= e ) {
t = e;
while( t > 0 ) {
a[ t % 10 ] += d;
t /= 10;
}
e--;
}
if( e < s )
break;
while( s % 10 != 0 && s <= e ) {
t = s;
while( t > 0 ) {
a[ t % 10 ] += d;
t /= 10;
}
s++;
}
s /= 10;
e /= 10;
for( i = 0; i < 10; i++ )
a[i] += ( e - s + 1 ) * d;
d *= 10;
}
for( int aa : a )
bw.write( aa + " " );
bw.write("\n");
bw.flush();
bw.close();
}
}
문제에서 요구하는 것은 1~n까지의 수에서 0~9가 나오는 각각의 개수 인데,
이 것을 변형해서 A~B까지의 수 중에서 구한다고 가정한다.
A의 일의 자리가 0, B의 일의 자리가 9일 때
일의 자리에 0~9는 각각 ( (B/10) - (A/10) + 1 ) * 1 번씩 등장한다
A, B를 각각 10으로 나눠준 후
십의 자리에 0~9는 각각 ( (B/10) - (A/10) + 1 ) * 10 번씩 등장한다
이 공식을 이용하여 A의 일의 자리가 0, B의 일의 자리가 9가 되도록 A++ 또는 B--를 하며 맞춰준다.
맞추는 동안의 A, B 수에서 0~9 숫자가 등장하는 개수는 브루트 포스로 구해서 더한다.
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 4811 : 알약 / 동적 계획법 (0) | 2020.12.07 |
---|---|
[백준(Baekjoon)][자바(java)] 1074 : Z / 재귀 (0) | 2020.12.07 |
[백준(Baekjoon)][자바(java)] 1956 : 운동 / 최단 경로 (0) | 2020.11.02 |
[백준(Baekjoon)][자바(java)] 10217 : KCM Travel / 최단 경로 (0) | 2020.11.02 |
[백준(Baekjoon)][자바(java)] 11404 : 플로이드 / 최단 경로 (0) | 2020.11.02 |