[자료구조 문제풀이] 리스트, 튜플, 딕셔너리

이수연·2024년 6월 22일
0

< 리스트 >

1. 1부터 사용자가 입력한 숫자까지의 약수와 소수를 리스트에 각각 저장하고, 이것을 출력하는 프로그램을 만들어보자.

num = int(input("1보다 큰 정수 입력: "))
listA = [] # 약수: 나누어 떨어지는 수
listB = [] # 소수: 1과 자신만 약수로 가지고 있는 수
#약수
for n in range(1, num+1):
    if n == 1:
        listA.append(n)
    else:
        if num % n == 0:
            listA.append(n)
# 소수
for n in range(2, num+1):
    flag = True
    for i in range(2, n):
        if n % i == 0:  #약수가 존재한다는 것 = 소수가 아니라는 것
            flag = False
            break
    if flag == True:
        listB.append(n)

print(f'{num}의 약수: {listA}')
print(f'{num}의 소수: {listB}')

<Output>
1보다 큰 정수 입력: 40
40의 약수: [1, 2, 4, 5, 8, 10, 20, 40]
40의 소수: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]

2. 1부터 100 사이에 난수 10개 생성한 후, 짝수/홀수 구분하여 리스트에 저장하고 각각의 개수를 출력하는 프로그램 나들기

import random

rdNum = random.sample(range(1, 101), 10)
listEvens = [] #짝수
listOdds = [] #홀수

for n in rdNum:
    if n % 2 == 0: #짝수
        listEvens.append(n)
    else:
        listOdds.append(n)

print(f'짝수: {listEvens}, 개수: {len(listEvens)}')
print(f'홀수: {listOdds}, 개수: {len(listOdds)}')

<Output>
짝수: [32, 48, 20, 58, 6, 24], 개수: 6
홀수: [91, 43, 37, 63], 개수: 4
  1. 다음 리스트에서 중복 숫자를 제거하는 프로그램을 만들어보자.
numbers = [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
numbers.sort()
newNumbers = []
print(f'numbers: {numbers}')

for i in numbers:
    if numbers.count(i) == 1:
        newNumbers.append(i)
    else:
        if newNumbers.count(i) == 0:
            newNumbers.append(i)
        else:
            continue

print(f'중복 제거한 numbers: {newNumbers}')
-----------------------혹은!----------------------------
numbers = [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
numbers.sort()
print(f'numbers: {numbers}')

idx = 0
while True:
    if idx >= len(numbers):
        break
    if numbers.count(numbers[idx]) >= 2:
        numbers.remove(numbers[idx])
        continue  #idx += 1을 하지 않고 다음 순서의 숫자로 넘어감. 
    idx += 1

print(f'중복 제거한 numbers: {numbers}')

<Output>
numbers: [1, 2, 2, 2, 3, 3, 5, 7, 7, 7, 8, 9, 22]
중복 제거한 numbers: [1, 2, 3, 5, 7, 8, 9, 22]

3. 4개의 숫자 중 서로 다른 숫자 3개를 선택해서 만들 수 있는 모든 경우의 수를 출력하는 프로그램을 만들어보자.

numbers = [4,6,7,9]
result = []

for n1 in numbers:
    for n2 in numbers:
        if n1 == n2: continue
        for n3 in numbers:
            if n1 == n3 or n2 == n3: continue
            result.append([n1, n2, n3])       
            # [들여쓰기의 중요성!] for문과 if문을 모두 거친 후 append해줘야 함
print(f'result: {result}, result 개수: {len(result)}')
<Output>
result: [[4, 6, 7], [4, 6, 9], [4, 7, 6], [4, 7, 9], [4, 9, 6], [4, 9, 7], [6, 4, 7], [6, 4, 9], [6, 7, 4], [6, 7, 9], [6, 9, 4], [6, 9, 7], [7, 4, 6], [7, 4, 9], [7, 6, 4], [7, 6, 9], [7, 9, 4], [7, 9, 6], [9, 4, 6], [9, 4, 7], [9, 6, 4], [9, 6, 7], [9, 7, 4], [9, 7, 6]], result 개수: 24

< 튜플 >

1. 다음 2개 튜플에 대해 합집합과 교집합을 출력해보자.

t1 = (1, 3, 2, 6, 12, 5, 7, 8)
t2 = (0, 5, 2, 9, 8, 6, 17, 3)

tHap = list(t1)
tGyo = list()

## 합집합
for n in t2:
    if n not in tHap: #합집합
        tHap.append(n)
    else:  #교집합
        tGyo.append(n)

tHap = tuple(sorted(tHap))
tGyo = tuple(sorted(tGyo))

print(f'합집합: {tHap}')
print(f'교집합: {tGyo}')
--------------------------------------------
tHap = list(t1+t2)
tGyo = list()

idx = 0
while True:

    if idx >= len(tHap):
        break

    if tHap.count(tHap[idx]) >= 2:
        tGyo.append(tHap[idx])
        tHap.remove(tHap[idx])

    idx += 1

print(f'합집합: {tuple(sorted(tHap))}')
print(f'교집합: {tuple(sorted(tGyo))}')

<Output>
합집합: (0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 17)
교집합: (2, 3, 5, 6, 8)

2. 숫자들의 최댓값과 최솟값, 그 위치를 구해라.

numbers = (0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 17)

print(f'최솟값: {min(numbers)}')
print(f'최댓값: {max(numbers)}')
print(f'최솟값의 위치: {numbers.index(min(numbers))}')
print(f'최댓값의 위치: {numbers.index(max(numbers))}')

3. 학급별 학생 수를 나타낸 튜플을 이용해서, 요구 사항에 맞는 데이터를 출력하는 프로그램을 만들어보자.

studentCnt = ({'cls01':18},
              {'cls02':21},
              {'cls03':20},
              {'cls04':19},
              {'cls05':22},
              {'cls06':20},
              {'cls07':23},
              {'cls08':17})

totalCnt = 0
minStdCnt = 0; minCls = ''
maxStdCnt = 0; maxCls = ''
deviation = []

for idx, dic in enumerate(studentCnt):
    for k, v in dic.items():  
        #dic.items()는 dict_items([('cls01', 18)])로 반환
        totalCnt += v  #전체 학생수

        if idx == 0 or minStdCnt > v:
            minStdCnt = v
            minCls = k

        if maxStdCnt < v:
            maxStdCnt = v
            maxCls = k

print(f'전체 학생 수: {totalCnt}명')

avgCnt = totalCnt/len(studentCnt)
print(f'평균 학생 수: {round(avgCnt, 2)}명')

print(f'학생 수가 가장 적은 학급: {minCls}({minStdCnt}명)')
print(f'학생 수가 가장 많은 학급: {maxCls}({maxStdCnt}명)')

for idx, dic in enumerate(studentCnt):
    for k, v in dic.items():
        deviation.append({k:round(v-avgCnt, 2)})

print(f'학급별 학생 편차: {deviation}')

<Output>
전체 학생 수: 160명
평균 학생 수: 20.0명
학생 수가 가장 적은 학급: cls08(17)
학생 수가 가장 많은 학급: cls07(23)
학급별 학생 편차: [{'cls01': -2.0}, {'cls02': 1.0}, {'cls03': 0.0}, {'cls04': -1.0}, {'cls05': 2.0}, {'cls06': 0.0}, {'cls07': 3.0}, {'cls08': -3.0}]

< 딕셔너리 >

1. 다음 문장을 공백으로 구분해 리스트로 저장하자.

text = '파이썬은 1991년 프로그래머인 귀도 반 로섬이 발표한 고급 프로그래밍 언어이다.'
textList = text.split()
print(textList)

dic = {}
for idx, v in enumerate(textList):
    dic[idx] = v
print(dic)

<Output>
['파이썬은', '1991년', '프로그래머인', '귀도', '반', '로섬이', '발표한', '고급', '프로그래밍', '언어이다.']
{0: '파이썬은', 1: '1991년', 2: '프로그래머인', 3: '귀도', 4: '반', 5: '로섬이', 6: '발표한', 7: '고급', 8: '프로그래밍', 9: '언어이다.'}

2. 다음 문장에서 비속어를 찾고 비속어를 표준어로 변경하는 프로그램을 만들어보자.

  • ‘강도는 서로 쪼개다, 짭새를 보고 빠르게 따돌리며 먹튀했다.’
words = {'꺼지다':'가다',
         '쩔다':'엄청나다',
         '짭새':'경찰관',
         '꼽사리':'중간에 낀 사람',
         '먹튀':'먹고 도망',
         '지린다':'겁을 먹다',
         '쪼개다':'웃다',
         '뒷담 까다':'험담하다'}

txt = '강도는 서로 쪼개다, 짭새를 보고 빠르게 따돌리며 먹튀했다.'

keys = list(words.keys())

for key in keys:
    if key in txt:
        print(f'key: {key}')
        print(f'words[{key}]: {words[key]}')
        txt = txt.replace(key, words[key])

print(txt)

<Output>
key: 짭새
words[짭새]: 경찰관
key: 먹튀
words[먹튀]: 먹고 도망
key: 쪼개다
words[쪼개다]: 웃다
강도는 서로 웃다, 경찰관를 보고 빠르게 따돌리며 먹고 도망했다.

4. 파이썬에서 학생 정보를 가장 효율적으로 저장하고 관리할 수 있는 자료구조를 선택해서 컨테이너 자료형으로 만들어보자.

students = {'S21-0001':{'이름':'최성훈',
                        '성구분':'M',
                        '전공':'디자인',
                        '연락처':'010-1234-5678',
                        '메일':'hun@gmail.com',
                        '취미':['농구', '음악']},
            'S21-0002': {'이름': '탁영우',
                         '성구분': 'M',
                         '전공': '바리스타',
                         '연락처': '010-5678-9012',
                         '메일': 'yeong@gmail.com',
                         '취미': ['축구']},
            'S21-0003': {'이름': '황진영',
                         '성구분': 'W',
                         '전공': '음악',
                         '연락처': '010-9012-3456',
                         '메일': 'jin@gmail.com',
                         '취미': ['수영', '코딩']}
            }
print('<' * 15, '전체 회원 조회 결과','>' * 15)
for k1 in students.keys():
    print('-' * 40)
    print('회원번호 : {}'.format(k1))
    student = students[k1]
    for k2 in student.keys():
        print('{} : {}'.format(k2, student[k2]))

print('-' * 40)
memNo = input('조회할 회원번호를 입력하세요.: ')
print('회원번호 : {}'.format(memNo))
for k in students[memNo].keys():
    print(f'{k}: {students[memNo][k]}')
    
<Output>
<<<<<<<<<<<<<<< 전체 회원 조회 결과 >>>>>>>>>>>>>>>
----------------------------------------
회원번호 : S21-0001
이름 : 최성훈
성구분 : M
전공 : 디자인
연락처 : 010-1234-5678
메일 : hun@gmail.com
취미 : ['농구', '음악']
----------------------------------------
회원번호 : S21-0002
이름 : 탁영우
성구분 : M
전공 : 바리스타
연락처 : 010-5678-9012
메일 : yeong@gmail.com
취미 : ['축구']
----------------------------------------
회원번호 : S21-0003
이름 : 황진영
성구분 : W
전공 : 음악
연락처 : 010-9012-3456
메일 : jin@gmail.com
취미 : ['수영', '코딩']
----------------------------------------
조회할 회원번호를 입력하세요.: S21-0003
회원번호 : S21-0003
이름: 황진영
성구분: W
전공: 음악
연락처: 010-9012-3456
메일: jin@gmail.com
취미: ['수영', '코딩']

0개의 댓글