๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[Javascript] ์†Œ์ˆ˜ ๋งŒ๋“ค๊ธฐ (12977)

๋ฌธ์ œ๋งํฌ

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์†Œ์ˆ˜ ๋งŒ๋“ค๊ธฐ

์ฃผ์–ด์ง„ ์ˆซ์ž ์ค‘ 3๊ฐœ์˜ ์ˆ˜๋ฅผ ๋”ํ–ˆ์„ ๋•Œ ์†Œ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด nums๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, nums์— ์žˆ๋Š” ์ˆซ์ž๋“ค ์ค‘ ์„œ๋กœ ๋‹ค๋ฅธ 3๊ฐœ๋ฅผ ๊ณจ๋ผ ๋”ํ–ˆ์„ ๋•Œ

programmers.co.kr

์ ‘๊ทผ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• 1. nums ๋ฐฐ์—ด์˜ 3๊ฐœ์˜ ์›์†Œ๋งŒ ์„ ํƒํ•˜๋Š” ์กฐํ•ฉ์„ ๊ตฌํ•ด์„œ ๊ตฌํ•œ ์กฐํ•ฉ์˜ ํ•ฉ์„ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ธฐ
๋ฐฉ๋ฒ• 2. ์™„์ „ ํƒ์ƒ‰์„ ํ†ตํ•ด 3์ค‘ for๋ฌธ์œผ๋กœ 3๊ฐœ๋ฅผ ๋ฝ‘๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ

๋ฐฉ๋ฒ• 2๋Š” 3์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(n^3)์ด๋ผ ์ƒ๊ฐ๋˜์–ด
๋จผ์ € ๋ฐฉ๋ฒ• 1์„ ์„ ํƒํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ ํšจ์œจ์„ฑ์—์„œ ๋ฐฉ๋ฒ• 2์˜ ๋ฐฉ์‹์ด ํ›จ์”ฌ ๋” ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์˜€๋‹ค.

์žฌ๊ท€ํ•จ์ˆ˜์™€ ๋ฐฐ์—ด ๋‚ด์žฅํ•จ์ˆ˜๋“ค์˜ ์‹œ๊ฐ„๋ณต์žก๋„์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ•™์Šตํ•ด๋ด์•ผ๊ฒ ๋‹ค.

 

 

function solution(nums) {
    const sumArr = []
    const combinations = getCombinations(nums, 3)
    combinations.forEach(e => sumArr.push(e.reduce((a,b) => a+b)))
    let count = sumArr.length;
    
    sumArr.forEach(e => {
        for(let i = 2; i <= Math.sqrt(e); i++){
            if(e % i === 0){
                count--;
                break;
            }

        }
    })
    
    return count;
}

const getCombinations = function (arr, selectNumber) {
    const results = [];
    if (selectNumber === 1) return arr.map((el) => [el]); 

    arr.forEach((fixed, index, origin) => {
      const rest = origin.slice(index + 1); 
      const combinations = getCombinations(rest, selectNumber - 1);
      const attached = combinations.map((el) => [fixed, ...el]);
        
      results.push(...attached);
    });

    return results
}

function solution(nums) {
  let answer = 0;
  const length = nums.length;
  for (let i = 0; i < length; i++) {
    for (let j = i + 1; j < length; j++) {
      for (let k = j + 1; k < length; k++) {
        const sum = nums[i] + nums[j] + nums[k];
        if (isPrime(sum)) answer += 1;
      }
    }
  }

  return answer;
}

function isPrime(num) {
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (num % i === 0) return false;
  }
  return num >= 2;
}