크래프톤 정글/정글에서 문제풀기

[정글 베이직 19] — 해시 테이블 · 성적 관리

cedis 2026. 3. 13. 17:18

📋 문제 소개

문제 설명

해시 테이블(딕셔너리)을 사용하여 학생 성적을 관리한다. Key-Value 쌍으로 빠른 검색, 삽입, 삭제가 가능하다. 파이썬의 dict는 내부적으로 해시 테이블로 구현되어 있다.

INPUT

학생 이름과 점수로 구성된 딕셔너리 students

OUTPUT

평균 점수, 최고 점수 학생 이름, 최고 점수 / 특정 학생 점수 조회

예제

입력

students = {Alice:85, Bob:92, Charlie:78, David:95}

출력

평균: 87.5 최고: David (95점)

💡 힌트

평균: sum(scores.values())/len(scores). 최고점: max(scores, key=scores.get).

① 문제 이해

항목 내용
문제 딕셔너리로 학생 성적을 관리한다 (평균, 최고점, 조회).
자료구조 파이썬 dict = 내부적으로 해시 테이블 구현
예제 Alice:85, Bob:92, Charlie:78, David:95 → 평균 87.5, 최고 David

② 핵심 아이디어

해시 테이블은 key를 해시 함수로 변환해 배열 인덱스로 직접 접근한다. 검색/삽입/삭제가 평균 O(1)이다. 파이썬 dict가 바로 이 구조다.

# 평균 계산
avg = sum(students.values()) / len(students)

# 최고점 학생 찾기
top = max(students, key=students.get)  # 값 기준 최대 키 반환

# 안전한 조회
score = students.get("Alice")   # 없으면 None (KeyError 없음)
score = students["Alice"]       # 없으면 KeyError ❌

③ 코드 분석

def manage_grades(students):
    average     = sum(students.values()) / len(students)  # ①
    top_student = max(students, key=students.get)          # ②
    top_score   = students[top_student]                    # ③
    return average, top_student, top_score

def find_student_score(students, name):
    return students.get(name)     # ④ 없으면 None — 안전
번호 코드 의미
sum(students.values()) 모든 점수(value) 합산
max(students, key=students.get) 값(점수) 기준으로 가장 큰 키(이름)를 반환하는 파이썬 관용구
students[top_student] 키가 확실히 존재하므로 [] 접근 OK
students.get(name) 키 없으면 None 반환 — KeyError 방지

④ 자주 하는 실수

❌ students[name] — KeyError

키가 없을 때 students[name] 은 KeyError를 발생시킨다. 존재 여부가 불확실할 때는 students.get(name) 또는 name in students 를 쓴다.

⚠️ 해시 충돌

서로 다른 키가 같은 해시값을 가질 수 있다(해시 충돌). 파이썬은 내부적으로 충돌을 처리해주지만, 최악의 경우 O(n)이 될 수 있다.

💡 max(d, key=d.get) 은 인터뷰에서 자주 쓰이는 파이썬 관용구다. 'value가 가장 큰 key를 찾아라' → 이 한 줄로 해결.

⑤ 시간복잡도

연산 시간 이유
검색/삽입/삭제 평균 O(1) 해시 함수로 인덱스 직접 계산
최악 검색 O(n) 해시 충돌 시 선형 탐색 (드문 경우)
전체 순회 O(n) 모든 key/value를 한 번씩 방문

⑥ 핵심 정리

  • 파이썬 dict = 해시 테이블. 검색/삽입/삭제 평균 O(1).
  • 안전한 조회: .get(key) — 없으면 None, 에러 없음.
  • 최대/최소 key 찾기: max(d, key=d.get).
  • week1 01번 문제에서 이미 썼던 패턴이다 — 이제 왜 빠른지 이해가 됐을 것이다.