본문 바로가기

Computer Science/Baekjoon

[Baekjoon] 1065번 한수 S4

728x90

1065번 - 한수

1. 문제

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

2. 사용 알고리즘

3. 풀이

자연수 N

자연수 $N$은 $1000$ 보다 작거나 같으므로 수열의 항은 최대 4개이다.

 

  • $N < 100$
    • $N$은 한 자리 수 혹은 두 자리 수 이므로, 모든 경우에서 등차수열의 특징을 만족한다.
  • $N ≥ 100$
    • $N$이 3자리 수 일 때, 백의 자리 숫자일의 자리 숫자 의 합은 십의 자리 숫자 의 두 배와 같은 경우에 한하여 등차수열이다.
    • $N$이 4자리 수 일 때, $N = 1000$ 의 경우 밖에 없고, 등차수열이 아니다.

Key point

  1. 항이 두 개 이하인 수열 은 항상 등차수열이다.
  2. 항이 세 개인 등차수열 $a_n$에 대해 $2 a_1 = a_0 + a_2$를 만족한다.

4. 제출 코드

맞았습니다!!

def isHan(num):
  l = list(map(int, str(num)))
  if len(l) < 3: return True
  return l[1] * 2 == l[0] + l[2]

cnt = 0
for i in range(int(input())):
  if isHan(i + 1): cnt += 1

print(cnt)

위 코드에서는 특정 숫자 num 에 대해 한수 여부를 반환하는 isHan(num) 함수를 정의하였다.

4.1. 쓰인 테크닉

  • str(num)
    정수 자료형 값(num)을 문자열 자료형으로 변환한다.
    • ex) 123'123'
  • list(map(int, str(num)))
    문자열 값(str(num))을 정수 리스트로 변환한다.
    • ex) '123'[1, 2, 3]
      * 단, list(str(num)) 과 같이 구현했다면 ['1', '2', '3'] 이 되었을텐데 이는 원하는 결과가 아니다.
728x90