😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with Python]_29_λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° 기초 문제 풀이 λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with python

[이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with Python]_29_λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° 기초 문제 풀이

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 2. 11. 01:58
728x90
λ°˜μ‘ν˜•

220211 μž‘μ„±

<λ³Έ λΈ”λ‘œκ·ΈλŠ” γ€Žμ΄κ²ƒμ΄ 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€γ€ μ˜ youtubeλ₯Ό μ°Έκ³ ν•΄μ„œ κ³΅λΆ€ν•˜λ©° μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€>

https://www.youtube.com/watch?v=tWX6FZwwQMI&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=29 

 

 

 

 

 

 

 

 

 

 

 

< 문제1 > κ°œλ―Έμ „μ‚¬

: μ΅œμ†Œν•œ ν•œ μΉΈ 이상 떨어진 μ‹λŸ‰μ°½κ³ λ₯Ό μ•½νƒˆν•˜μž!

: μΈμ ‘ν•œ μ‹λŸ‰μ°½κ³  κ³΅κ²©λ°›μœΌλ©΄ 듀킨닀

: μ‹λŸ‰μ°½κ³  Nκ°œμ— λŒ€ν•œ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 얻을 수 μžˆλŠ” μ‹λŸ‰μ˜ μ΅œλŒ€κ°’ κ΅¬ν•˜κΈ°

μ‹λŸ‰ 선택 8번
3, 5, ν•΄μ„œ 8개 μ–»κΈ°

1) a(i) = i번째 μ‹λŸ‰μ°½κ³ κΉŒμ§€μ˜ 졜적의 ν•΄ (얻을 수 μžˆλŠ” μ‹λŸ‰μ˜ μ΅œλŒ€κ°’)

2) k(i) = i번쨰 μ‹λŸ‰μ°½κ³ μ— μžˆλŠ” μ‹λŸ‰μ˜ μ–‘

 

  • python
# μ •μˆ˜ N을 μž…λ ₯ λ°›κΈ°
n = int(input())
# λͺ¨λ“  μ‹λŸ‰ 정보 μž…λ ₯ λ°›κΈ°
array = list(map(int, input().split()))

# μ•žμ„œ κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”
d = [0] * 100

# λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 진행 (보텀업)
d[0] = array[0]
d[1] = max(array[0], array[1]) 
for i in range(2, n):
    d[i] = max(d[i - 1], d[i - 2] + array[i])

# κ³„μ‚°λœ κ²°κ³Ό 좜λ ₯
print(d[n - 1])

  • c++
#include <bits/stdc++.h>

using namespace std;

// μ•žμ„œ κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”
int d[100];
int n;
vector<int> arr;

int main(void) {
    // μ •μˆ˜ N을 μž…λ ₯λ°›κΈ°
    cin >> n;
    // λͺ¨λ“  μ‹λŸ‰ 정보 μž…λ ₯λ°›κΈ°
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        arr.push_back(x);
    }

    // λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 진행(보텀업)
    d[0] = arr[0];
    d[1] = max(arr[0], arr[1]);
    for (int i = 2; i < n; i++) {
        d[i] = max(d[i - 1], d[i - 2] + arr[i]);
    }

    // κ³„μ‚°λœ κ²°κ³Ό 좜λ ₯
    cout << d[n - 1] << '\n';
}

 

  • java
import java.util.*;

public class Main {

    // μ•žμ„œ κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™” 
    public static int[] d = new int[100];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // μ •μˆ˜ N을 μž…λ ₯λ°›κΈ°
        int n = sc.nextInt();

        // λͺ¨λ“  μ‹λŸ‰ 정보 μž…λ ₯λ°›κΈ°
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        
        // λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 진행(보텀업)
        d[0] = arr[0];
        d[1] = Math.max(arr[0], arr[1]);
        for (int i = 2; i < n; i++) {
            d[i] = Math.max(d[i - 1], d[i - 2] + arr[i]);
        }

        // κ³„μ‚°λœ κ²°κ³Ό 좜λ ₯
        System.out.println(d[n - 1]);
    }
}

 

 

 

 

 

 

 

< 문제2 > 1둜 λ§Œλ“€κΈ°

: μ •μˆ˜ X κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ 연산을 μ‚¬μš©ν•˜λŠ” 횟수의 μ΅œμ†Œκ°’ κ΅¬ν•˜κΈ°

1) 5둜 λ‚˜λˆ„μ–΄ 떨어지면 5둜 λ‚˜λˆ„κΈ°

2) 3으둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€λ©΄, 3으둜 λ‚˜λˆ„κΈ°

3) 2둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€λ©΄, 2둜 λ‚˜λˆ„κΈ°

4) 1 λΉΌκΈ°

EX) 26 -> 25 -> 5 -> 1

 

  • python
# μ •μˆ˜ Xλ₯Ό μž…λ ₯ λ°›κΈ°
x = int(input())

# μ•žμ„œ κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”
d = [0] * 1000001

# λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 진행(보텀업)
for i in range(2, x + 1):
    # ν˜„μž¬μ˜ μˆ˜μ—μ„œ 1을 λΉΌλŠ” 경우
    d[i] = d[i - 1] + 1
    # ν˜„μž¬μ˜ μˆ˜κ°€ 2둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
    if i % 2 == 0:
        d[i] = min(d[i], d[i // 2] + 1)
    # ν˜„μž¬μ˜ μˆ˜κ°€ 3으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
    if i % 3 == 0:
        d[i] = min(d[i], d[i // 3] + 1)
    # ν˜„μž¬μ˜ μˆ˜κ°€ 5둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
    if i % 5 == 0:
        d[i] = min(d[i], d[i // 5] + 1)

print(d[x])

  • c++
#include <bits/stdc++.h>

using namespace std;

// μ•žμ„œ κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™” 
int d[30001];
int x;

int main(void) {
    cin >> x;
    // λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 진행(보텀업)
    for (int i = 2; i <= x; i++) {
        // ν˜„μž¬μ˜ μˆ˜μ—μ„œ 1을 λΉΌλŠ” 경우
        d[i] = d[i - 1] + 1;
        // ν˜„μž¬μ˜ μˆ˜κ°€ 2둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
        if (i % 2 == 0)
            d[i] = min(d[i], d[i / 2] + 1);
        // ν˜„μž¬μ˜ μˆ˜κ°€ 3으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
        if (i % 3 == 0)
            d[i] = min(d[i], d[i / 3] + 1);
        // ν˜„μž¬μ˜ μˆ˜κ°€ 5둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
        if (i % 5 == 0)
            d[i] = min(d[i], d[i / 5] + 1);
    }
    cout << d[x] << '\n';
}
  • java
import java.util.*;

public class Main {

    // μ•žμ„œ κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™” 
    public static int[] d = new int[30001];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int x = sc.nextInt();

        // λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 진행(보텀업)
        for (int i = 2; i <= x; i++) {
            // ν˜„μž¬μ˜ μˆ˜μ—μ„œ 1을 λΉΌλŠ” 경우
            d[i] = d[i - 1] + 1;
            // ν˜„μž¬μ˜ μˆ˜κ°€ 2둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
            if (i % 2 == 0)
                d[i] = Math.min(d[i], d[i / 2] + 1);
            // ν˜„μž¬μ˜ μˆ˜κ°€ 3으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
            if (i % 3 == 0)
                d[i] = Math.min(d[i], d[i / 3] + 1);
            // ν˜„μž¬μ˜ μˆ˜κ°€ 5둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우
            if (i % 5 == 0)
                d[i] = Math.min(d[i], d[i / 5] + 1);
        }

        System.out.println(d[x]);
    }
}

 

 

 

 

< 문제3 > 효율적인 화폐 ꡬ성

: N 가지 μ’…λ₯˜μ˜ 화폐 있음

: 화폐듀 개수λ₯Ό μ΅œμ†Œν•œμœΌλ‘œ μ΄μš©ν•΄μ„œ κ·Έ κ°€μΉ˜μ˜ 합이 M원이 λ˜λ„λ‘ ν•˜κΈ°

: M 원을 λ§Œλ“€κΈ° μœ„ν•œ μ΅œμ†Œν•œμ˜ 화폐 개수 κ΅¬ν•˜κΈ°

 

 

 

  • python
# μ •μˆ˜ N, M을 μž…λ ₯ λ°›κΈ°
n, m = map(int, input().split())
# N개의 화폐 λ‹¨μœ„ 정보λ₯Ό μž…λ ₯ λ°›κΈ°
array = []
for i in range(n):
    array.append(int(input()))

# ν•œ 번 κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”
d = [10001] * (m + 1)

# λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 진행(보텀업)
d[0] = 0
for i in range(n):
    for j in range(array[i], m + 1):
        if d[j - array[i]] != 10001: # (i - k)원을 λ§Œλ“œλŠ” 방법이 μ‘΄μž¬ν•˜λŠ” 경우
            d[j] = min(d[j], d[j - array[i]] + 1)

# κ³„μ‚°λœ κ²°κ³Ό 좜λ ₯
if d[m] == 10001: # μ΅œμ’…μ μœΌλ‘œ M원을 λ§Œλ“œλŠ” 방법이 μ—†λŠ” 경우
    print(-1)
else:
    print(d[m])
  • c++
#include <bits/stdc++.h>

using namespace std;

int n, m;
vector<int> arr;

int main(void) {
    // μ •μˆ˜ N, M을 μž…λ ₯λ°›κΈ°
    cin >> n >> m;
    
    // N개의 화폐 λ‹¨μœ„ 정보λ₯Ό μž…λ ₯ λ°›κΈ°
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        arr.push_back(x);
    }

    // ν•œ 번 κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”
    vector<int> d(m + 1, 10001);

    // λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 진행(보텀업)
    d[0] = 0;
    for (int i = 0; i < n; i++) {
        for (int j = arr[i]; j <= m; j++) {
            // (i - k)원을 λ§Œλ“œλŠ” 방법이 μ‘΄μž¬ν•˜λŠ” 경우
            if (d[j - arr[i]] != 10001) {
                d[j] = min(d[j], d[j - arr[i]] + 1);
            }
        }
    }

    // κ³„μ‚°λœ κ²°κ³Ό 좜λ ₯
    if (d[m] == 10001) { // μ΅œμ’…μ μœΌλ‘œ M원을 λ§Œλ“œλŠ” 방법이 μ—†λŠ” 경우
        cout << -1 << '\n';
    }
    else {
        cout << d[m] << '\n';
    }
}
  • java
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // μ •μˆ˜ N, M을 μž…λ ₯λ°›κΈ°
        int n = sc.nextInt();
        int m = sc.nextInt();

        // N개의 화폐 λ‹¨μœ„ 정보λ₯Ό μž…λ ₯ λ°›κΈ°
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        // μ•žμ„œ κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™” 
        int[] d = new int[m + 1];
        Arrays.fill(d, 10001);

        // λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming) 진행(보텀업)
        d[0] = 0;
        for (int i = 0; i < n; i++) {
            for (int j = arr[i]; j <= m; j++) {
                // (i - k)원을 λ§Œλ“œλŠ” 방법이 μ‘΄μž¬ν•˜λŠ” 경우
                if (d[j - arr[i]] != 10001) {
                    d[j] = Math.min(d[j], d[j - arr[i]] + 1);
                }
            }
        }

        // κ³„μ‚°λœ κ²°κ³Ό 좜λ ₯
        if (d[m] == 10001) { // μ΅œμ’…μ μœΌλ‘œ M원을 λ§Œλ“œλŠ” 방법이 μ—†λŠ” 경우
            System.out.println(-1);
        }
        else {
            System.out.println(d[m]);
        }
    }
}

 

 

 

 

 

 

< 문제4 > κΈˆκ΄‘

: n x m 크기의 κΈˆκ΄‘μ΄ μžˆλ‹€

: 각 칸은 νŠΉμ •ν•œ 크기의 금이 λ“€μ–΄κ°€ μžˆλ”°

: 맨 μ²˜μŒμ—λŠ” 첫 μ—΄ μ–΄λŠ ν–‰μ—μ„œλ“  좜발 κ°€λŠ₯

: 이후에 m-1 λ²ˆμ— κ±Έμ³μ„œ 맀번 였λ₯Έμͺ½ μœ„, 였λ₯Έμͺ½, 였λ₯Έμͺ½ μ•„λž˜ 3가지 쀑 ν•˜λ‚˜μ˜ μœ„μΉ˜λ‘œ 이동해야함

: μ±„κ΅΄μžκ°€ 얻을 수 μžˆλŠ” 금의 μ΅œλŒ€ 크기 좜λ ₯

1) μ™Όμͺ½ μœ„μ—μ„œ μ˜€λŠ” 경우

2) μ™Όμͺ½ μ•„λž˜μ—μ„œ μ˜€λŠ” 경우

3) μ™Όμ‘±μ—μ„œ μ˜€λŠ” 경우

=> κ°€μž₯ λ§Žμ€ κΈˆμ„ 가지고 μžˆλŠ” 경우λ₯Ό ν…Œμ΄λΈ”μ— κ°±μ‹ 

max(μ™Όμͺ½ μœ„, μ™Όμͺ½ μ•„λž˜, μ™Όμͺ½)

 

 

 

  • python
for tc in range(int(input())) :
    # κΈˆκ΄‘ 정보
    n, m = map(int, input().split())
    array = list(map(int, input().split()))
    # λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° μœ„ν•œ 2차원 dp ν…Œμ΄λΈ” μ΄ˆκΈ°γ…—ν•˜
    dp = []
    index = 0

    for i in range(n) :
        dp.append(array[index:index + m])
        index += m
    # λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° 진행
    for j in range(1, m) :
        for i in range(n) :
            # μ™Όμͺ½ μœ„
            if i == 0: left_up = 0
            else : left_up = dp[i-1][j-1]
            # μ™Όμͺ½ μ•„λž˜
            if i == n - 1 : left_down = 0
            else : left_down = dp[i+1][j-1]
            # μ™Όμͺ½
            left = dp[i][j-1]
            dp[i][j] = dp[i][j] + max(left_up, left_down, left)
        result = 0
        for i in range(n) :
            result = max(result, dp[i][m-1])
    print(result)

 

 

 

 

< 문제5 > 병사 λ°°μΉ˜ν•˜κΈ°

: N λͺ…μ˜ 병사가 λ¬΄μž‘μœ„λ‘œ λ‚˜μ—΄

: μ „νˆ¬λ ₯이 높은 병사가 μ•žμͺ½μ— μ˜€λ„λ‘ λ‚΄λ¦Όμ°¨μˆœ!

: 남아 μžˆλŠ” λ³‘μ‚¬μ˜ μˆ˜κ°€ μ΅œλŒ€κ°€ λ˜λ„λ‘ ν•˜κΈ° μœ„ν•΄ μ—΄μ™Έμ‹œμΌœμ•Ό ν•˜λŠ” λ³‘μ‚¬μ˜ 수 좜λ ₯

: κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ (LIS)

: νŠΉμ • μœ„μΉ˜ λ³‘μ‚¬λŠ” μ˜ˆμ™Έ

 

 

  • python
n = int(input())
array = list(map(int, input().split()))

# μˆœμ„œ λ’€μ§‘μ–΄μ„œ 졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄λ‘œ λ³€ν™˜
array.reverse()

# λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ 1차원 DP ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”
dp = [1] * n

# κ°€μž₯ κΈ΄ 증가 LIS μ•Œκ³ λ¦¬μ¦˜
for i in range(1, n) :
    for j in range(0, i) :
        if array[j] < array[i] :
            dp[i] = max(dp[i], dp[j] + 1)
# μ—΄μ™Έ 병사
print(n-max(dp))

 

 

 

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