1065번: 한수 - Python

beaver.zip·2022년 2월 23일
0

baekjoon

목록 보기
8/56
post-custom-banner

https://www.acmicpc.net/problem/1065

문제

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.


풀이 1 (정답이지만 난잡함)

n = int(input())
cnt = 0

if 1<=n<=99: print(n)	# n이 1~99일 때: 한수의 개수가 n개임. (*예제 1, 2)
elif n==1000: print(144) # 문제 조건 상 4자리수는 1000뿐인데 코드 길어지게 하기 싫어서..
elif 100<=n<=999:
    for i in range(100, n+1):
        i = list(map(int, str(i))) 
        if i[0]-i[1] == i[1]-i[2]:
            cnt += 1
        # else: continue - 알고보니 continue는 else가 아닌 if 뒤에 쓰는 것이었다! 이상하다 했다..
    print(99+cnt)

이렇게 하면 답은 나오지만 뭔가 억지 투성이인 것 같다.

내가 생각한 이 문제의 핵심 아이디어는:

  1. 1, 2 / 3 / 4자리 수 케이스를 나누어 생각하기.
  2. 3자리수의 경우, 자릿수 비교를 위해 list로 만들기. ex) 135 -> [1, 3, 5]

풀이 2 (참고한 풀이)

num = int(input())
cnt = 0

for n in range(1, num+1):
    nl = list(map(int, str(n)))
    if 1 <= n <= 99:
        cnt += 1
    elif 100 <= n <= 1000:
        if nl[2]-nl[1]==nl[1]-nl[0]:
            cnt += 1
print(cnt)

개선한 점:

  1. 1000의 처리가 바보같았다.. n = 999와 n = 1000의 값이 같다는 것은 잠깐만 생각하면 알 수 있었는데.. 이건 진짜 스스로에게 실망스럽다.
  2. 풀이 1의 코드가 뭔가 어설프다는 생각이 들었는데, 바로 cnt 때문이었다.
    사실 풀이 1의 line 4처럼 cnt를 거치지 않고 바로 print를 실행하는 것도 괜찮겠지만, 가독성이 떨어지는 것 같다.
    그리고 https://beaver-zip.tistory.com/9 에서 변수를 난잡하게 쓰지 말고 cnt를 잘 쓰기로 했는데 그러지 못한 점이 아쉽다.
  3. if, elif 분기를 for문 안에 넣었다. 풀이 1처럼 풀어도 될 것 같지만, for 안에 둘 다 넣는게 더 깔끔해보인다.
profile
mv blog velog.io/@beaver_zip
post-custom-banner

0개의 댓글