관리 메뉴

JIE0025

[BOJ - 수학] 4375번 : 1 ( python ) 본문

알고리즘

[BOJ - 수학] 4375번 : 1 ( python )

Kangjieun11 2022. 1. 31. 16:12
728x90


백준 4375번 (실버3) 파이썬
https://www.acmicpc.net/problem/4375

 

4375번: 1

2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.

www.acmicpc.net


문제
2와 5로 나누어 떨어지지 않는 정수 n(1<=n<=10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오

입력은 여러개의 테스트 케이스
각 테스트 케이스는 한줄로 이루어져 있고 n이 주어짐

출력은 1로 이루어진 n의 배수 중 가장 작은 수의 자리수를 출력한다.

- 시간제한 1초
- 메모리 제한 128mb


문제 이해


이문제는 입력 n에 대해
1로만 이루어진 n의 배수 중 가장 작은 수는 몇개의 자리수를 갖고 있는가 출력해주면 되는 문제이다.

만약 3이 입력으로 주어지면 111이 1로만 이루어진 가장 작은 3의 배수가 되므로
출력은 111의 자리수인 3이다.


전체 소스코드


1) 여러번의 테스트 케이스를 받아야 하므로 무한반복문으로 숫자를 받아주었다.
try except를 이용해 입력 예외가 발생할경우 break해주었다.

2) n = int(input())
input받은 값을 바로 int로 치환하여 n에 담았다.

3) i = 1
i는 num의 자리수를 체크하기 위한 변수이다.
반복문을 돌 때마다 num이 10을 곱하고 1을 더해주는 연산을 통해
1, 11,111,1111… 이렇게 자리수가 1개씩 증가하는데, 이 자리수를 세기 위해 i를 쓴다.

4) num = 0 (초기화)
num = num*10+1
while문에서
이전 num값에 10을 곱하고 1을 더해준다

num = 0
num = 0 * 10 +1 >> num은 1
num = 1 * 10 +1 >> num은 11
num = 11 * 10 +1 >> num은 111
.
.
.
이렇게 num값을 만든 후, num값이 입력값 n의 배수인지 확인을 해준다.

5) num %= n

여기서 num을 %n을 바로 해주면 num 값이 바뀌어서 다시 while문 돌 때 괜찮을까 싶은데
(a*b)%c == (a%c*b%c)%c와 같아서
111 % 3 == (11 * 10 + 1) %3 이고
결국 (11%3 * 10 + 1 ) % 3 이므로
이전 num 값을 아예 계산 한 후 바로 대입해주어도 결과는 똑같다.


검산
- n==3, i ==1, num == 0
- num == 0*10+1 == 1
1 %= 3 >> num== 1
if num!=0이므로 i +=1 >> i == 2
- num == 1*10+1 == 11
11%=3 >> num== 2
if num!=0이므로 i +=1 >> i == 3
- num == 2*10+1 == 21
21%=3 >> num==0
if num==0이므로 print i == 3, break




코테 초보한테는 어려웠다 ㅠㅠ