문제
https://www.acmicpc.net/problem/1065
1부터 n(입력하는 정수)까지 중 한수가 몇 개인지 출력하면 되는 문제. 한수는 각 자릿수가 등차수열인 수를 말한다. (예: 123) 공차가 양수건 음수건 0이건 걍 일정하면 된다.
풀이
일단 등차수열인지를 봐야 하는거라서 한자리와 두자리는 그냥 한수로 쳐준다. 두자리 수의 경우 공차가 하나밖에 없기 때문. 한자리는 뭐지 특별채용? 그래서 처리를 두 개 해야 한다.
- 100보다 큰가?
- 한수인가? (각 자리수의 차가 일정한가?)
참고로 이번 풀이는 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은 한수가 아님)
'BOJ > [BOJ] Python' 카테고리의 다른 글
백준 10809번 풀이 (0) | 2022.08.18 |
---|---|
백준 11720번 풀이 (0) | 2022.08.18 |
백준 15596번 풀이 (0) | 2022.08.18 |
백준 4344번 풀이 (0) | 2022.08.18 |
백준 8958번 풀이 (0) | 2022.08.18 |