2019.02.09) 백준 1038번 풀이 (PyPy3)
2019. 2. 9. 23:14ㆍ프로그래밍(주력)/백준 문제풀이
시간초과가 10번은 뜬거같다
간단하게 모든정수 돌렸더니 1022를 넣어서 내 컴퓨터에서도 출력이 안됐다.
그래서 좀 줄여서 오직 작아지는 수만 순회할수 있는 알고리즘을 만들었다.
근데 100%에서 시간초과가 뜨는 것이다
좀 화나서 1시간동안 고민하고 보니까 1~9까지를 연산을 안돌리고 그냥 바로 출력해주면 되더라
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | c = int(input()) # 9까진 그냥 입력값이 답(이거때문에 1시간 낭비함) if c < 10: print(c) # 1022번째 9876543210이후 감소하는 수는 없음 elif 1023 <= c: print(-1) else: # 지금 몇번쨰 탐색인지 count = 9 # 현재 숫자 num = 10 # 거듭제곱된 10의 배수들 미리 저장 w = [10 ** i for i in range(10)] while True: # 따로 지금 수 저장 now = num # 1의자리수 first = now % 10 # 연속이 끝나는 자리수 digit = 0 while True: # 연속이 끝나면 탈출 if now % 10 != first + digit: break # 10씩 나누며 연속되는지 확인 digit += 1 now //= 10 # 탐색횟수 +1 count += 1 # 입력값이랑 횟수랑 같으면 출력 if count == c: print(num) break # 연속이 안된경운 그냥 1더하면 됨 if digit <= 1: num += 1 # 연속인 경우 else: # 맨 앞자리가 9라면 자리수 변경이 일어남 if num // w[digit - 1] == 9: num = 0 # ex) 자리수 3인경우의 최소인 감소하는 수는 210 for i in range(digit + 1): num += i * (10 ** i) # 아닌경우 else: # ex) 여기서 num이 76321 이라면 # digit = 3 이고 # digit - 1 번째 자리수, 100의자리수를 1 더해주고 그 및 자리수를 최소로 채움 # 76321 + 100 -> 76400 + 10 -> 76410 num = num + w[digit - 1] - num % w[digit - 1] for i in range(digit - 1): num += i * (10 ** i) | cs |
'프로그래밍(주력) > 백준 문제풀이' 카테고리의 다른 글
2019.02.11) 백준 1149번 풀이 (PyPy3) (0) | 2019.02.11 |
---|---|
2019.02.10) 백준 1003번 풀이 (PyPy3) (0) | 2019.02.10 |
2019.02.08) 백준 1934번 풀이 (PyPy3) (0) | 2019.02.08 |
2019.02.07) 백준 10845번 풀이 (PyPy3) (0) | 2019.02.07 |
2019.02.06) 백준 7568번 풀이 (PyPy3) (0) | 2019.02.06 |