Problem Solving/BOJ & Programmers

[Programmers] ๋‘ ํ ํ•ฉ ๊ฐ™๊ฒŒ ๋งŒ๋“ค๊ธฐ

geum 2022. 11. 23. 00:50

๋ฌธ์ œ

 

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

 

ํ’€์ด

ํ•ต์‹ฌ์€ ์–‘์ชฝ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” deque์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ๋‚˜์˜ค๋Š” ์‹œ์ ์„ ์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ ์กฐ๊ฑด์„ ๋†“์น˜๋ฉด ๋ฌด์กฐ๊ฑด ์˜ค๋‹ต์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ!

 

โ€ป ๊ธฐ๋ณธ ์•„์ด๋””์–ด: ์›์†Œ ์ด ํ•ฉ์ด ํฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์ž‘์€ ๋ฆฌ์ŠคํŠธ๋กœ ์›์†Œ๋ฅผ ์˜ฎ๊น€

 

1๏ธโƒฃ ํŠน์ • TC์—์„œ ์‹คํŒจํ•œ ์ฝ”๋“œ(11๋ฒˆ, 28๋ฒˆ)

 

1. ๊ฐ queue๋ฅผ deque์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๋ฆฌ์ŠคํŠธ ์ด ํ•ฉ์„ ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋‘”๋‹ค. 

2. sum(queue1), sum(queue2)์„ ๋น„๊ตํ•˜๋ฉด์„œ ํฐ ๊ณณ์—์„œ ์ž‘์€ ๊ณณ์œผ๋กœ ๊ฐ’ ์ด๋™ → ํฐ ๊ณณ์—์„œ popleft()

3. ๊ฐ’์ด ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค cnt += 1

4. ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์ด ๊ฐ™์•„์ง€๋ฉด break

 

์œ„์˜ ๋กœ์ง๋Œ€๋กœ ํ–ˆ๊ณ  ํฌ๊ฒŒ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ํŠน์ • TC์—์„œ ๊ณ„์† ์‹คํŒจํ•˜๊ธธ๋ž˜ ๊ณ ๋ฏผ์„ ๊ฝค๋‚˜ ํ–ˆ๋‹ค. '์งˆ๋ฌธํ•˜๊ธฐ'์—์„œ ์ฐพ์€ ๋ฐ˜๋ก€๋กœ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

from collections import deque

def solution(queue1, queue2):
    q1 = deque(queue1)
    q2 = deque(queue2)
    
    q1_sum = sum(q1)
    q2_sum = sum(q2)
    
    total = (q1_sum+q2_sum)//2

    cnt = 0
    
    # ์–ด๋–ป๊ฒŒ ํ•ด๋„ total์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
    if max(q1) > total or max(q2) > total:
        return -1
    
    while q1 and q2:
        if q1_sum > q2_sum:
            popped = q1.popleft()

            q1_sum -= popped
            q2_sum += popped
            
            cnt += 1
        elif q1_sum < q2_sum:
            popped = q2.popleft()
            
            # ์—†์„ ๊ฒฝ์šฐ ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ 2๋ฒˆ์—์„œ 6 ์ถœ๋ ฅ. 7 ๋˜๊ธฐ ์ „์— queue๊ฐ€ ๋น„๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒจ์„œ ๋ฐฉ์ง€์šฉ
            q1.append(popped)
            
            q1_sum += popped
            q2_sum -= popped
            
            cnt += 1
        else:
            break
        
    return cnt

 

2๏ธโƒฃ ํ†ต๊ณผ ์ฝ”๋“œ

 

์‹คํŒจ ์ฝ”๋“œ์™€ ๊ฐ€์žฅ ํฌ๊ฒŒ ๋‹ค๋ฅธ ์ ์€ ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ ์กฐ๊ฑด์ด ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€๋๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

[๋ฐ˜๋ก€]

queue1 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 10]

queue2 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

 

์œ„์˜ ๋ฆฌ์ŠคํŠธ๋“ค๋กœ VSCODE์—์„œ ํ…Œ์ŠคํŠธํ–ˆ๋”๋‹ˆ cnt ๊ฐ’์ด 20 ์ •๋„์˜€๋˜ ๊ฒƒ ๊ฐ™๋‹ค. append๋ฅผ q1์—์„œ๋งŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— q2๊ฐ€ ๋น„๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋ฉด while๋ฌธ์„ ๋ฐ”๋กœ ๋น ์ ธ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— cnt ๊ฐ’์ด ์ด์ƒํ•˜๊ฒŒ ๋‚˜์™€์„œ ์‹คํŒจํ•˜๋Š” ์ผ€์ด์Šค์˜€๋‹ค.

 

์•„๋ž˜ 2๊ฐ€์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

 

โ‘  q2์—๋„ append ์ถ”๊ฐ€ → cnt๊ฐ€ ์ œ๋Œ€๋กœ ์นด์šดํŠธ ๋˜๊ธฐ ์ „์— queue๊ฐ€ ๋น„๊ฒŒ ๋˜์–ด while๋ฌธ์„ ํƒˆ์ถœํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ 

โ‘ก โญ cnt ๊ฐ’์ด ๊ณ„์† ์ฆ๊ฐ€ํ•ด len(queue1)*4์™€ ๊ฐ™์•„์งˆ ๊ฒฝ์šฐ -1 return โญ

 

๐Ÿ‘€ len(queue1)*4 ์˜๋ฏธ

queue1๊ณผ queue2์˜ ์›์†Œ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ณผ์ •์ด len(queue1)*2๋งŒํผ ์ง„ํ–‰๋˜๋ฉด queue1๊ณผ queue2์˜ ์›์†Œ๊ฐ€ ์™„์ „ํžˆ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. ๊ทธ ์ƒํƒœ์—์„œ ์›์†Œ๋ฅผ ๋‹ค์‹œ len(queue1)*2๋งŒํผ ๋ฐ”๊พธ๋ฉด ์ดˆ๊ธฐ ์ƒํƒœ์™€ ๋˜‘๊ฐ™์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ์ด ํ•ฉ์ด ๊ฐ™์•„์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ค‘๊ฐ„์— ํ•ฉ์ด ๊ฐ™์•„์ง€๋Š” ๊ตฌ๊ฐ„์ด ์žˆ์–ด์„œ while๋ฌธ์„ ๋น ์ ธ๋‚˜์˜ค์ง€ ๋ชปํ•˜๊ณ  ๊ณ„์† ์›์†Œ๋งŒ ๋ฐ”๊พธ๋‹ค๊ฐ€ ๋ฐ”๊พผ ํšŸ์ˆ˜๊ฐ€ len(queue1)*4์™€ ๊ฐ™์•„์ง€๋ฉด -1์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

from collections import deque

def solution(queue1, queue2):
    q1 = deque(queue1)
    q2 = deque(queue2)
    
    q1_sum = sum(q1)
    q2_sum = sum(q2)
    
    total = (q1_sum+q2_sum)//2

    cnt = 0
    
    if max(q1) > total or max(q2) > total:
        return -1
    
    while q1 and q2:
        if q1_sum > q2_sum:
            popped = q1.popleft()
            
            q2.append(popped)
            
            q1_sum -= popped
            q2_sum += popped
            
            cnt += 1
        elif q1_sum < q2_sum:
            popped = q2.popleft()
            
            q1.append(popped)
            
            q1_sum += popped
            q2_sum -= popped
            
            cnt += 1
        else:
            break
        
        ######## ์ถ”๊ฐ€ํ•œ ๋ถ€๋ถ„ ########
        if cnt == len(q1)*4:
            cnt = -1
            break
            
    return cnt