구현은 절대적이라 할 방법이 없지만, 구현에서 애를 먹었던 문제들을 모아두며 왜 어려웠는지 고찰해보고자 한다.

문제 및 풀이

책 페이지 (https://www.acmicpc.net/problem/1019)

자릿수별로 0~9 각 숫자의 개수를 계산하면 되는 간단한 문제

0을 따로 처리해야 함을 알고 있었지만, 점화식을 파악하느라 시간이 오래 걸렸다. 잘못된 방향으로 빠지면서 구현에서 실수가 생기면서 초조해지면서 수의 특징을 정확히 이해하지 못했다. 잠깐 쉬고 오니 해결이 되었다.

  1. 구현하다가 답답하게 막힐 땐 잠시 쉬고 돌아오도록 하자.
  2. 분기를 만나면 나올 수 있는 분기를 차분히 나누고, 이후에 합치도록 하자. 중간부터 최적화해서 코드를 짜려니 종종 꼬일 때 풀어내기가 어렵다.

4단 고음 (https://school.programmers.co.kr/learn/courses/30/lessons/1831)

‘아이유의 고음 발성 특성 분석’이라는 논문 연구가 있을 정도로 N단 고음은 우리의 마음에 큰 울림을 주는 것 같다.

  1. 고음의 베리에이션을 만드는 방법이 조합인가.. 고민해보다 조합으로 중간 과정을 만들어나가는 게 어떻게 해도 만들어지지 않아서 잘못된 접근임을 눈치챘다.
  2. 모든 경우의 수를 먼저 만들어서 1부터 시작하는 수로 적용해 target 숫자를 만들어 나가는 걸로 개선. 답은 나왔으나 n이 큰 케이스에서 시간 초과
  3. 거꾸로 n부터 시작해 1로 내려오도록 뒤에서부터 경우의 수를 만들어 오니 시간 내에 성공

경우의 수를 만들 때 처음부터 만들어나가며 target에 도달하는지를 보는 것보다, target부터 내려오며 시작 조건에 부합하는지를 보는 게 더 빠를 때가 있다.

보이어 무어 알고리즘에서 끝부터 비교해오는 것과 같은 느낌이로군.