-
1490. [Python]자리수로 나누기Python_알고리즘/Gold V 2023. 11. 1. 00:59
1. 문제
https://www.acmicpc.net/problem/1490
2. 접근 방법
- 시간 제한: 2초
- 메모리 제한: 128MB
- 브루트 포스
3. 파이썬 코드
import math # 숫자를 리스트로 받아옴 nums = list(map(int, input())) # 리스트 숫자를 합칠 변수 number = "" # 최소공배수를 구할 변수 answer = 1 # 리스트를 반복해가며 0이 아닌 값들의 최소공배수를 구하고 숫자를 합쳐줌 for i in nums: if i != 0: answer = math.lcm(answer, i) number += str(i) # 합친 숫자를 정수로 변환 number = int(number) # 바로 나누어 떨어지는지 확인하기 위한 몫을 구함 answer_check = number // answer # 바로 나누어 떨어질 경우 바로 출력 if answer_check * answer == number: print(number) # 외의 경우 else: # start 변수에 number 숫자를 넣어줌 start = number # 뒤에 숫자를 붙일 길이 체크 str_length = 1 # 무한루프 실행 while True: # check 라는 변수에 start 값 + 0 * str_length 를 더붙여줌 check = int(str(start) + "0" * str_length) # 10의 str_length 제곱수 만큼 반복문시행 for i in range(10**str_length): # 만약 나누어 떨어지면 종료 if check % answer == 0: print(check) exit() # check 값을 1씩 더해나감 check += 1 # 반복문 종료하면 0의 길이를 추가 str_length += 1
4. 문제를 풀고난 후 생각
- 들어온 N 값을 그대로 가지고 있으며 그 각 자리수로 나누어 떨어지는 수를 구하는 문제이기 때문에 기존의 들어온 숫자를 그대로 할당해주고 그 변수에 0을 자리수로 추가해나가며 접근했다.
예시를 들어서 접근하는 방식이 좋을 것 같아서 생각을 별도로 작성하진 않았다.
예시1. N = 13
1과 3의 최소공배수 => 3
13 % 3 != 0 이므로 13에 0을 한개붙인 130 부터 값을 체크하기 시작함
130 % 3 != 0 이므로 131 로 넘어감
131 % 3 != 0 이므로 132
132 % 3 == 0 이므로 132 출력하게됨.
예시2. N = 83
3과 8의 최소공배수 => 24
830 ~ 839 까지는 24로 나눠떨어지지 않기 때문에 str_length 를 1증가시킨 8300 부터 값을 비교하기 시작함.
8300 % 24 != 0 이므로 8301
8301 % 24 != 0 이므로 8302
8302 % 24 != 0 이므로 8303
8303 % 24 != 0 이므로 8304
8304 % 24 == 0 이므로 8304를 출력하게 됨
위와 같은 방식으로 0의 갯수를 증가해 나가며 값들을 비교하는 코드를 구현함.
5. 문제를 푸는데 도움이 되는 지식
- 브루트 포스
'Python_알고리즘 > Gold V' 카테고리의 다른 글
1593. [Python]문자 해독 (1) 2023.12.28 1263. [Python]시간 관리 (1) 2023.12.21 1374. [Python]강의실 (0) 2023.10.30 1245. [Python]농장 관리 (1) 2023.10.21 7490. [Python]0 만들기 (0) 2023.10.11