Algorithm Problem/Python

[python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ง€ํ˜• ํŽธ์ง‘

deo2kim 2020. 9. 16. 08:24
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

Lv4 | ์ด๋ถ„ํƒ์ƒ‰ or ์™„์ „ํƒ์ƒ‰(?)

 

์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋”๋‹ˆ ํšจ์œจ์„ฑ์—์„œ ์‹คํŒจํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ•œ์ธตํ•œ์ธต ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ์ธต์˜ ๊ฐ’์„ ๊ตฌํ•  ๋•Œ๋Š” ์ด์ „์— ์ €์žฅํ•œ ์ธต์˜ ๊ฐ’์„ ์ด์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

๋จผ์ € 2์ฐจ์› ํ–‰๋ ฌ์„ ์ผ๋ ฌ๋กœ ์„ธ์šด๊ณ  ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค. 

[[4, 4, 3], [3, 2, 2], [2, 1, 0]] โžก [0, 1, 2, 2, 2, 3, 3, 4, 4]

 

๋‹ค์Œ ์ œ์ผ ๋‚ฎ์€ ์ธต( ์—ฌ๊ธฐ์„œ๋Š” 0 )์œผ๋กœ ํ‰ํ‰ํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•œ๋‹ค.

์ง€ํ˜•์„ ๋นผ๋Š” ์ž‘์—…๋งŒ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ( ์ „์ฒด์ง€ํ˜• ์ˆ˜ - ๊ฐ€์žฅ ๋‚ฎ์€์ธต์˜ ์ง€ํ˜• ์ˆ˜ ) * Q(๋นผ๋Š” ๋น„์šฉ)

๋นจ๊ฐ„ ๋ถ€๋ถ„์„ ๋‹ค ์ง€์šฐ๋ฉด ๋†’์ด๊ฐ€ 0์ธ ํ‰ํ‰ํ•œ ์ง€ํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฐ’์€ 21์นธ * Q(์ง€์šฐ๋Š” ๊ฐ’) = 63

์ด์ œ ์ผ๋ ฌ๋กœ ์„ธ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ํƒ์ƒ‰ํ•œ๋‹ค. ( ๋งจ์•ž์€ ํ–ˆ์œผ๋‹ˆ 0๋ถ€ํ„ฐ )

๋ฆฌ์ŠคํŠธ[1] ์€ 1์ด๋‹ค. (1์ธต์œผ๋กœ ํ‰ํ‰ํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ๋œป)

* ๋กœ ํ‘œ์‹œ๋œ ์ธต์ด ์ƒ์„ฑ ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ดˆ๋ก์นธ์€ ์›๋ž˜ ์—†๋˜๊ณณ์ด๊ณ , ๋นจ๊ฐ„ ์นธ์€ ์›๋ž˜ ์žˆ๋˜ ๊ณณ์ด๋‹ค.

0์ธต์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฐ’(63)์— ์ดˆ๋ก์นธ๊ณผ ๋นจ๊ฐ„์นธ์„ ๋”ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ดˆ๋ก์นธ์€ ์ƒˆ๋กœ ์ง€ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋นจ๊ฐ„์นธ์€ ๊ธฐ์กด์— ์ง€์› ๋˜ ์ง€ํ˜•์„ ๋‹ค์‹œ ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ƒˆ๋กœ ์ง€ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด +P, ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์€ -Q์˜ ๊ฐ’์ด ๋“ ๋‹ค.( Q๋ฅผ ์จ์„œ ์ง€์› ์œผ๋‹ˆ Q๋ฅผ ์จ์„œ ๋ณต๊ตฌํ•œ๋‹ค.)

  • 0์ธต ๊ฐ’ + ์ดˆ๋ก( (๋†’์ด ์ฐจ์ด)*(๊ฐœ์ˆ˜)*P ) - ๋นจ๊ฐ• ( (๋†’์ด ์ฐจ์ด)*(๋‚˜๋จธ์ง€ ๊ฐœ์ˆ˜)*Q )
  • 63 +5 - 24 = 44

๋‹ค์Œ์€ ๋ฆฌ์ŠคํŠธ[2] = 2 ์ด๋‹ค.

๋‘๊ฐœ์˜ ์ดˆ๋ก ์ง€ํ˜•์„ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ธฐ์กด์— ์ง€์› ๋˜ 7๊ฐœ์˜ ๋นจ๊ฐ„ ์ง€ํ˜•์„ ๋ณต๊ตฌํ•œ๋‹ค.

 

๋‹ค์Œ ๋ฆฌ์ŠคํŠธ[3] = 2 ์ด๋‹ค. ์ด์ „์— ์ง„ํ–‰ํ•œ 2์ธต๊ณผ ๋˜‘๊ฐ™์œผ๋ฏ€๋กœ ํŒจ์Šค... ์ด๋Ÿฐ์‹์œผ๋กœ ์ œ์ผ ๊ณ ์ธต๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋ฉด ํ•ด๊ฒฐ!

 

๐Ÿ’จ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ํŒ์€ ๋ฐ‘์—์„œ ๊ณ ์ธต์œผ๋กœ ๊ฐˆ ์ˆ˜๋ก ๋น„์šฉ์ด ์ค„์–ด๋“ค๊ณ  ์–ด๋Š ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋‹ค์‹œ ๋น„์šฉ์ด ๋Š˜์–ด๋‚œ๋‹ค.

์ฆ‰ ๋ณ€๊ณก์ ์ด ํ•˜๋‚˜ ์žˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„์— ๋ฉˆ์ถ”๋ฉด ๋ ๋“ฏํ•˜๋‹ค( ์ด๋ถ„ํƒ์ƒ‰์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Œ )

 

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

 from itertools import chain


def solution(land, P, Q):
    # ์ผ๋ ฌ๋กœ ์„ธ์šฐ๊ธฐ
    line = list(chain.from_iterable(land))
    line.sort()
    # print(line)
    n = len(line)

    # ๊ฐ€์žฅ ๋‚ฎ์€ ์ธต์œผ๋กœ ํŽธ์ง‘ (๋ฌด์กฐ๊ฑด 0์ด ์•„๋‹ˆ๋ผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธต์ค‘์— ๋งจ ๋ฐ‘)
    # ๊ฐ€์žฅ ๋‚ฎ์€ ์ธต์€ ์ง€ํ˜•์ด ๋‹ค ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ์œ„์˜ ๋ธ”๋ก์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ฉด ๋œ๋‹ค.
    cost = (sum(line) - line[0] * n) * Q
    answer = cost

    # ํ•œ์ธต์”ฉ ์Œ“๊ธฐ
    for i in range(1, n):
        if line[i] != line[i - 1]:
            # print(f'cost: {cost}, line[i-1]: {line[i - 1]}, line[i]: {line[i]} ')
            cost = cost + ((line[i] - line[i - 1]) * i * P) - ((line[i] - line[i - 1]) * (n - i) * Q)
            if answer < cost:  # ์‹œ๊ฐ„ ๋‹จ์ถ• - ๋ณ€๊ณก์ 
                break
            answer = min(answer, cost)
    return answer


and ์‹คํŒจํ•œ ์ฝ”๋“œ ๐Ÿ’ข ( ์ด๋ถ„ ํƒ์ƒ‰ ) - ์ •ํ™•์„ฑ์€ ๋งž์œผ๋‚˜ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ๋–จ์–ด์ง

์ด๋ถ„ ํƒ์ƒ‰
from collections import defaultdict


def solution(land, P, Q):
    answer = 0
    n = len(land)

    line = defaultdict(int)
    for i in range(n):
        for j in range(n):
            line[land[i][j]] += 1

    # print(line)

    def cal(k):
        p, q = 0, 0
        # print(f'i: {k}')
        for key, value in line.items():
            if key > k:
                q += (key - k) * value
            elif key < k:
                p += (k - key) * value

        # print(f'total: {p * P + q * Q}')
        return p * P + q * Q

    bottom = min(line)
    top = max(line)
    while True:
        mid = (bottom + top) // 2

        up_val = cal(mid + 1)
        mid_val = cal(mid)
        down_val = cal(mid - 1)
        if mid_val <= up_val and mid_val <= down_val:
            answer = mid_val
            break
        elif down_val < mid_val:
            top = mid - 1
        elif up_val < mid_val:
            bottom = mid + 1

    return answer
    
    

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/12984

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ง€ํ˜• ํŽธ์ง‘

XX ๊ฒŒ์ž„์—์„œ๋Š” ์ง€ํ˜• ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ง์ ‘ ๊ฒŒ์ž„ ์† ์ง€ํ˜•์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒŒ์ž„์—์„œ๋Š” 1 x 1 x 1 ํฌ๊ธฐ์˜ ์ •์œก๋ฉด์ฒด ๋ธ”๋ก์„ ์Œ“์•„ ๊ฒŒ์ž„ ์† ์ง€ํ˜•์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ธ”๋ก์ด ๏ฟฝ๏ฟฝ

programmers.co.kr


๋ฌธ์ œ ์„ค๋ช…

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์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•