Python/Chapter09. 다차원 리스트, 딕셔너리

lullaby ·2025년 10월 1일

Python

목록 보기
9/13
post-thumbnail

1. 다차원 리스트 (2D Lists)

1.1 개념 정리

2차원 리스트란?

  • 리스트 안에 리스트가 포함된 형태의 자료구조
  • 행렬(matrix), 표(table) 등의 데이터를 표현할 때 사용
  • 행(row)과 열(column)을 이용하여 데이터에 접근

2차원 리스트 생성 방법

  1. 직접 정의
s = [
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 10],
    [11, 12, 13, 14, 15]
]
  1. 동적 생성 (반복문 활용)
rows = 3
cols = 5
s = []
for row in range(rows):
    s += [[0] * cols]  # 중요: [0] * cols는 0으로 채워진 cols 길이의 1차원 리스트
  1. 리스트 내포(List Comprehension) 활용
rows = 6
cols = 6
table = [[0] * cols for i in range(rows)]

1.2 2차원 리스트 접근 방법

인덱싱을 통한 접근

s = [
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 10],
    [11, 12, 13, 14, 15]
]
print(s[0])     # 첫 번째 행 전체: [1, 2, 3, 4, 5]
print(s[1][2])  # 두 번째 행, 세 번째 열: 8

반복문을 이용한 2차원 리스트 순회

rows = len(s)        # 행의 개수
cols = len(s[0])     # 열의 개수

for r in range(rows):
    for c in range(cols):
        print(s[r][c], end=" ")
    print()  # 한 행이 끝나면 줄바꿈

1.3 다양한 형식의 데이터를 저장한 다차원 리스트

list = [["Seoul", 10], ["Paris", 12], ["London", 50]]
# 리스트 안에 문자열과 숫자를 함께 저장할 수 있음

# 문자열에 대한 인덱싱도 가능
print(list[0][0][0])  # "Seoul"의 첫 번째 글자: 'S'
# 더 복잡한 다차원 리스트
list = ["atom", ["bold", ["crew", ["date", "easy", 45]]]]

2. 딕셔너리 (Dictionary)

2.1 개념 정리

딕셔너리란?

  • 키(key)와 값(value)의 쌍으로 이루어진 자료구조
  • 순서가 없고, 키를 통해 값에 접근
  • 키는 중복될 수 없고, 값은 중복될 수 있음

딕셔너리 생성 방법

  1. 중괄호를 이용한 직접 정의
contacts = {'Kim': '01012345678', 'Park': '01012345679', 'Lee': '01012345680'}
  1. dict() 함수 활용
dic = dict()
dic['kim'] = 23
dic[20001] = 22  # 키는 문자열뿐만 아니라 정수형도 가능

2.2 딕셔너리 조작 방법

get(key, default value) ⇒ key의 value를 리턴함(키가 없으면 디폴트 밸류 출력)

데이터 검색

contacts = {'Kim': '01012345678', 'Park': '01012345679', 'Lee': '01012345680'}
print(contacts['Kim'])                 # '01012345678' (키가 없으면 오류)
print(contacts.get('Kim'))             # '01012345678'
print(contacts.get('Choi'))            # None (키가 없어도 오류 없음)
print(contacts.get('Choi', "없음"))     # '없음' (키가 없을 때 기본값 설정)

키 존재 여부 확인

if "Kim" in contacts:
    print("키가 딕셔너리에 있음")

데이터 추가/수정

contacts['Choi'] = '01056781234'  # 새 항목 추가
contacts['Kim'] = '01099998888'   # 기존 항목 수정

데이터 삭제

phone = contacts.pop("Kim")  # 'Kim' 항목을 삭제하고 값을 반환

2.3 딕셔너리 순회 방법

items() 메소드 활용(for i 도 가능): key, value 함께 출력함

scores = {'Korean': 80, 'Math': 90, 'English': 80}
for item in scores.items():
    print(item)  # ('Korean', 80), ('Math', 90), ('English', 80)

keys() 메소드 활용

for key in scores.keys():
    print(key)  # 'Korean', 'Math', 'English'

values() 메소드 활용

for value in scores.values():
    print(value)  # 80, 90, 80

3. 예상 문제 및 풀이

문제 1: 주사위 합계 테이블 만들기

두 개의 주사위를 굴렸을 때 나오는 숫자의 합을 6x6 크기의 2차원 리스트로 만드는 프로그램을 작성하세요.

풀이:

# 6x6 크기의 2차원 리스트 생성
rows = 6
cols = 6
table = [[0] * cols for i in range(rows)]

# 각 칸에 주사위 합계 저장
for row in range(rows):
    for col in range(cols):
        table[row][col] = (row+1) + (col+1)

# 결과 출력
print(" ||", end=" ")
for c in range(1, 7):
    print("%3d" % (c), end=" ")
print()
print("="*40)

for r in range(6):
    print(r+1, "|| ", end="")
    for c in range(6):
        print("%3d" % table[r][c], end=" ")
    print()

문제 2: 학생 성적 관리 프로그램

학생의 이름과 성적을 딕셔너리로 관리하고, 평균 점수를 계산하는 프로그램을 작성하세요.

풀이:

# 학생 성적 딕셔너리 생성
students = {
    '김철수': {'국어': 90, '영어': 85, '수학': 95},
    '이영희': {'국어': 78, '영어': 88, '수학': 92},
    '박민수': {'국어': 92, '영어': 96, '수학': 98}
}

# 각 학생의 평균 점수 계산 및 출력
for name, scores in students.items():
    total = sum(scores.values())
    average = total / len(scores)
    print(f"{name}의 평균 점수: {average:.2f}")

# 과목별 평균 점수 계산
subjects = ['국어', '영어', '수학']
for subject in subjects:
    total = 0
    for student in students.values():
        total += student[subject]
    average = total / len(students)
    print(f"{subject} 과목 평균: {average:.2f}")

문제 3: 영한 사전 확장하기

영단어를 키로, 한글 설명을 값으로 하는 영한 사전을 만들고, 단어 추가, 삭제, 검색 기능을 구현하세요.

풀이:

def create_dictionary():
    english_dict = {
        'one': '하나',
        'two': '둘',
        'three': '셋',
        'four': '넷',
        'five': '다섯'
    }
    return english_dict

def add_word(dictionary):
    eng = input("추가할 영단어를 입력하세요: ")
    kor = input("단어의 뜻을 입력하세요: ")
    dictionary[eng] = kor
    print(f"'{eng}: {kor}'가 사전에 추가되었습니다.")

def delete_word(dictionary):
    eng = input("삭제할 영단어를 입력하세요: ")
    if eng in dictionary:
        meaning = dictionary.pop(eng)
        print(f"'{eng}: {meaning}'가 사전에서 삭제되었습니다.")
    else:
        print(f"'{eng}'는 사전에 없습니다.")

def search_word(dictionary):
    eng = input("검색할 영단어를 입력하세요: ")
    meaning = dictionary.get(eng, "사전에 등록된 정보가 없음")
    print(f"{eng}: {meaning}")

def print_all(dictionary):
    print("\n--- 영한 사전 전체 단어 ---")
    for eng, kor in dictionary.items():
        print(f"{eng}: {kor}")

def main():
    dictionary = create_dictionary()

    while True:
        print("\n=== 영한 사전 프로그램 ===")
        print("1. 단어 검색")
        print("2. 단어 추가")
        print("3. 단어 삭제")
        print("4. 전체 단어 출력")
        print("5. 종료")

        choice = input("메뉴를 선택하세요: ")

        if choice == '1':
            search_word(dictionary)
        elif choice == '2':
            add_word(dictionary)
        elif choice == '3':
            delete_word(dictionary)
        elif choice == '4':
            print_all(dictionary)
        elif choice == '5':
            print("프로그램을 종료합니다.")
            break
        else:
            print("잘못된 메뉴입니다. 다시 선택해주세요.")

if __name__ == "__main__":
    main()

문제 4: 도시별 인구 데이터 분석

도시 이름과 인구수를 저장한 2차원 리스트를 만들고, 인구가 많은 순서대로 정렬하여 출력하는 프로그램을 작성하세요.

풀이:

# 도시별 인구 데이터 (도시명, 인구수(만 명))
cities = [
    ["Seoul", 980],
    ["Busan", 340],
    ["Incheon", 290],
    ["Daegu", 240],
    ["Daejeon", 150],
    ["Gwangju", 145],
    ["Ulsan", 115],
    ["Suwon", 120]
]

# 인구수(두 번째 요소)를 기준으로 내림차순 정렬
cities.sort(key=lambda x: x[1], reverse=True)

# 결과 출력
print("=== 인구가 많은 순서 ===")
print("순위\t도시명\t인구수(만 명)")
for i, city in enumerate(cities, 1):
    print(f"{i}\t{city[0]}\t{city[1]}")

# 인구수 평균 계산
total_population = sum(city[1] for city in cities)
average = total_population / len(cities)
print(f"\n도시 평균 인구: {average:.2f}만 명")

# 평균보다 인구가 많은 도시 찾기
print("\n평균보다 인구가 많은 도시:")
for city in cities:
    if city[1] > average:
        print(f"{city[0]}: {city[1]}만 명")

파이썬 기말고사 대비 실전 문제

다차원 리스트 문제

문제 1: 행렬 덧셈

두 개의 2차원 리스트(행렬)를 입력받아 같은 위치의 원소를 더한 새로운 행렬을 반환하는 함수를 작성하세요.

예시:
matrix_A = [[1, 2, 3], [4, 5, 6]]
matrix_B = [[7, 8, 9], [10, 11, 12]]

결과: [[8, 10, 12], [14, 16, 18]]

문제 2: 성적표 만들기

학생들의 이름과 각 과목(국어, 영어, 수학) 점수를 입력받아 성적표를 출력하는 프로그램을 작성하세요. 각 학생별 총점과 평균, 그리고 과목별 평균도 함께 출력하세요.

예시 입력:
students = [
    ["김철수", 85, 90, 95],
    ["이영희", 90, 85, 80],
    ["박민수", 75, 80, 85]
]

예시 출력:
이름    국어  영어  수학  총점  평균
김철수  85   90   95   270   90.0
이영희  90   85   80   255   85.0
박민수  75   80   85   240   80.0
과목평균 83.3 85.0 86.7

문제 3: 행렬 회전

N x N 크기의 2차원 리스트(행렬)를 시계 방향으로 90도 회전시키는 함수를 작성하세요.

예시:
원본 행렬:
1 2 3
4 5 6
7 8 9

90도 회전 후:
7 4 1
8 5 2
9 6 3

딕셔너리 문제

문제 4: 단어 빈도수 계산

주어진 문장에서 각 단어의 등장 횟수를 계산하여 딕셔너리로 반환하는 함수를 작성하세요. 대소문자는 구분하지 않고, 특수문자는 제외합니다.

예시:
sentence = "Python is easy to learn. Python is popular and Python is powerful."

결과: {'python': 3, 'is': 3, 'easy': 1, 'to': 1, 'learn': 1, 'popular': 1, 'and': 1, 'powerful': 1}

문제 5: 투표 결과 집계

선거에서 투표한 결과를 리스트로 받아, 각 후보자별 득표수를 딕셔너리로 반환하고, 가장 많은 표를 받은 후보자를 출력하는 프로그램을 작성하세요.

예시:
votes = ["김후보", "이후보", "김후보", "박후보", "이후보", "김후보", "최후보", "김후보", "이후보", "박후보"]

결과:
투표 결과: {'김후보': 4, '이후보': 3, '박후보': 2, '최후보': 1}
당선인: 김후보 (4표)

문제 6: 학생 성적 관리

학생들의 성적을 관리하는 프로그램을 작성하세요. 다음 기능을 구현하세요:

  1. 학생 추가: 이름과 성적(국어, 영어, 수학)을 입력받아 딕셔너리에 저장
  2. 학생 검색: 이름으로 학생을 검색하여 성적 정보 출력
  3. 전체 학생 출력: 모든 학생의 이름과 성적, 평균 출력
  4. 평균 순위로 정렬하여 출력

복합 문제

문제 7: 도서 관리 시스템

도서관에서 사용할 도서 관리 시스템을 구현하세요. 다음 기능을 포함해야 합니다:

  1. 도서 등록: 제목, 저자, 출판년도, 장르 정보를 딕셔너리로 저장
  2. 도서 검색: 제목 또는 저자로 도서 검색
  3. 도서 대출/반납 처리: 대출 상태를 관리하고 대출 중인 도서 목록 확인
  4. 장르별 도서 목록 출력: 특정 장르의 모든 도서를 출력

문제 8: 주간 일정 관리

요일별 일정을 관리하는 프로그램을 작성하세요. 2차원 리스트와 딕셔너리를 활용하여 다음 기능을 구현하세요:

  1. 일정 추가: 요일, 시간, 일정 내용을 입력받아 저장
  2. 일정 삭제: 요일과 시간을 입력받아 해당 일정 삭제
  3. 요일별 일정 출력: 특정 요일의 모든 일정을 시간순으로 출력
  4. 주간 요약: 전체 주간 일정을 표 형식으로 출력

답안 작성 제출 양식

문제 풀이 시, 다음 형식으로 답안을 작성하세요:

  1. 문제 이해: 문제가 요구하는 사항을 자신의 말로 간략히 설명
  2. 알고리즘/접근법: 문제 해결을 위한 접근 방식 설명
  3. 코드 구현: 파이썬 코드 작성
  4. 결과 확인: 예시 입력값으로 실행한 결과
  5. 코드 설명: 주요 부분에 대한 간략한 설명

0개의 댓글