본문 바로가기

알고리즘/Baekjoon

[1065] 한수

[1. 문제 재정의 및 추상화]

문제에서 한수에 대한 정의

=> 어떤 양의 정수 X의 각 자리가 등차수열을 이루는 수

 

요구사항

=> N 이 주어졌을 때 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력

  • 1 <= N <= 1000

 

[2. 해결 계획]

  1. 각 자리가 등차수열을 이룬다는 것은 각 자리의 차이가 전부 같다는 것을 이용
  2. 각 자리의 차이는 [-9, 9] 에 속함
  3. 각 자리를 배열로 만들 때, 1의 자리가 배열의 첫번째에 오든 마지막에 오는 것은 중요하지 않다
    배열 내에서 인접하기만 하면 됨.

 

[3. 계획 검증]

  1. 각 자리 수를 추출하는 것은 상수시간
  2. 추출된 자리 수 배열의 길이는 최대 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