Programmers, ์ง€ํ˜• ํŽธ์ง‘

2021. 11. 30. 20:25ใ†ETC/Algorithm

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

 

๋ฌธ์ œ ์„ค๋ช…

XX ๊ฒŒ์ž„์—์„œ๋Š” ์ง€ํ˜• ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ง์ ‘ ๊ฒŒ์ž„ ์† ์ง€ํ˜•์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒŒ์ž„์—์„œ๋Š” 1 x 1 x 1 ํฌ๊ธฐ์˜ ์ •์œก๋ฉด์ฒด ๋ธ”๋ก์„ ์Œ“์•„ ๊ฒŒ์ž„ ์† ์ง€ํ˜•์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ธ”๋ก์ด ๊ณต์ค‘์— ๋–  ์žˆ๊ฑฐ๋‚˜, ๋ธ”๋ก ํ•˜๋‚˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์นธ์— ๊ฑธ์ณ ๋†“์ผ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€ํ˜•์„ ํŽธ์ง‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ์นธ์˜ ์ œ์ผ ์œ„์— ๋ธ”๋ก 1๊ฐœ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์ œ์ผ ์œ„์— ์žˆ๋Š” ๋ธ”๋ก ํ•œ ๊ฐœ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง€ํ˜•์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ธ”๋ก ํ•œ ๊ฐœ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒŒ์ž„๋จธ๋‹ˆ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ช‡ ๊ฐœ์˜ ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ• ์ง€ ์‹ ์ค‘ํ•œ ์„ ํƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒŒ์ž„์„ ์ฆ๊ธฐ๋˜ ํ•œ ํ”Œ๋ ˆ์ด์–ด๋Š” N x N ํฌ๊ธฐ์˜ ์ง€์—ญ์— ์ž์‹ ๋งŒ์˜ ๋ณ„์žฅ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์šธํ‰๋ถˆํ‰ํ•œ ์ง€ํ˜•์˜ ๋ชจ๋“  ์นธ์˜ ๋†’์ด๊ฐ€ ๊ฐ™์•„์ง€๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ธ”๋ก ํ•œ ๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด P์˜ ๋น„์šฉ์ด, ์ œ๊ฑฐํ•˜๋ ค๋ฉด Q์˜ ๋น„์šฉ์ด ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ๋ธ”๋ก ํ•œ ๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ 5์˜ ๋น„์šฉ์ด, ์ œ๊ฑฐํ•  ๋•Œ 3์˜ ๋น„์šฉ์ด ๋“œ๋Š” ๊ฒฝ์šฐ, 3 x 3 ๋„“์ด์˜ ๋ชจ๋“  ์นธ์˜ ๋ธ”๋ก ๋†’์ด๊ฐ€ ๊ฐ™์•„์ง€๋„๋ก ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

 

 

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ง€ํ˜• ๋ธ”๋ก์ด ๋†“์—ฌ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์นธ์˜ ๋†’์ด๊ฐ€ 3์œผ๋กœ ๊ฐ™์•„์ง€๋„๋ก ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์–‘์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” 3๋ณด๋‹ค ๋†’์€ ์นธ์˜ ๋ธ”๋ก 2๊ฐœ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , 3๋ณด๋‹ค ๋‚ฎ์€ ์นธ์— ์ด 8๊ฐœ์˜ ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฉฐ, 2 x 3 + 8 x 5 = 46์˜ ๋น„์šฉ์ด ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ์นธ์˜ ๋†’์ด๊ฐ€ 2๋กœ ๊ฐ™์•„์ง€๋„๋ก ํ•  ๋•Œ๋Š” 6๊ฐœ์˜ ๋ธ”๋ก์„ ์ œ๊ฑฐํ•˜๊ณ , 3๊ฐœ์˜ ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•˜๋ฉด 6 x 3 + 3 x 5 = 33์˜ ๋น„์šฉ์ด ๋“ค๊ฒŒ ๋˜๋ฉฐ, ์ด๋•Œ๊ฐ€ ์ตœ์†Œ๋น„์šฉ์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

ํ˜„์žฌ ์ง€ํ˜•์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด land์™€ ๋ธ”๋ก ํ•œ ๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ P, ๋ธ”๋ก ํ•œ ๊ฐœ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ Q๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ์นธ์— ์Œ“์—ฌ์žˆ๋Š” ๋ธ”๋ก์˜ ๋†’์ด๊ฐ€ ๊ฐ™์•„์ง€๋„๋ก ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ
  • land๋Š” N x N ํฌ๊ธฐ์˜ 2์ฐจ์› ๋ฐฐ์—ด์ด๋ฉฐ, N์˜ ๋ฒ”์œ„๋Š” 1 ≤ N ≤ 300์ž…๋‹ˆ๋‹ค.
  • land์˜ ๊ฐ ์›์†Œ๋Š” ๊ฐ ์นธ์— ๋†“์—ฌ ์žˆ๋Š” ๋ธ”๋ก์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, 0 ์ด์ƒ 10์–ต ์ดํ•˜์˜ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ ์นธ์— ๋ธ”๋ก ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ๋Š” P, ์ œ๊ฑฐํ•˜๋Š” ๋ฐ๋Š” Q์˜ ๋น„์šฉ์ด ๋“ค๋ฉฐ, P, Q์˜ ๋ฒ”์œ„๋Š” 1 ≤ P, Q ≤ 100์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ
 
land P Q result
[[1, 2], [2, 3]] 3 2 5
[[4, 4, 3], [3, 2, 2], [ 2, 1, 0 ]] 5 3 33

์ž…์ถœ๋ ฅ ์˜ˆ #1

  • ๋ชจ๋“  ๋•…์˜ ๋†’์ด๋ฅผ 1๋กœ ๋งž์ถ”๋Š” ๋ฐ๋Š” ๋ธ”๋ก 4๊ฐœ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ 8์˜ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋•…์˜ ๋†’์ด๋ฅผ 2๋กœ ๋งž์ถ”๋Š” ๋ฐ๋Š” ๋ธ”๋ก 1๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ธ”๋ก 1๊ฐœ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ 5์˜ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋•…์˜ ๋†’์ด๋ฅผ 3์œผ๋กœ ๋งž์ถ”๋Š” ๋ฐ๋Š” ๋ธ”๋ก 4๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ 12์˜ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ตœ์†Œ ๋น„์šฉ์€ 5์ด๋ฏ€๋กœ 5๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ #2
๋ฌธ์ œ์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์œผ๋ฉฐ ์ตœ์†Œ ๋น„์šฉ์€ 33์ž…๋‹ˆ๋‹ค.

 

๋ฌธ์ œ ํ•ด๊ฒฐ

C++

#include<vector>
#include<climits>
#include<algorithm>

using namespace std;

long long solution(vector<vector<int>> land, int P, int Q) {
    long long answer = LLONG_MAX;
    vector<long long> flat;
    long long total = 0;
    long long prev = -1, block = 0;
    
    for (int i = 0; i < land.size(); i++) {
        for (int j = 0; j < land[i].size(); j++) {
            flat.push_back(land[i][j]);
            total+= land[i][j];
        }
    }
    
    sort(flat.begin(), flat.end());

    for (int cur = 0; cur < flat.size(); cur++) {
        if (prev != flat[cur]) {
            long long add = flat[cur] * cur - block;
            long long remove = total - (flat.size() * flat[cur]) + add;
            long long cost = add * P + remove * Q;
            
            if (answer > cost) answer = cost;
            prev = flat[cur];
        }
        block += flat[cur];
    }
    
    return answer;
}

 

 

1) ๋จผ์ € 2์ฐจ์› ๋ฐฐ์—ด์„ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ˜•์‹œํ‚ต๋‹ˆ๋‹ค.

1-1) ๋ชจ๋“  ๋ธ”๋Ÿญ์˜ ์ˆ˜์„ ์นด์šดํŒ…ํ•ฉ๋‹ˆ๋‹ค.

 

2) 1์ฐจ์›์œผ๋กœ ํŽผ์นœ ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

 

3) ์ƒˆ๋กœ์šด ๋†’์ด์˜ ๋ธ”๋Ÿญ์ด ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค cost๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ answer์„ ์—…๋ฐ์ดํŠธ ์‹œํ‚ต๋‹ˆ๋‹ค.

3-1) ํƒ์ƒ‰ํ•œ ๋ธ”๋Ÿญ๋“ค์˜ ์ˆ˜๋ฅผ ์นด์šดํŠธ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘‰๐Ÿป block

3-2) ํ˜„์žฌ ํƒ์ƒ‰์ค‘์ธ(cur) ๋ธ”๋Ÿญ์˜ ๋†’์ด (flat[cur]) ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

3-2-1) CASE ADD :  ํƒ์ƒ‰ํ–ˆ๋˜ ๋ธ”๋Ÿญ๋“ค์€ (flat[cur] ๋ณด๋‹ค ๋‚ฎ์€ ๋†’์ด์˜ ๋ธ”๋Ÿญ๋“ค) ๋ธ”๋Ÿญ์„ ์ฑ„์›Œ๋†“์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ์ƒ‰ํ•œ ๋ธ”๋Ÿญ๊นŒ์ง€์˜ ๋„“์ด(flat[cur] * cur) ์— ์นด์šดํŒ…ํ•œ ๋ธ”๋Ÿญ ์ˆ˜ (block)๋ฅผ ๋นผ์„œ ์ฑ„์šธ ๋ธ”๋Ÿญ(add)์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

3-2-2) CASE REMOVE : ํƒ์ƒ‰ํ•˜์ง€ ์•Š์€ ๋ธ”๋Ÿญ๋“ค์€ ๋งž์ถ”๊ณ ์ž ํ•˜๋Š” ๋†’์ด์— ํ•ด๋‹นํ•˜๋Š” ๋„“์ด (flat.size() * flat[cur]) ์—์„œ 3-2-1) ์—์„œ ์ถ”๊ฐ€ํ•œ ๋งŒํผ๋งŒ ์ œ์™ธํ•œ ํ›„ ๋ชจ๋“  ๋ธ”๋Ÿญ(total)์—์„œ ์ œ์™ธ ์‹œ์ผœ์ฃผ๋ฉด ์—†์• ๋ ค๋Š” ๋ธ”๋Ÿญ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

Python

from functools import reduce

def solution(land, P, Q):
    answer = float('inf')
    prev = -1
    block = 0
    
    flat = reduce(lambda x,y :x+y , land)
    total = sum(flat)
    flat.sort()

    for cur in range(len(flat)):
        if prev != flat[cur]:
            add = flat[cur] * cur - block;
            remove = total - (len(flat) * flat[cur]) + add;
            cost = add * P + remove * Q;
            
            if answer > cost: 
                answer = cost;
            prev = flat[cur];
            
        block += flat[cur];
    
    return answer