처리조건
풀이
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도 담기게된다.
'일반 학습 > 코딩 테스트' 카테고리의 다른 글
[프로그래머스] 게임 맵 최단거리 (0) | 2022.03.19 |
---|---|
[프로그래머스] 조이스틱 (0) | 2022.03.18 |
[프로그래머스] 가장 큰 수 (0) | 2022.03.17 |
[프로그래머스] 프린터 (0) | 2022.03.16 |
[프로그래머스] 기능개발 (0) | 2022.03.15 |
댓글