λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“ μ•Œκ³ λ¦¬μ¦˜/Code Tree

[μ½”λ“œνŠΈλ¦¬] 완전탐색 / 자리 수 λ‹¨μœ„λ‘œ 완탐 μ—°μŠ΅λ¬Έμ œ

 

5개의 숫자 [1, 5, 2, 6, 8]이 μ£Όμ–΄μ‘Œμ„ λ•Œ
이 쀑 단 ν•˜λ‚˜μ˜ 숫자만 두 배둜 ν•΄μ„œ, μΈμ ‘ν•œ μˆ«μžκ°„μ˜ 차이의 합이 μ΅œλŒ€κ°€ λ˜λ„λ‘ ν•΄λ³΄μ„Έμš”.
 

μœ„ λ¬Έμ œλŠ” λ‹¨μˆœν•˜κ²Œ, λͺ¨λ“  μœ„μΉ˜μ˜ 숫자λ₯Ό 2λ°°μ”© ν•΄λ³΄λŠ” μ™„전탐색을 진행해 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

1. 첫 번째 숫자 1에 2λ°°λ₯Ό ν•˜λŠ” 경우
[2, 5, 2, 6, 8]이 λ˜λ―€λ‘œ, μΈμ ‘ν•œ μˆ«μžκ°„μ˜ 차이의 합은 3 + 3 + 4 + 2 = 12κ°€ λ©λ‹ˆλ‹€.

2. 두 번째 숫자 5에 2λ°°λ₯Ό ν•˜λŠ” 경우
[1, 10, 2, 6, 8]이 λ‚¨κ²Œ λ˜λ―€λ‘œ, μΈμ ‘ν•œ μˆ«μžκ°„μ˜ 차이의 합은 9 + 8 + 4 + 2 = 23이 λ©λ‹ˆλ‹€.

3. μ„Έ 번째 숫자 2에 2λ°°λ₯Ό ν•˜λŠ” 경우
[1, 5, 4, 6, 8]이 λ‚¨κ²Œ λ˜λ―€λ‘œ, μΈμ ‘ν•œ μˆ«μžκ°„μ˜ 차이의 합은 4 + 1 + 2 + 2 = 9κ°€ λ©λ‹ˆλ‹€.

4. λ„€ 번째 숫자 6에 2λ°°λ₯Ό ν•˜λŠ” 경우
[1, 5, 2, 12, 8]이 λ‚¨κ²Œ λ˜λ―€λ‘œ, μΈμ ‘ν•œ μˆ«μžκ°„μ˜ 차이의 합은 4 + 3 + 10 + 4 = 21이 λ©λ‹ˆλ‹€.

5. λ‹€μ„― 번째 숫자 8에 2λ°°λ₯Ό ν•˜λŠ” 경우
[1, 5, 2, 6, 16]이 λ‚¨κ²Œ λ˜λ―€λ‘œ, μΈμ ‘ν•œ μˆ«μžκ°„μ˜ 차이의 합은 4 + 3 + 4 + 10 = 21이 λ©λ‹ˆλ‹€.

λ”°λΌμ„œ μ΅œλŒ€λŠ” 23이 λ©λ‹ˆλ‹€.
 

 

이처럼 각 μžλ¦¬μ— λŒ€ν•΄ 상황을 일일이 가정해보고 μ§„ν–‰ν•΄λ³΄λŠ” 완전탐색 방법을 μ΄μš©ν•˜λ©΄, 문제λ₯Ό κΉ”λ”ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ§Œμ•½ μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” 완전탐색 μ½”λ“œκ°€ μžˆλ‹€κ³  κ°€μ •ν•©μ‹œλ‹€.

그러면 max_val κ°’μ˜ μ΄ˆκΈ°κ°’μ€, λ“€μ–΄μ˜¬ 수 μžˆλŠ” 값듀보닀 훨씬 μž‘μ€ κ°’μœΌλ‘œ μž‘μ•„μ•Ό ν•©λ‹ˆλ‹€.
이 κ²½μš°μ— max_val에 첫 번째 μ›μ†Œλ₯Ό μ΄ˆκΈ°κ°’μœΌλ‘œ λ„£μ–΄μ€€ λ’€ μ§„ν–‰ν•˜λŠ” 방법도 μžˆμ§€λ§Œ,
완전탐색 μœ ν˜•μ—μ„œλŠ” μ²« 번째 μ›μ†Œ 값을 κ΅¬ν•˜λŠ” 것 μžμ²΄κ°€ κ°„λ‹¨ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, μ΄ˆκΈ°κ°’μœΌλ‘œ μ•„μ£Ό μž‘μ€ 값을 μž‘μ•„ μ£ΌλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

 

μ΅œλŒ“κ°’μ„ κ΅¬ν•΄μ£ΌλŠ” κ²½μš°μ—λŠ” λ‹€μŒκ³Ό 같이 #include <climits>λ₯Ό μΆ”κ°€ν•˜μ—¬ max_val에 INT_MIN 값을,

μ΅œμ†Ÿκ°’μ„ κ΅¬ν•΄μ£ΌλŠ” κ²½μš°μ—λŠ” min_val에 INT_MAXλ₯Ό μ΄ˆκΈ°κ°’μœΌλ‘œ λ„£μ–΄μ£ΌλŠ” 과정이 ν•„μš”ν•©λ‹ˆλ‹€.

 


μ—°μŠ΅λ¬Έμ œ : λͺ¨μ΄μž

n개의 집이 x = 1μ—μ„œ x = nκΉŒμ§€ μˆœμ„œλŒ€λ‘œ λ†“μ—¬μžˆκ³ , 각각  λͺ…μ˜ μ‚¬λžŒμ΄ μ‚΄κ³  μžˆμŠ΅λ‹ˆλ‹€. 이듀은 회의λ₯Ό μœ„ν•΄ n개의 집 쀑 ν•œ 곳에 μ „λΆ€ λͺ¨μ΄λ €κ³  ν•©λ‹ˆλ‹€. μ μ ˆν•œ 집을 μ„ νƒν•˜μ—¬ λͺ¨λ“  μ‚¬λžŒλ“€μ˜ 이동 거리의 합이 μ΅œμ†Œκ°€ λ˜λ„λ‘ ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄λ³΄μ„Έμš”.

μž…λ ₯ ν˜•μ‹

첫 번째 쀄에 n이 μ£Όμ–΄μ§‘λ‹ˆλ‹€.
두 번째 μ€„μ—λŠ” 각 지점에 μ‚΄κ³  μžˆλŠ” μ‚¬λžŒ μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” n개의 μˆ«μžκ°€ 곡백을 사이에 두고 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

  • 1 ≤ n ≤ 100
  • 1 ≤  ≤ 100

좜λ ₯ ν˜•μ‹

κ°€λŠ₯ν•œ 이동 거리의 ν•© 쀑 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•©λ‹ˆλ‹€.


λ‚˜μ˜ 풀이

#include <iostream>
#include <climits>
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    int people[101] = {0,};
    cin>>n;
    for(int i=0; i<n; ++i){
        cin >> people[i];
    }
    int sum = 0;
    int answer = INT_MAX;
    for(int i=0; i<n; ++i){
        sum = 0;
        for(int j=0; j<n; ++j){
            if(j==i) continue;
            int d = abs(j-i);
            sum += people[j]*d;
        }
        if(answer > sum) answer = sum;
    }
    cout << answer;
    return 0;
}

 

μ™„νƒμ—μ„œ min / max μ„ μ–Έμ‹œμ—λŠ” μ •μˆ˜κ°’μ˜ μ΅œλŒ€/μ΅œμ†Œλ₯Ό λ„£μ–΄λ‘λŠ” κ±Έ μžŠμ§€λ§μž!