관리 메뉴

Partially Committed

[Summer/Winter Coding(~2018)] μ†Œμˆ˜ λ§Œλ“€κΈ° λ³Έλ¬Έ

πŸ”₯ Algorithm || λ¬Έμ œν’€μ΄/PS

[Summer/Winter Coding(~2018)] μ†Œμˆ˜ λ§Œλ“€κΈ°

WonderJay 2022. 7. 1. 23:31
728x90
λ°˜μ‘ν˜•
SMALL

https://programmers.co.kr/learn/courses/30/lessons/12977

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μ†Œμˆ˜ λ§Œλ“€κΈ°

주어진 숫자 쀑 3개의 수λ₯Ό λ”ν–ˆμ„ λ•Œ μ†Œμˆ˜κ°€ λ˜λŠ” 경우의 개수λ₯Ό κ΅¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€. μˆ«μžλ“€μ΄ λ“€μ–΄μžˆλŠ” λ°°μ—΄ numsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, nums에 μžˆλŠ” μˆ«μžλ“€ 쀑 μ„œλ‘œ λ‹€λ₯Έ 3개λ₯Ό 골라 λ”ν–ˆμ„ λ•Œ

programmers.co.kr

[c++]

  nums λ°°μ—΄μ˜ μ›μ†Œ 3개둜 λ§Œλ“€ 수 μžˆλŠ” 합이 μ†Œμˆ˜μΈ 경우λ₯Ό μΉ΄μš΄νŠΈν•˜λŠ” 것이닀. μ΄λ•Œ μ£Όμ˜ν•  점은 합에 λŒ€ν•œ 쀑볡 μ²˜λ¦¬λŠ” ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. μ™œλƒλ©΄ μ†Œμˆ˜ P κ°€ λ§Œμ•½μ— 각각 λ‹€λ₯Έ μ›μ†Œμ˜ ν•©μœΌλ‘œ κ΅¬μ„±λœλ‹€λ©΄, μˆ«μžλŠ” κ°™μ§€λ§Œ λ‹€λ₯Έ κ²½μš°μ΄λ‹€. λ”λΆˆμ–΄ 각각의 μ›μ†ŒλŠ” μ€‘λ³΅λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ „μ œκ°€ μžˆμœΌλ―€λ‘œ 합에 λŒ€ν•œ μ€‘λ³΅μ²˜λ¦¬λŠ” 신경쓰지 μ•Šμ•„λ„ λœλ‹€.

 

  nums λ°°μ—΄μ˜ μ›μ†Œλ₯Ό μˆœνšŒν•˜λ©° 3가지λ₯Ό μ„ νƒν•˜μ—¬ λ§Œλ“€ 수 μžˆλŠ” 합을 κ΅¬ν•˜λŠ” λ°©λ²•μœΌλ‘œ λ°±νŠΈλž˜ν‚Ήμ„ μ‚¬μš©ν•˜μ˜€λ‹€. depth(k), start 인덱슀, nums 배열을 인자둜 λ°›λŠ” dfs ν•¨μˆ˜μ—μ„œ k κ°€ 3 이라면 3 κ°€μ§€μ˜ μ›μ†Œλ₯Ό λͺ¨λ‘ νƒν•œ κ²ƒμ΄λ―€λ‘œ sum 을 κ΅¬ν•˜κ³ , isprime ν•¨μˆ˜μ— sum 을 λ„£μ–΄ μ†Œμˆ˜μΈμ§€ νŒλ³„ν•œλ‹€.

 

  k κ°€ 3이 μ•„λ‹ˆλΌλ©΄ 아직 3 κ°€μ§€μ˜ μ›μ†Œλ₯Ό λͺ¨λ‘ νƒν•œ 것이 μ•„λ‹ˆλ―€λ‘œ start index λΆ€ν„° num.size() κΉŒμ§€ for 문을 돌며 arr 배열에 차곑차곑 nums[i] λ₯Ό μ €μž₯ν•œλ‹€. 그리고 dfs(k+1, i+1, nums) λ₯Ό μž¬κ·€ν˜ΈμΆœν•˜λ©΄ arr λ°°μ—΄μ—λŠ” κ²°κ΅­ μ„ νƒλœ 3가지 μ›μ†Œκ°€ arr[0], arr[1], arr[2] 에 μ €μž₯λœλ‹€. 이λ₯Ό λ”ν•œ 값이 sum 이닀.

 

  sum 의 μ†Œμˆ˜ νŒλ³„μ€ μžμ‹ μ„ μ œμ™Έν•œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” μˆ˜κ°€ μ—†λŠ”μ§€ ν™•μΈν•˜λŠ”λ°, λŒ€μΉ­μ„±μ— μ˜ν•΄ μ†Œμˆ˜ νŒλ³„μ—λŠ” 지μž₯이 μ—†μœΌλ―€λ‘œ λ²”μœ„λ₯Ό sqrt(sum) κΉŒμ§€λ§Œ μˆ˜ν–‰ν•˜μ—¬ μ—°μ‚°λŸ‰μ„ μ€„μ˜€λ‹€.

 

#include <vector>
#include <math.h>
#include <iostream>
using namespace std;


bool isused[100];
int sum = 0; int ans = 0;
vector<int> arr(3, 0);

bool isprime(int n)
{
    for (int i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0)
            return false;
    }
    return true;
}

void dfs(int k, int start, vector<int>& nums)
{
    if (k == 3)
    {
        sum = arr[0] + arr[1] + arr[2];
        if (isprime(sum))
        {
            ans++;
            sum = 0;
        }
        return;
    }
    else
    {
        for (int i = start; i < nums.size(); i++)
        {
            arr[k] = nums[i];
            dfs(k + 1, i + 1, nums);
        }

    }
}


int solution(vector<int> nums) {

    dfs(0, 0, nums);

    return ans;
}

 

 

 

728x90
λ°˜μ‘ν˜•
LIST
Comments