๐Ÿงฉ Algorithm/SWEA

[SWEA] 9280. ์ง„์šฉ์ด๋„ค ์ฃผ์ฐจํƒ€์›Œ (Python/D3)

devCloud 2024. 11. 14. 22:26
728x90

[๋ฌธ์ œ ๋งํฌ] ๐Ÿ‘‡

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


ํ’€์ด ๋ฐฉ๋ฒ•

์ฃผ์ฐจ์žฅ๊ณผ ๋Œ€๊ธฐ์—ด ์„ค์ •

  • ์ฃผ์ฐจ์žฅ ๋ฆฌ์ŠคํŠธ, ๋Œ€๊ธฐ์—ด ๋ฆฌ์ŠคํŠธ, ์ฃผ์ฐจ ์š”๊ธˆ์„ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ฐจ๋Ÿ‰ ์ž…์ถœ์ฐจ ์ฒ˜๋ฆฌ

  • ์ฐจ๋Ÿ‰์ด ์ž…์ฐจํ•  ๋•Œ(car > 0)
    • ์ฃผ์ฐจ์žฅ์— ์—ฌ์œ ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(0 in parking) ๋น„์–ด์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ์ฃผ์ฐจ ๊ณต๊ฐ„์— ์ฐจ๋Ÿ‰์„ ์ €์žฅํ•˜๊ณ  ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•œ๋‹ค.
    • ์ฃผ์ฐจ์žฅ์ด ๊ฐ€๋“ ์ฐฌ ๊ฒฝ์šฐ(0 not in parking) ํ•ด๋‹น ์ฐจ๋Ÿ‰์„ ๋Œ€๊ธฐ์—ด ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ์ฐจ๋Ÿ‰์ด ์ถœ์ฐจํ•  ๋•Œ(car < 0)
    • ์ฃผ์ฐจ์žฅ ๋ฆฌ์ŠคํŠธ์—์„œ ๋‚˜๊ฐ€๋Š” ์ฐจ๋Ÿ‰์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„ ํ•ด๋‹น ๊ณต๊ฐ„์„ ๋น„์šด๋‹ค. (index() ์‚ฌ์šฉ)
      • ํ•ด๋‹น ๊ณต๊ฐ„์„ 0์œผ๋กœ ๋งŒ๋“ ๋‹ค.
    • ๋Œ€๊ธฐ ์ค‘์ธ ์ฐจ๋Ÿ‰์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๋Œ€๊ธฐ ์ฐจ๋Ÿ‰ ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ๋Œ€๊ธฐํ•œ ์ฐจ๋Ÿ‰ ์ฆ‰, ๋Œ€๊ธฐ์—ด ๋ฆฌ์ŠคํŠธ์— ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๊บผ๋‚ธ๋‹ค.
    • ์ถœ์ฐจํ•œ ์ฐจ๋Ÿ‰์ด ์žˆ๋˜ ์ฃผ์ฐจ ๊ณต๊ฐ„์— ์ฐจ๋Ÿ‰์„ ์ €์žฅํ•˜๊ณ , ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•œ๋‹ค.

๊ฒฐ๊ณผ ์ถœ๋ ฅ

  • ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ๋ˆ„์ ๋œ ์š”๊ธˆ์„ ์ถœ๋ ฅํ•œ๋‹ค.

Solution

T = int(input())  # ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜
for test_case in range(1, T + 1):
    N, M = map(int, input().split())  # ์ฃผ์ฐจ ๊ณต๊ฐ„, ์ฐจ๋Ÿ‰ ์ˆ˜
    R = [int(input()) for _ in range(N)]  # ๋‹จ์œ„ ๋ฌด๊ฒŒ๋‹น ๊ธˆ์•ก
    W = [int(input()) for _ in range(M)]  # ์ฐจ๋Ÿ‰ ๋ฌด๊ฒŒ

    parking = [0]*N  # ์ฃผ์ฐจ์žฅ
    waiting = []  # ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์ฐจ๋Ÿ‰
    result = 0  # ์ฃผ์ฐจ ์š”๊ธˆ

    for _ in range(M * 2):
        car = int(input())  # ์ฐจ๋Ÿ‰ ์ถœ์ž… ์ˆœ์„œ

        if car > 0:  # ๋“ค์–ด์˜ค๋Š” ์ฐจ๋Ÿ‰์ผ ๋•Œ
            if 0 not in parking:  # ์ฃผ์ฐจ ๊ณต๊ฐ„์ด ์—†์œผ๋ฉด ๋Œ€๊ธฐ์‹œํ‚ค๊ธฐ
                waiting.append(car)
            else:
                for i in range(N):  # ์ฃผ์ฐจ ๊ณต๊ฐ„ ํƒ์ƒ‰
                    if parking[i] == 0:  # ์ฃผ์ฐจ ๊ณต๊ฐ„์ด ๋น„์–ด์žˆ์œผ๋ฉด
                        parking[i] = car  # ์ฃผ์ฐจ ์‹œํ‚ค๊ธฐ
                        result += R[i] * W[car - 1]  # ์š”๊ธˆ ๊ณ„์‚ฐ
                        break

        else:  # ๋‚˜๊ฐ€๋Š” ์ฐจ๋Ÿ‰์ผ ๋•Œ
            now_idx = parking.index(abs(car))  # ๋‚˜๊ฐ€๋Š” ์ฐจ๋Ÿ‰ ์ธ๋ฑ์Šค
            parking[now_idx] += car  # ํ•ด๋‹น ์ฐจ๋Ÿ‰์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค ์ฐพ์•„์„œ 0์œผ๋กœ ๋งŒ๋“ค๊ธฐ
            if len(waiting) != 0:  # ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ์ฐจ๋Ÿ‰์ด ์žˆ์„ ๋•Œ ์ฃผ์ฐจ์‹œํ‚ค๊ธฐ
                waiting_car = waiting.pop(0)
                parking[now_idx] = waiting_car  # ์ฃผ์ฐจ์‹œํ‚ค๊ธฐ
                result += R[now_idx] * W[waiting_car - 1]  # ์š”๊ธˆ ๊ณ„์‚ฐ

    print(f"#{test_case} {result}")

 

 

๊ฐœ์„ ํ•  ์ 

  • ์ถœ์ฐจ ์ฒ˜๋ฆฌ ๊ฐœ์„ 
    • car๊ฐ€ ์ถœ์ฐจ์ผ ๋•Œ, parking[now_idx] += car๋กœ ๋‹ค์‹œ ๋”ํ•ด 0์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹ , parking[now_idx] = 0์œผ๋กœ ๋ช…ํ™•ํžˆ ๋น„์›Œ์ฃผ๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค.
  • ์ถœ์ž… ์ˆœ์„œ ์ž…๋ ฅ ๊ด€๋ฆฌ
    • car์˜ ์ถœ์ž… ์ˆœ์„œ ์ž…๋ ฅ์„ ๋ฏธ๋ฆฌ ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ž…์ถœ๋ ฅ์„ ์ค„์—ฌ ์ฝ”๋“œ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต ์ค„์ด๊ธฐ
    • 0 not in parking์œผ๋กœ ๊ณต๊ฐ„์ด ์—†์Œ์„ ํ™•์ธํ•˜๊ณ  waiting์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, parking ๋ฆฌ์ŠคํŠธ์˜ ๋นˆ ๊ณต๊ฐ„์„ next_free_space์™€ ๊ฐ™์€ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๊ฐœ์„ ๋œ ์ฝ”๋“œ

T = int(input())  # ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜
for test_case in range(1, T + 1):
    # ๋™์ผ
    for _ in range(M * 2):
        car = int(input())  # ์ฐจ๋Ÿ‰ ์ถœ์ž… ์ˆœ์„œ

        if car > 0:  # ๋“ค์–ด์˜ค๋Š” ์ฐจ๋Ÿ‰์ผ ๋•Œ
            parked = False
            for i in range(N):  # ์ฃผ์ฐจ ๊ณต๊ฐ„ ํƒ์ƒ‰
                if parking[i] == 0:  # ์ฃผ์ฐจ ๊ณต๊ฐ„์ด ๋น„์–ด์žˆ์œผ๋ฉด
                    parking[i] = car  # ์ฃผ์ฐจ ์‹œํ‚ค๊ธฐ
                    result += R[i] * W[car - 1]  # ์š”๊ธˆ ๊ณ„์‚ฐ
                    parked = True
                    break
            if not parked:  # ์ฃผ์ฐจ ๊ณต๊ฐ„์ด ์—†์œผ๋ฉด ๋Œ€๊ธฐ์‹œํ‚ค๊ธฐ
                waiting.append(car)

        else:  # ๋‚˜๊ฐ€๋Š” ์ฐจ๋Ÿ‰์ผ ๋•Œ
            car = abs(car)
            now_idx = parking.index(car)  # ๋‚˜๊ฐ€๋Š” ์ฐจ๋Ÿ‰ ์ธ๋ฑ์Šค
            parking[now_idx] = 0  # ํ•ด๋‹น ๊ณต๊ฐ„ ๋น„์šฐ๊ธฐ
            if waiting:  # ๋Œ€๊ธฐ ์ฐจ๋Ÿ‰์ด ์žˆ์œผ๋ฉด ์ฃผ์ฐจ์‹œํ‚ค๊ธฐ
                waiting_car = waiting.pop(0)
                parking[now_idx] = waiting_car
                result += R[now_idx] * W[waiting_car - 1]  # ์š”๊ธˆ ๊ณ„์‚ฐ

    print(f"#{test_case} {result}")

๐Ÿ‘ฉ‍๐Ÿ’ป ํšŒ๊ณ 

์ด ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ๋‹ต์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚˜์˜ค์ง€ ์•Š์•˜๋˜ ์ ์ด ์žˆ์—ˆ๋‹ค. ๋‹ค์Œ์€ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์„ ๋•Œ์˜ ์ฝ”๋“œ์ด๋‹ค.

 

1. ์ฐจ๋Ÿ‰ ์ถœ์ฐจ ์‹œํ‚ฌ ๋•Œ

parking[now_idx] -= car
  • ์ถœ์ฐจํ•˜๋Š” ์ฐจ๋Ÿ‰์€ ์Œ์ˆ˜์ธ๋ฐ -(๋งˆ์ด๋„ˆ์Šค) ๋ฅผ ํ•ด๋ฒ„๋ฆฌ๋ฉด +(ํ”Œ๋Ÿฌ์Šค) ๊ฐ€ ๋˜์–ด์„œ 0์ด ๋˜์ง€ ์•Š๊ณ  ๊ฐ’์ด ๋”ํ•ด์ง„๋‹ค.
  • ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์„œ ๋งˆ์ด๋„ˆ์Šค ํ•  ๊ฑฐ๋‹ˆ๊น ๊ทธ๋Œ€๋กœ - ๋ฅผ ํ–ˆ๋”๋‹ˆ ๊ฐ’์ด ์ฆ๊ฐ€ ๋๋‹ค.

2. ์š”๊ธˆ ๊ณ„์‚ฐ ์‹œ ์ธ๋ฑ์Šค 

result += R[i] * W[car]
result += R[now_idx] * W[waiting_car]
  • ๋ฆฌ์ŠคํŠธ ์ธ๋ฑ์Šค๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š”๋ฐ ์ฐจ๋Ÿ‰์„ ๊ทธ๋Œ€๋กœ ์ธ๋ฑ์Šค์— ์ง‘์–ด๋„ฃ์–ด์„œ IndexError ๊ฐ€ ๋–ด๋‹ค.

3. ์ฃผ์ฐจ ๊ณต๊ฐ„์ด ์—†์„ ๋•Œ

if 0 not in parking:  # ์ฃผ์ฐจ ๊ณต๊ฐ„์ด ์—†์œผ๋ฉด ๋Œ€๊ธฐ์‹œํ‚ค๊ธฐ
    waiting.append(car)
  • ์ด ์ฝ”๋“œ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ์ˆœ์„œ๊ฐ€ ์ž˜๋ชป ๋์—ˆ๋‹ค.
  • ์ฃผ์ฐจ ๊ณต๊ฐ„์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฃจํ”„๋ฌธ ์•„๋ž˜์— ์ด ์ฝ”๋“œ๋ฅผ ๋„ฃ์—ˆ๋”๋‹ˆ ์ฐจ๋Ÿ‰์„ ์ฃผ์ฐจ์‹œํ‚ค๊ณ  ๋‚œ ํ›„์— ์ด ์กฐ๊ฑด์„ ํ™•์ธํ•˜๊ฒŒ ๋ผ์„œ ์ฃผ์ฐจ๋ฅผ ์‹œ์ผฐ์Œ์—๋„ ํ•ด๋‹น ์ฐจ๋Ÿ‰์ด ๋Œ€๊ธฐ์—ด๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค.

 

์ด๋Ÿฐ ๋ฌธ์ œ๋“ค ๋•Œ๋ฌธ์— ์ฐจ๋Ÿ‰์ด ์ถœ์ž…ํ•˜๊ณ  ์ถœ์ฐจํ•˜๋Š” ๊ณผ์ •์„ ์ผ์ผ์ด ์ถœ๋ ฅํ•ด๋ณด๋ฉด์„œ ํ™•์ธํ–ˆ๋‹ค. ๋•๋ถ„์— ๋ฌธ์ œ๋ฅผ ๋ฐ”๋กœ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ž˜ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ง€๋ฌธ ์„ค๋ช…์ด ์•„์ฃผ ์ž˜ ๋ผ ์žˆ๊ณ  ๋‹จ์ˆœ ๊ตฌํ˜„์ด๋ผ ์„ค๋ช…ํ•˜๋Š”๋Œ€๋กœ๋งŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์„๋งŒํ•œ ๋ฌธ์ œ์˜€๋‹ค.


 

728x90