백준 1065번 풀이

문제

1부터 n(입력하는 정수)까지 중 한수가 몇 개인지 출력하면 되는 문제. 한수는 각 자릿수가 등차수열인 수를 말한다. (예: 123) 공차가 양수건 음수건 0이건 걍 일정하면 된다.

풀이

일단 등차수열인지를 봐야 하는거라서 한자리와 두자리는 그냥 한수로 쳐준다. 두자리 수의 경우 공차가 하나밖에 없기 때문. 한자리는 뭐지 특별채용? 그래서 처리를 두 개 해야 한다.

  1. 100보다 큰가?
  2. 한수인가? (각 자리수의 차가 일정한가?)

참고로 이번 풀이는 for랑 while 둘 다 있다. 제출은 for로 했지만. 사실 반복문의 특성에 따라 코드가 좀 다르다뿐이지 기본적인 로직은 같고.

For

han_count=0
for i in range(111):
    if i < 100:
        han_count += 1
    else: 
        for j in str(i):
            print(j)

일차적으로 한자리/두자리는 한수이므로 묻따않 세주는 처리를 할 것이다. (range가 111인 이유는 그래야 110까지 나와서) 일단 100보다 클 경우 문자열화하고 자릿수를 나누게끔 했는데, 문제가 하나 있었다. 이거 이렇게 해놨는데 인덱싱이 안된다.

han_count=0
han_list=[]
for i in range(1,111):
    if i < 100:
        han_count += 1
        han_list.append(i)
    else: 
        k = i // 100 # 100의 자리 
        m = (i % 100) // 10 # 10의 자리
        n = i % 10 # 일의 자리
        if k - m == m - n:
            han_count += 1
            han_list.append(i)
        else: 
            han_count += 0
print(han_count)
print(han_list)

그래서 자리수 직접 계산해서 뽑았다. 참고로 1부터인 이유는 문제에서 제일 작은 수가 1이라서. 근데 저거 생각해보니까 1000이 빠졌는데 어 잠깐

import sys
a=int(sys.stdin.readline())
han_count=0
for i in range(1,a+1):
    if i < 100:
        han_count += 1
    else: 
        k = i // 100 # 100의 자리 
        m = (i % 100) // 10 # 10의 자리
        n = i % 10 # 일의 자리
        if k - m == m - n:
            han_count += 1
        else: 
            han_count += 0
print(han_count)

근데 우리가 입력을 해야 하잖음? 그래서 준비했습니다. sys.stdin.readline()이다. 아예 정수 처리까지 했다.

import sys
a=int(sys.stdin.readline())
han_count=0
for i in range(1,a+1):
    if i < 100:
        han_count += 1
    elif i == 1000: 
        han_count += 0
    else: 
        k = i // 100 # 100의 자리 
        m = (i % 100) // 10 # 10의 자리
        n = i % 10 # 일의 자리
        if k - m == m - n:
            han_count += 1
        else: 
            han_count += 0
print(han_count)

1000에 대한 처리는 이쪽. (1000은 한수가 아니다)

While

j=1
while j <= a:
    if j < 100:
        han_count += 1
    else: 
        k = j // 100 # 100의 자리 
        m = (j % 100) // 10 # 10의 자리
        n = j % 10 # 일의 자리
        if k - m == m - n:
            han_count += 1
        else: 
            han_count += 0
    j += 1

while은 for와는 맥락이 다른 반복문이다. 반복하는 거 자체는 똑같은데, 얘는 조건부 반복문이라서 최솟값 잡고 반복문 반복할때마다 계속 더하면서 위의 저 로직(100보다 큰가? 한수인가?)을 거치게 하면 된다.

import sys
a=int(sys.stdin.readline())
han_count=0
j=1
while j <= a:
    if j < 100:
        han_count += 1
    else: 
        k = j // 100 # 100의 자리 
        m = (j % 100) // 10 # 10의 자리
        n = j % 10 # 일의 자리
        if k - m == m - n:
            han_count += 1
        else: 
            han_count += 0
    j += 1
print(han_count)

그래서 이렇게 된다.

import sys
a=int(sys.stdin.readline())
han_count=0
j=1
while j <= a:
    if j < 100:
        han_count += 1
    elif j == 1000: 
        han_count += 0
    else: 
        k = j // 100 # 100의 자리 
        m = (j % 100) // 10 # 10의 자리
        n = j % 10 # 일의 자리
        if k - m == m - n:
            han_count += 1
        else: 
            han_count += 0
    j += 1
print(han_count)

1000에 대한 처리까지 하면 이렇게 된다. (1000은 한수가 아님)