Blog blog = new Korea()

알고리즘

[백준] 1065 한수 (Python)

newkr 2022. 5. 23. 17:42
728x90

요즘 백준 단계별 풀어보기를 진행 중이다. 처음에는 자바를 사용하다가, 알고리즘을 풀 때 파이썬 코드가 간략해서 좋고 파이썬을 쓴 지 오래라 감이라도 잡고자 푸는 언어를 바꿨다. (이러다 또 나중에는 자바로 다시 풀어야 될 듯..ㅋㅋㅋ)

백준 1065: 한수

처음에는 한수가 뭔지도 몰랐다. 거기에 이해하기 조금 난해했던 부분은 아래와 같은 궁금증이 있었다.

연속된 두 개의 수가 등차수열인 수를 말한다는데, 그럼 한 자리 수와 두 자리 수는 모두 한수라는 건가?

 아닐 거 같다는 생각에 구글링해서 찾아보니 의외로 맞았다. 즉, 1~9는 연속된 두 개의 수로 본다면 0과 1, 0과 2 ... 같이 증가하기 때문에 등차수열이고, 10~99는 1과 0, 1과 1 ... 같이 두 수밖에 없어 두 수의 차이가 일정하기 때문에 등차수열이 맞다. 

 한수는 왜 한수인가? 보다는 왜 한수가 아닌가?를 이해하는 것이 더 쉬운 개념이긴 하다. 그럼 한수가 아닌 100과 101을 예로 들면, 100은 연속된 두 수로 나눴을 때 1과 0 그리고 0 과 0으로 나뉜다. 이때, 1과 0은 -1만큼의 차이가 있으나, 0과 0은 0만큼의 차이로 앞선 -1만큼의 차이와 일정하지 않기 때문에 등차수열이 아니다. 101도 같은 이유이다. 1과 0, 0과 1로 나뉘는데, 1과 0은 -1만큼, 0과 1은 +1만큼의 차이로 각 자릿수 사이의 차이가 일정하지 못하기 때문에 한수가 아니다. 

한수인지 아닌지의 간단한 예시

# 백준 1065 "한수"
n = int(input()) #입력값
ans = 0 #한수의 개수

for i in range(1, n+1):
	n_list = list(map(int, str(i)))
    # str(i): i를 문자열로 만들어준다. ex) 12 => '12'
    # map(int, str(i)): 문자열로 되어있는 각 자릿수를 정수로 바꿔준다. ex) '12' => 1, 2
    
    if i < 100:
    	ans += 1   # 1의 자리, 10의 자리의 수까지는 모두 한수에 해당하기 때문에 99까지의 수는 다 한수로 카운트한다.
    elif n_list[0] - n_list[1] == n_list[1] - n_list[2]:
    	ans += 1   # 100의 자리와 10의자리, 10의 자리와 1의 자리의 차가 같은지 확인 후 한수를 카운트한다.
print(ans)
728x90