본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] "123" 같은 문자열을 순열로 만들기

by StelthPark 2022. 3. 17.

처리조건

풀이

function solution(numbers) {
  const N = numbers.length;
  const judged = {}; // 중복해서 세지 않도록 소수라고 판별한 숫자를 저장
  const isUsed = [...Array(N)].map(() => 0); //numbers의 각 인덱스별 숫자가 사용중인지 확인
  let ans = 0;

  // 계획 2 - 소수 판별하기
  const isPrime = (number) => {
    if (number <= 1) return false;

    const sqrt = Math.sqrt(number);

    for (let i = 2; i <= sqrt; i++) {
      if (number % i == 0) return false;
    }

    return true;
  };

  // 계획 1 - 모든 숫자의 순열을 만듭니다.
  (function f(depth, number) {
    // 깊이가 0보다 클 때 숫자 순열이 만들어집니다.
    if (depth > 0) {
      const parseNumber = Number(number); //011,01 등을 11,1로 바꿔주기위함

      if (!judged[parseNumber] && isPrime(parseNumber)) { //결과값으로 반영한 숫자인지&&소수인지
        ans++; //조건에 일치하는 흩어진 조각 1개추가!
        judged[parseNumber] = 1; //결과값에 반영한 값
      }
    }

    if (depth == N) return; //총 numbers길이 보다 커질순 없다. 같아질만큼 붙여졌다면 out!!

    for (let i = 0; i < N; i++) {
      if (isUsed[i]) continue; //해당숫자가 사용중이라면 그냥 이번 i는 넘겨버림

      isUsed[i] = 1; //사용중으로 바꾸고
      f(depth + 1, number + numbers[i]); //재귀함수를 통해 깊이를 올리며 기존 number에 현재 i번째 숫자를 추가
      isUsed[i] = 0; //끝나고나면 다시 사용중이 아닌걸로
    }
  })(0, ""); // f함수 시작 인자값

  return ans; //최종 조건을 만족하는 경우의 수 합 반환
}

f함수에서 순열로 만들며 동시에 만들어진 숫자마다 소수인지 검사하게된다.

 

문자열로 "123"를 받아 순열로 만들어 반환해보자.

function solution(numbers) {
  const N = numbers.length;
  const judged = {}; // 중복해서 세지 않도록 소수라고 판별한 숫자를 저장
  const isUsed = [...Array(N)].map(() => 0);

  console.log(isUsed);

  let ans = 0;

  // 계획 1 - 모든 숫자의 순열을 만듭니다.
  (function f(depth, number) {
    console.log(number);
    // 깊이가 0보다 클 때 숫자 순열이 만들어집니다.
    if (depth > 0) {
      const parseNumber = Number(number);

      if (!judged[parseNumber]) {
        ans++;
        judged[parseNumber] = 1;
      }
    }

    if (depth == N) return;

    for (let i = 0; i < N; i++) {
      if (isUsed[i]) continue;

      isUsed[i] = 1;
      f(depth + 1, number + numbers[i]);
      isUsed[i] = 0;
    }
  })(0, "");
  
  console.log(judged);
  return ans;
}

judged에 모든 순열이 담길 것이다.  

const parseNumber = Number(number); 에 의해서 011은 11으로 변환되고 11은 이미 judged 객체에 키로 존재하므로 담지 않는다. 만약 Number를 쓰지않는다면? 당연하게 011,01도 담기게된다.

 

댓글