본문 바로가기
Programming Languages/Python

[파이썬 코딩 테스트] 재고 관리와 Dictionary

by Henry Cho 2026. 2. 16.

포스트 난이도: HOO_Junior


#  재고 관리 예제를 통한 Dictionary (딕셔너리) 사용법

아래의 예제코드는 재고 관리를 하는 상황을 통해서 Dictionary (딕셔너리) 사용방법과 선언된 클래스를 import 해서 가져와 사용하는 방법을 대해서 살펴볼 수 있다. 해당 문제의 유형이 나오는 이유는 데이터 처리에 대한 추론 능력을 살펴보기 위해서이다. 

 


class InventoryManager:
    def __init__(self):
        self.inventory = {}

    def add_product(self, product_id: str, name: str, quantity: int) -> bool:
        if product_id in self.inventory:
            self.inventory[product_id]['quantity'] += quantity
        else:
            self.inventory[product_id] = {'name': name, 'quantity': quantity}
        return True

    def remove_product(self, product_id: str, quantity: int) -> bool:
        if product_id not in self.inventory:
            return False
        if self.inventory[product_id]['quantity'] <= quantity:
            del self.inventory[product_id]
        else:
            self.inventory[product_id]['quantity'] -= quantity
        return True

    def check_stock(self, product_id: str) -> int | None:
        if product_id not in self.inventory:
            return None
        return self.inventory[product_id]['quantity']
    
    def products_to_restock (self, threshold: int) -> list[str]:
        restock_list = []
        for product_ids, info in self.inventory.items():
            if info['quantity'] < threshold:
                restock_list.append(product_ids)
        restock_list.sort()
        return restock_list

import os
import sys
import unittest

currentdir = os.path.dirname(os.path.abspath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0, parentdir)

from solution import InventoryManager

class SolutionTests(unittest.TestCase):
    
    def test1(self):
        inventory = InventoryManager()
        inventory.add_product("p1", "Kiwis", 100)
        inventory.add_product("p2", "Bananas", 50)
        inventory.add_product("p3", "Oranges", 30)
        self.assertEqual(inventory.products_to_restock(4), ["p3"])

    def test2(self):
        inventory = InventoryManager()
        inventory.add_product("p1", "Kiwis", 100)
        inventory.add_product("p2", "Bananas", 50)
        inventory.remove_product("p2", 6)
        self.assertEqual(inventory.products_to_restock(6), [])

    def test3(self):
        inventory = InventoryManager()
        inventory.add_product("p1", "Kiwis", 100)
        inventory.add_product("p2", "Bananas", 50)
        self.assertEqual(inventory.check_stock("p1"), 10)
        self.assertEqual(inventory.check_stock("p2"), 5)
        self.assertEqual(inventory.products_to_restock(7), ["p2"])

    def test4(self):
        inventory = InventoryManager()
        inventory.add_product("p1", "Kiwis", 16)
        inventory.add_product("p2", "Bananas", 26)
        inventory.add_product("p3", "Oranges", 36)
        inventory.add_product("p4", "Dates", 4)
        self.assertEqual(inventory.products_to_restock(3), ["p1", "p2"])

    def test5(self):
        inventory = InventoryManager()
        inventory.add_product("p1", "Kiwis", 17)
        inventory.add_product("p2", "Bananas", 27)
        inventory.add_product("p3", "Oranges", 38)
        inventory.remove_product("p2", 15)
        self.assertEqual(inventory.products_to_restock(10), ["p2"])

    def test6_empty_inventory(self):
        inventory = InventoryManager()
        self.assertEqual(inventory.products_to_restock(5), [])

    def test7_no_products_below_threshold(self):
        inventory = InventoryManager()
        inventory.add_product("p1", "Kiwis", 100)
        inventory.add_product("p2", "Bananas", 120)
        inventory.add_product("p3", "Oranges", 150)
        self.assertEqual(inventory.products_to_restock(5), [])

    def test8_products_to_restock_sorted(self):
        inventory = InventoryManager()
        inventory.add_product("p3", "Cherries", 30)
        inventory.add_product("p1", "Kiwis", 10)
        inventory.add_product("p2", "Bananas", 20)
        self.assertEqual(inventory.products_to_restock(4), ["p1", "p2", "p3"])

if __name__ == '__main__':
    unittest.main()

 


위의 예제코드는 두 파트로 나눠져 있는걸 알 수 있다. 첫 번째 코드는 기능을 정의하는 클래스이고 두 번째 코드는 parameters (매개변수)와 수량을 선언해서 첫 번째 기능 클래스를 활용하고 있다. 우리가 라이브러리를 가져와 사용하듯이 정의된 클래스도 from과 import로 가져올 수가 있다. 구조는 from py파일명 import 클래스명으로 정의해서 사용이 가능하다. 그 뒤에는 클래스를 다시 해당 코드 내에서 재선언해 주는데, 예를 들면 inventory = inventoryManger() 이런 식으로 정의가 되어 있는 걸 볼 수 있다. 이후에는 inventory.add_product()과 같이 첫 번째 코드 inventoryManager()에 있는 def으로 정의된 기능을 가져와 사용하면 된다.

 

두 번째로 딕셔너리인데, 위의 첫 번째 코드를 살펴보면 self.inventory [product_id] = 로 작성이 되어있다. 이를 통해서 딕셔너리 안에 있는 배열에 추가를 하거나 제거하는데 활용이 된다. 두 개 이상의 데이터를 처리하는 경우 {}를 통해서 관리가 가능하며, def add_product에서 과일 이름과 수량이 추가될 때 사용되고 있는 걸 확인할 수가 있다.


 

728x90

댓글