📖 문제

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

www.acmicpc.net/problem/1065

 

1065번: 한수

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

www.acmicpc.net

💻 Python

N = int(input())
count = 0
for i in range(1, N+1):
    if i < 100:
        count += 1
    else:
        if (i % 10) - ((i // 10) % 10) == (((i // 10) % 10) - ((i // 100) % 10)):
            count += 1
        if i == 1000:
            count -= 1
print(count)

 

📚 풀이

백준 단계별로 풀다 처음 만난 실버문제..! 문제를 풀고 나서 보니 쉬워보이지만 풀 때 이상한 곳에서 헤맸다...

먼저 100미만일 때는 항상 한수이므로 count를 더해주고 100이상일 때는 일의 자리와 십의 자리, 십의 자리와 백의 자리의 차이를 비교해주었다.

이 경우 문제점이 하나 있는데 1000도 한수로 처리한다는 것이다...그래서 처음에는 위와 같이 1000일 때는 한 번 빼는 조건을 넣어서 제출했다. 그랬더니 다른 사람이 제출한 것보다 시간이 더 많이많이 걸렸다!

그래서 코드를 조금 수정하여 숫자 앞에서부터 차이를 비교했다.

N = int(input())
count = 0
for i in range(1, N+1):
    if i < 100:
        count += 1
    else:
        if (i // 100) - ((i // 10) % 10) == ((i // 10) % 10) - (i % 10):
            count += 1
print(count)

그리고 제출했더니 시간이 96ms에서 68ms로 줄었다!

다른 분들 코드를 보니 100보다 작을 때는 아예 for문을 돌리지 않고 N을 출력하고 100 이상일 때는 99+count를 한 경우도 있고, str로 index를 활용하여 한 풀이도 있었다. 휴 갈 길이 멀다...

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1316. 그룹 단어 체커  (0) 2021.02.20
[백준] 2941. 크로아티아 알파벳  (0) 2021.02.19
[백준] 4673. 셀프 넘버  (0) 2021.02.12
[백준] 4344. 평균은 넘겠지  (0) 2021.02.02
[백준] 2675. 문자열 반복  (1) 2021.02.01

+ Recent posts