11강
접근법 :
1부터 입력받은 정수까지 입력 하기 위해서는 총 몇개의 문자가 필요 한 지 묻는 문제이다.
해당 문제를 해결하는 법 중 하나는 1부터 n까지 돌면서 하나씩 세는 방법이다.
그러기 위해서는 다음 방법을 사용 하게된다.
하지만 이 방법은 큰 수 n이 들어오면 1초 이상의 시간이 걸린다.
12강
답은 맞았으나, 풀이가 숏코딩의 형태가 되지 못했다.
접근법 :
11강의 시간초과 문제를 해결 하는 문제이다.
일단 문제의 규칙성을 찾아야 한다.
여기까지는 했다.
1~9 사이의 개수는 9개
10~99 사이의 개수는 90개
100~999 사이의 개수는 900개
.
.
.
이러한 식으로 자릿수의 숫자에는 규칙성이 있다.
이제 이 규칙성이 있는 점을 토대로 코딩을 해야한다.
깔끔하게 코딩을 하려면, 같은 반복문 내에서 같이 처리 할 수 있는 일을 골라 내야한다.
그래서 이번 문제는 while(d+sum < n ) 안에서 모두 하게 된다.
먼저 변수를 선언한다.
1) c=1(자리수의 문자수)
2) d=9(같은 자리수 숫자의 개수)
3) sum=0
4) res=0
이제 while문을 돌면서 먼저 sum=sum+d를 해준다.
그리고 res=res+(d*c)를 해주고
c++를 해준다.
그리고 d=d*10을 해준다.
13강
접근법 :
2147483647 이상의 수를 읽을 때는 long long int로 읽는다.
이걸로도 읽지 못한다면 string으로 읽는다.
그리고 각각의 배열에 들어가 있는 수에서 -48을 해준다.
14강
접근법 :
1) 일의자리수만 빼서 계산 하기 ( x%10 , x/10 이용 )
2) 1은 소수이다.
3) 2~n-1 까지 for문 돌면서 n%i 를 통해 소수 구하기
15강
접근법 :
내 풀이 : 전에 배웠던 배열을 선언하고 약수라는 것은 어떤 수의 배수라는 것이기 때문에 for문을 1~n까지 돌면서 i의 배수에 해당되는 배열의 칸만 수를 하나씩 늘려주고 해당 배열에서 약수의 개수가 2개인 것을 뽑아서 카운트를 했다.
선생님 풀이법 : n까지의 수중에서 소수인 수를 구하는 문제는 소수가 되는 수만을 골라 주면 된다.
여기서 소수가 되지 않는 수를 판별 할 것이다. 그 방법은 이렇다.
예를 들어 36이라는 수가 있다하면 해당 수의 약수는 1*36 , 2*18, 3*12, 4*9, 6*6 이렇게 이다. 즉 굳이 36까지 다 살펴 볼 필요 없이 6까지만 확인 해도 된다는 것이다. 이 말은 어떤 수의 약수를 구하기 위해서는 해당 수의 제곱근 까지만을 확인하고 *2를 해주면 된다. 만약에 제곱근이 정수로 딱 떨어지는 수는 -1을 해준다. 그렇다면 코딩 문을 보자.
for(i=2; i<=n; i++){
flag=1;
for(j=2; j*j<=i; j++){
if(i%j==0){
flag=0;
break;
}
}
if(flag==1) cnt++;
}
해당 코딩 문을 보면 중첩 for문에 j*j <= i 로 조건이 표현 돼 있는 것을 볼 수 있다. 이것은 sqrt를 사용하지 않고 for문에서 제곱근의 효과를 내주는 방식이다. 예를 들어 i가 36이라고 하면 j*j는 36 일때까지 돌게 된다. 즉 j가 6일때까지 돌게 된다.