← 파이썬 강의 목록으로
📇
실습 프로젝트 (Practice) · ★★
검색·수정·부분일치

Lv2 · 주소록

이름·전화·이메일을 저장하고 부분 일치 검색을 지원하는 주소록. dict 안의 dict 패턴을 다룹니다.

dict검색
소요 시간
2~3시간
난이도
📊 자료구조 활용
선수 조건
🎯 기초 7-8주차
결과물
중첩 dict 와 부분 일치 검색

이 강의에서 배우는 것

  • 1이름을 키로 한 중첩 dict 를 다룬다
  • 2부분 일치 검색을 case-insensitive 로 한다
  • 3정렬된 list 를 출력한다

데이터 모델

python
{"이름": {"phone": "...", "email": "..."}}

명령

  • add
  • find <키워드>
  • del <name>
  • list
  • quit

도전 과제

  • 같은 이름 처리 (자동 번호)
  • 전화번호 형식 검증

채점 체크리스트

  • 부분 일치
  • 정렬 출력
  • 잘못된 명령 안전

💻 예제 (examples)

실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.

solution.py전체 동작 코드
CODE
"""주소록 — 부분 일치 검색"""

contacts = {}

def add():
    name = input("이름: ").strip()
    if not name: return
    phone = input("전화: ").strip()
    email = input("이메일: ").strip()
    contacts[name] = {"phone": phone, "email": email}
    print("추가됨")

def find(query):
    matched = [(n, c) for n, c in contacts.items() if query.lower() in n.lower()]
    if not matched:
        print("없음"); return
    for name, c in matched:
        print(f"  {name} | {c['phone']} | {c['email']}")

def show_all():
    for name in sorted(contacts):
        c = contacts[name]
        print(f"  {name}: {c['phone']}, {c['email']}")

def main():
    while True:
        raw = input("\n명령(add/find <q>/del <name>/list/quit): ").strip()
        if not raw: continue
        parts = raw.split(maxsplit=1)
        cmd = parts[0]
        arg = parts[1] if len(parts) > 1 else ""
        if cmd == "quit": break
        elif cmd == "add": add()
        elif cmd == "find":
            if arg: find(arg)
            else: print("키워드 입력")
        elif cmd == "del":
            if arg in contacts:
                del contacts[arg]; print("삭제")
            else:
                print("없음")
        elif cmd == "list":
            show_all()

if __name__ == "__main__":
    main()
▶ 실행 결과
명령(add/find <q>/del <name>/list/quit): add
이름: 홍길동
전화: 010-1234-5678
이메일: hong@x.com
추가됨
명령: find 길동
  홍길동 | 010-1234-5678 | hong@x.com

📝 과제 (exercises)

직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.

과제 1

프로젝트 구현

목표: 위 사양대로 직접 작성한다.

요구사항
  • 중첩 dict
  • 부분 일치 (소문자 비교)
  • 5개 명령
💡 힌트

query.lower() in n.lower()

입출력 예시
홍길동 | 010-1234-5678 | hong@x.com
채점
  • · 검색 정확
  • · 정렬 출력
정답 코드 펼치기 / 접기
SOLUTION
# 위 solution.py 와 동일
▶ 실행 결과
(예제 참고)
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗