본문 바로가기
🔅코딩테스트 공부🔅/❗백준

[백준] 1065번 한수(with python)

by 윤무무 2023. 1. 19.

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

 

1065번: 한수

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

www.acmicpc.net

 

1. 내가 작성한 코드
numbers = int(input())
count= 0
for num in range(1,numbers+1): #N보다 작거나 같은 수를 num에 차례로 넣음
  if num < 100:
    count += 1
  else:
    if ((num // 100) - ((num//10)%10)) == (((num//10)%10) - ((num%100)%10)):
      count += 1

print(count)

 

 

2. 생각의 과정

1. 원래 num을 str으로 변환해서 쪼갠 후, 각각의 차이가 같으면 count에 1을 추가하는 방식으로 코딩을 하려했다.

 

ex) input(876) ---str으로 변환 후 반복문으로 쪼갬---> '8'(=a),'7'(=b),'6'(=c_ ---> int(a)-int(b) == int(b)-int(c) ---> count +=1

numbers = int(input())
count= 0
for num in range(1,numbers+1): #N보다 작거나 같은 수를 num에 차례로 넣음
  if num < 100:
    count += 1
  else:
  	for i in str(num): 
   		d = int(i) - (int(i)+1)
		  print(d)

(위는 오류나는 코드임,, 암튼 그럼,,아래에 해결 방법 있음,,)

 

2. 그런데 계속 오류가 떴다!

 

3. 어차피 1000보다 이하의 수가 주어진다고 조건에 나와있기 때문에 어차피 한 자리, 두 자리, 세 자리 수의 경우만 나누면 되는 상황 따라서 한 자리와 두 자리 수들은 그냥 한 수이기 때문에 count+=1 을 해줬고

 

4. 세 자리 수들은 아래와 같은 식을 이용해 나눠줬다.

 

((num // 100) - ((num//10)%10)) == (((num//10)%10) - ((num%100)%10))
 
 
ex) 867
 
8 => 867 // 100 , 숫자를 100으로 나누어준 몫
6 => (867 // 10) % 10
7 => (867%100) % 10
 
5. 이후 백의 자리 수 - 십의 자리 수에서 구한 차이와 십의 자리 수 - 일의 자리 수에서 구한 차이가 같을 경우 count 해주는 생각의 흐름으로 문제를 해결했다.

 

3. 문자열로 해결하는 방법
numbers = int(input())
count= 0
for num in range(1,numbers+1): #N보다 작거나 같은 수를 num에 차례로 넣음
  if num < 100:
    count += 1
  else:
    num_list = list(map(int, str(num)))
    if num_list[1] - num_list[0] == num_list[2] - num_list[1]:
        count += 1

print(count)

str(num) 으로 num을 나눈 후 => 다시 int로 변환해서 => 이걸 list에 넣는다.

댓글