-
백준 파이썬 11947번 : 이런 반전이 풀이기타/알고리즘 2020. 12. 2. 22:53반응형
11947번: 이런 반전이
첫째 줄에는 테스트 케이스의 개수를 나타내는 하나의 자연수 T가 주어집니다. 다음 T개의 각 줄에는 하나의 양의 정수 N이 주어집니다. (1 ≤ N ≤ 1,000,000,000)
www.acmicpc.net
숫자 n이 주어질 때 '반전'은 각 자리 숫자 a에 대해 9-a를 한 것이다
'사랑스러움'은 숫자 n과 '반전'의 곱이다
이때 단순히 숫자 n의 '사랑스러움'을 구하는 것이 아님에 주의해야 한다. 한 숫자에 대해서만 계산한다면 간단한 문제지만, range(1,n+1) 범위에서 '사랑스러움'의 최댓값을 구해야하기 때문에 복잡해 보인다.
그러나 쉽게 유추할 수 있는 규칙성이 있어서 의외로 간단하다.
한 자리 숫자가 주어진다면 이들 수의 '사랑스러움'의 최대값은 4*5다.
n 1 2 3 4 5 6 7 8 9 반전 8 7 6 5 4 3 2 1 0 사랑스러움 8 14 18 20 20 18 14 8 0 표로 나타내보면 가운데 숫자의 '사랑스러움'이 최대가 될 것이라고 쉽게 알 수 있다. 그러므로 두 자리 숫자에 대해서는 50*49가 최대값이 될 것이고, 세 자리 숫자에 대해서는 500*499가 최대값이 될 것이다.
그리고, 입력받은 수가 가운데 수보다 작은 경우에는 숫자가 커질수록 '사랑스러움'이 커진다. 따라서 이 경우에는 입력받은 수의 '사랑스러움'이 최대값이 될 수밖에 없다.
그러므로
1. n의 자리 숫자가 주어졌을 때 n의 자리의 '사랑스러움'의 최대값을 가운데 수를 통해 계산한다
2. 가운데 수가 입력받은 수보다 커서는 안 되므로 둘을 비교한다
3. 입력받은 수가 더 크다면 가운데 수의 '사랑스러움'을 출력하고
4. 아니라면 입력받은 수의 '사랑스러움'을 출력한다
1234567891011121314151617181920n = int(input())ll = []answer = []mid = 1for _ in range(n):a = int(input())mid = (5*(10**(len(str(a))-1))) #가운데 수if mid>a: #가운데 수와 입력받은 수를 비교mid = 0else:mid = mid*(mid-1) #가운데 수의 '사랑스러움'r_a = [] #입력받은 수의 '반전'for i in list(str(a)):r_a.append(str(9-int(i)))r_a = int(''.join(r_a))cummu = a*r_aif cummu>mid:print(cummu)else:print(mid)cs 반응형'기타 > 알고리즘' 카테고리의 다른 글
[백준 파이썬 1966번 : 프린터 큐] 큐를 이용한 풀이 (0) 2020.12.05 백준 파이썬 10828번 : 스택 시간초과 해결 (0) 2020.12.03 백준 파이썬 2428번 : 표절 이진탐색 풀이 (0) 2020.12.03 백준 파이썬 5800번 : 성적 통계 풀이 (0) 2020.12.01 백준 파이썬 10709 : 기상캐스터 풀이 (0) 2020.11.30