import java.util.*;
import java.lang.*;
public class Main {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
String input = kb.next();
int numcopy = Integer.parseInt(input);
int clap =0;
while(numcopy>0) {
int i = String.valueOf(numcopy).length();
if(i==1) {
if(numcopy%3 ==0) clap ++;
}else {
int num = numcopy;
while(i>0) {
double k = Math.pow(10, i-1);
int n = num / (int)k;
if(n%3 == 0 && n != 0) {
clap ++;
}
num = num - n*(int)k;
i--;
}
}
numcopy--;
}
System.out.println(clap);
}
}
입력된 숫자의 자릿수를 구한 후, 한 자리수와 두 자리수 이상일 때로 구분.
한 자리수일때, %3 == 0 이면 clap++
두 자리수 이상일때, 제일 큰 자릿수부터 구함 : 각 자리수에 해당하는 10의 거듭제곱수로 입력된 숫자를 나누어줌.(예를들어, 375를 입력받을 경우, 100의자리수인 3을 구하기위해 375/100)
이렇게 구해진 수가 0이아니면서 %3의 결과가 0이면 clap++.
그 다음 숫자는 '(처음 입력받은 수 - 앞에서 구했던 자리수 해당자리수의 10의 거듭제곱)/구할자릿수의 10의거듭제곱수'로 파악. (예를들어, (375-3100)/10)
...
이런식으로 입력받은 수의 파악이 끝나면, -1을 해준 후 while문을 1까지 반복.
마지막에 clap 출력.
수에서 10을 나누어준 후 나머지로 자릿수를 파악. 몫은 그 다음절차에 이용.
예를들어 375일경우, 375%10 == 5로 1의자리수 파악. -> 375/10 ==37 몫을 구해 다음단계에 사용 -> 37%10 ==7로 10의 자리수 파악 -> ...
입력받은 수를 저장하는 것 1번, 이를 numcopy에 저장하는 것 1번, clap초기화 1번, numcopy의 길이 저장 N번, numcopy%3 연산 N번, clap++ N번, numcopy-- N번, num변수 초기화 N번, Math.pow() N번, k에 대입 N번, num/k N번, n에 대입 N번, clap++ N번, nk N번, num-(nk) N번, num에 대입 N번, i-- N번
-> O(14N +3) = O(N)
최대 입력수가 1,000,000이므로 1억이 넘지않아서 1초안에 가능할것으로 판단.
528ms