For Programmer

백준 1748번 파이썬 문제풀이(브루트 포스 - 수 이어 쓰기1) 본문

코팅테스트/백준 문제 모음

백준 1748번 파이썬 문제풀이(브루트 포스 - 수 이어 쓰기1)

유지광이 2021. 10. 16. 16:49
728x90

 

이문제는 코드보다 밑에 설명을 먼저 읽어보고 나서 코드를 보는 것을 추천한다. 기본적으로 문제를 풀기 위해 식이 어떠한 루틴으로 반복되는지를 알아야 한다.

 

코드

n = int(input())
result = 0 #결과값 출력을 위한 변수

plusNum = "9" #더해줄 값을 9로 선언
minusNum = "" #빼줄 값을 빈 문자열로 선언

if len(str(n)) > 1: #만약 길이가 1이상이라면
    for i in range(1,len(str(n))+1): #입력받은 수의 길이만큼 돈다
        if i != len(str(n)): #만약 입력받은 str의 길이가 i랑 같지 않다면
            result += (i * int(plusNum)) #result값에 i값과 plusnum(9,90,900.....) 곱한 값을 더해준다.
        elif i == len(str(n)): #만약 i가 n의 길이에 도달했다면
            result += ((n - int(minusNum)) * i) #result값은 (입력받은 수에서 minusnum(9,99,999...)를 빼준다.)
        minusNum += "9" #minusNum에 9를 계속 추가
        plusNum += "0" #plusnum에는 0을 추가
else: #길이가 1이라면
    result = n #n값을 결과값에 대입

print(result)

 

-> 우선 간단하게 설명하자면 1~9까지는 그냥 입력받은 n *1 한 값이 출력값이다. 그렇다면 10~99까지는 어떻게 계산이 될까. 10~99까지는 앞서 구한 9 + (n-9) *2 이다. 100~999는 9 + 90*2 + (n-90-9) * 3 이다. 1000~9999는 9 + 90*2 + 900*3 + (n-900-90-9) * 4이다. 즉 이런식으로 식이 나오는데 이를 코드로 정리하면 위와 같다. 

 

이 문제도 숫자들을 쭉한번 적어놓고 일정하게 반복되는 식만 찾으면 금방 풀 수 있다. 물론 그 식을 깔끔하게 찾아 코드로 옮기기까지 적지않은 시간이 소요된다 ㅎㅎ

728x90
Comments