알고리즘

홀수 홀릭 호석 (백준 20164)

일단 기록하자👣 2024. 5. 14. 14:01

https://www.acmicpc.net/problem/20164

🚀문제 접근

  • 수의 각 자리 숫자 중에서 홀수의 개수를 종이에 적는다.
  • 수가 한 자리이면 더 이상 아무것도 하지 못하고 종료한다.
  • 수가 두 자리이면 2개로 나눠서 합을 구하여 새로운 수로 생각한다.
  • 수가 세 자리 이상이면 임의의 위치에서 끊어서 3개의 수로 분할하고, 3개를 더한 값을 새로운 수로 생각한다.

이 단계에 맞춰서 그대로 구현하기만 하면 된다.

다만 까다로웠던 부분은 맨 마지막 부분이다. 임의의 위치에서 끊어 3개의 수로 분할해야하는데 처음에는 재귀를 활용한 조합으로 해결하려고 했다. 하지만 임의의 위치 2곳만 선택하면 되기 때문에 이중 for문을 활용해서 해결할 수 있다.

 

그리고 재귀함수에 cnt라는 파라미터를 넘겨서 총 홀수의 갯수를 구할 수 있도록 구현했다.

 

🛠코드

let input = require('fs').readFileSync(0).toString().trim();

function solution(input) {
   let max = Number.MIN_SAFE_INTEGER;
   let min = Number.MAX_SAFE_INTEGER;

   function count(num) {
      let result = 0;
      for (let x of num) {
         if (Number(x) % 2 !== 0) result++;
      }
      return result;
   }

   function solve(n, cnt) {
      cnt += count(n);
      if (n.length === 1) {
         min = Math.min(min, cnt);
         max = Math.max(max, cnt);
         return;
      } else if (n.length === 2) {
         let temp = Number(n[0]) + Number(n[1]);
         solve(temp.toString(), cnt);
      } else {
         for (let i = 1; i < n.length; i++) {
            for (let j = i + 1; j < n.length; j++) {
               let tmp = Number(n.substring(0, i)) + Number(n.substring(i, j)) + Number(n.substring(j));
               solve(tmp.toString(), cnt);
            }
         }
      }
   }

   solve(input, 0);

   return `${min} ${max}`;
}

console.log(solution(input));