[1. 문제 재정의 및 추상화]
문제에서 한수에 대한 정의
=> 어떤 양의 정수 X의 각 자리가 등차수열을 이루는 수
요구사항
=> N 이 주어졌을 때 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력
- 1 <= N <= 1000
[2. 해결 계획]
- 각 자리가 등차수열을 이룬다는 것은 각 자리의 차이가 전부 같다는 것을 이용
- 각 자리의 차이는 [-9, 9] 에 속함
- 각 자리를 배열로 만들 때, 1의 자리가 배열의 첫번째에 오든 마지막에 오는 것은 중요하지 않다
배열 내에서 인접하기만 하면 됨.
[3. 계획 검증]
- 각 자리 수를 추출하는 것은 상수시간
- 추출된 자리 수 배열의 길이는 최대 4 이므로 이 배열을 조회하는 것 역시 상수시간이라 볼 수 있다.
[4. 구현]
package main
import (
"fmt"
)
func is_target(value int) int {
sn := make([]int, 0, 4)
for value > 0 {
sn = append(sn, value%10)
value /= 10
}
is_ar := true
prev_adj := -10 // -9 ~ 0 or 0 ~ 9
for idx := 0; idx < len(sn)-1; idx++ {
adj := sn[idx] - sn[idx+1]
// 아직 공차를 구하지 않은 상태
if prev_adj == -10 {
prev_adj = adj
} else if prev_adj != adj {
// 공차가 다르므로 한수가 아님
is_ar = false
break
}
}
if is_ar {
return 1
} else {
return 0
}
}
func main() {
T := 0
v := 1
count := 0
fmt.Scanf("%d\n", &T)
for v <= T {
count += is_target(v)
v++
}
fmt.Println(count)
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[1021]. 회전하는 큐 (0) | 2022.08.22 |
---|---|
[1316] 그룹 단어 체커 (0) | 2022.02.05 |
[2941] 크로아티아 알파벳 (0) | 2022.02.05 |
[1157] 단어 공부 (0) | 2022.02.05 |
[4673] 셀프 넘버 (0) | 2022.02.05 |