코딩관계론

[프로그래머스] 비밀 코드 해독 본문

개발/알고리즘

[프로그래머스] 비밀 코드 해독

개발자_티모 2025. 6. 22. 15:37
반응형

문제 이해하기

비밀 코드는 1 ~ n 사이의 서로 다른 5개의 수로 구성된 오름차순 조합입니다.
총 m번의 시도를 통해 비밀 코드를 추측할 수 있으며, 매 시도마다 서로 다른 5개의 수를 입력합니다.
시스템은 각 시도에 대해, 입력값 중 몇 개가 비밀 코드에 포함되어 있는지를 알려줍니다.

예를 들어, 비밀 코드가 [3, 5, 7, 9, 10]이고
우리가 [1, 2, 3, 4, 5]를 입력했다면,
겹치는 수는 3과 5, 총 2개이므로 시스템은 2를 응답합니다

문제 해결 방법 설명하기

  1. 가능한 모든 5개 조합을 생성합니다. (1 ~ n 중 5개 선택)
  2. 각 조합이 모든 시도의 결과와 정확히 일치하는지 확인합니다.
  3. 조건을 모두 만족하는 조합만을 필터링하여 개수를 셉니다.

코드

function getCombinations(arr, selectCount) {
  const result = [];

  function combine(current, start) {
    if (current.length === selectCount) {
      result.push([...current]);
      return;
    }

    for (let i = start; i < arr.length; i++) {
      current.push(arr[i]);
      combine(current, i + 1);
      current.pop();
    }
  }

  combine([], 0);
  return result;
}


function solution(n, q, ans) {
    var answer = 0;
    const arr = Array.from({ length: n }, (_, i) => i + 1);

    combs = getCombinations(arr, 5)

    for(let i = 0; i < combs.length; ++i){
        let isRight = true

        for(let j = 0; j < ans.length; ++j){
            const target = ans[j]


            const set = new Set(q[j]);
            const result = combs[i].filter(x => set.has(x));

            if(target !== result.length){
                isRight = false
                break
            }   
        }

        if(isRight){
            answer += 1
        }
    }

    return answer;
}

코드 리뷰

기존에는 다음과 같이 isRight 변수를 선언하고 상태를 관리했습니다.  두 구조는 동등하지만, 두 번째 방식은 불필요한 상태 변수 없이 흐름을 제어할 수 있어 더 간결하고 읽기 쉽습니다. 물론, 두 접근 방식 중 어떤 것을 선택할지는 가독성과 팀 코드 스타일에 따라 유연하게 결정할 수 있습니다.

let isRight = true;

for (조건 반복) {
  if (조건 불만족) {
    isRight = false;
    break;
  }
}

if (isRight) {
  answer += 1;
}

-- 새로운 코드 ---
for (let i = 0; i < n; ++i) {
  if (조건 불만족) break;

  if (i === n - 1) {
    // 조건을 끝까지 통과했을 때 수행할 로직
  }
}

 

반응형