자료구조_문제풀이

한영석·2022년 7월 23일
0

리스트를 이용한 프로그래밍

1번 리스트 연습문제

  • 1부터 사용자가 입력한 숫자까지의 약수와 소수를 리스트에 각각 저장하고, 이것을 출력하는 프로그램을 만들어보자.
inputNum = int(input('1보다 큰 정수 입력 : '))

listA = [] # 약수
listB = [] # 소수

for n in range(1, inputNum+1): # 약수를 구하는 반복문
    if n == 1:
        listA.append(n)
    else:
        if inputNum % n == 0:
            listA.append(n)
            
for number in range(2, inputNum+1): # 소수를 구하는 반복문
    flag = True
    for n in range(2, number):
        if number % n == 0:
            flag = False
            break
    if flag:
        listB.append(number)
print(f'{inputNum}의 약수 : {listA}')
print(f'{inputNum}까지의 약수 : {listB}')


2번 리스트 연습문제

  • 1부터 100사이에 난수 10개를 생성한 후 짝수와 홀수를 구분해서 리스트에 저장하고 각각의 개수를 출력하는 프로그램을 만들어보자.
import random

randomList = random.sample(range(1,101),10) # 난수 10개 생성
envens = []
odds = []
for n in randomList:
    if n % 2 == 0: # 짝수
        envens.append(n)
    else: # 홀수
        odds.append(n)
print(f'짝수 : {envens}, 개수 : {len(envens)}')
print(f'홀수 : {odds}, 개수 : {len(odds)}')

  • import random를 사용해서 실행할때 마다 난수가 바뀐다.

3번 리스트 연습문제

  • 다음은 공원 입장료를 나타낸 표이다. 1일 총 입장객이 100명이라고 할 때, 1일 전체 입장 요금을 구하는 프로그램을 만들어보자.
    단, 입장 고객의 나이는 난수를 이용한다.
import random
visitors = []

for i in range(100):
    visitors.append(random.randint(1, 100))

print(visitors)
group1, group2, group3, group4, group5 = 0, 0, 0, 0, 0

for age in visitors:
    if age <= 7 and age >= 0:
        group1 += 1
    elif age <= 13 and age >= 8:
        group2 += 1
    elif age <= 19 and age >= 14:
        group3 += 1
    elif age <= 64 and age >= 20:
        group4 += 1
    else:
        group5 += 1

group1Price = group1 * 0
group2Price = group2 * 200
group3Price = group3 * 300
group4Price = group4 * 500
group5Price = group5 * 0

print('*' * 25)
print(f'영유아 : {group1}명 : {format(group1Price, ",")}원')
print(f'어린이 : {group2}명 : {format(group2Price, ",")}원')
print(f'청소년 : {group3}명 : {format(group3Price, ",")}원')
print(f'성 인  : {group4}명 : {format(group4Price, ",")}원')
print(f'어르신 : {group5}명 : {format(group5Price, ",")}원')
print('*' * 25)
sum = group1Price + group2Price + group3Price + group4Price + group5Price
print(f'1일 요금 총합계 : {format(sum, ",")}원')


4번 리스트 연습문제

  • 친구 이름 다섯 명을 리스트에 저장하고 오름차순과 내림차순으로 정렬해보자.
friend = []

for i in range(5):
    friend.append(input('친구 이름 입력 : '))
print(f'친구들 : {friend}')

friend.sort()
print(f'오름차순 : {friend}')

friend.sort(reverse=True)
print(f'내림차순 : {friend}')

  • 다음 리스트에서 중복 아이템(숫자)을 제거하는 프로그램을 만들어보자.
numbers = [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
print(f'numbers : {numbers}')

idx = 0
while True:
    if idx >= len(numbers):
        break

    if numbers.count(idx) >= 2:
        numbers.remove(idx)
        continue
    idx += 1

print(f'numbers : {numbers}')


5번 리스트 연습문제

  • 4개의 숫자 중 서로 다른 숫자 2개를 선택해서 만들 수 있는 모든 경우의 수를 출력하는 프로그램을 만들어보자.
numbers = [4, 6, 7, 9]
result = []

for n1 in numbers:
    for n2 in numbers:
        if n1 == n2:
            continue

        result.append([n1, n2])

print(f'result : {result}')
print(f'result length : {len(result)}')

# n! / (n-r)! : 순열의 공식
# n : 4개의 숫자 / r : 서로다른 숫자2개
import math
pernutation = math.factorial(len(numbers)) / math.factorial(len(numbers)-2)
print(f'pernutation : {pernutation}')


6번 튜플 연습문제

  • 대학생 길동이의 1,2,3학년의 성적은 다음과 같다. 졸업할 때 4.0이상의 학점을 받기 위해 길동이가 받아야하는 4학년 1,2학기의 최소 학점을 구해보자.
score = ((3.7, 4.2), (2.9, 4.3), (4.1, 4.2))
total = 0

for s1 in score:
    for s2 in s1:
        total += s2
total = round(total, 2)
avg = round((total/6),1)
print(f'3학년 총 학점 : {total}')
print(f'3학년 총 평균 : {avg}')

grade4TagetScore = round((4.0 * 8 - total), 1)
print(f'4학년 목표 총학점 : {grade4TagetScore}')
minScore = round((grade4TagetScore / 2), 1)
print(f'4학년 한학기 최소학점 : {minScore}')

score = list(score)
score.append((minScore, minScore))
score = tuple(score)
print(f'score : {score}')


7번 튜플 연습문제

  • 다음 2개의 튜플에 대해서 합집합과 교집합을 출력해보자.
tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)

tempHap = list(tuple1)
tempGyo = list()

for n in tuple2:
    if n not in tempHap:
        tempHap.append(n)
    else:
        tempGyo.append(n)
tempHap = tuple(sorted(tempHap))
tempGyo = tuple(sorted(tempGyo))

print(f'합집합(중복X)\t: {tempHap}')
print(f'교집합\t: {tempGyo}')

  • while문으로 출력 하는 방법
tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)

tempHap = tuple1 + tuple2
tempGyo = list()
tempHap = list(tempHap)

print(tempHap)
idx = 0
while True:
    if idx >= len(tempHap):
        break
    if tempHap.count(tempHap[idx]) >= 2:
        tempGyo.append(tempHap[idx])
        tempHap.remove(tempHap[idx])
        continue
    idx += 1

print(f'합집합(중복X)\t: {tempHap}')
print(f'교집합\t: {tempGyo}')
  • 결과는 위와 같다.

8번 튜플 연습문제

  • 시험 점수를 입력한 후 튜플에 저장하고 과목별 학점을 출력해보자.
korScore = int(input('국어 점수 입력 : '))
engScore = int(input('영어 점수 입력 : '))
matScore = int(input('수학 점수 입력 : '))
sciScore = int(input('과학 점수 입력 : '))
hisScore = int(input('국사 점수 입력 : '))

scores = ({'kor':korScore}, {'eng':engScore}, {'mat':matScore}, {'sci':sciScore}, {'his':hisScore})
print(f'scores : {scores}')
for item in scores:
    for key in item.keys():
        if item[key] >= 90:
            item[key] = 'A'
        elif item[key] >= 80:
            item[key] = 'B'
        elif item[key] >= 70:
            item[key] = 'C'
        elif item[key] >= 60:
            item[key] = 'D'
        else:
            item[key] = 'F'
print(f'scores : {scores}')


9번 튜플 연습문제

  • 다음 튜플의 과일 개수에 대해서 오름차순 및 내림차순으로 정렬해보자.
fruits = ({'수박':8}, {'포도':13}, {'참외':12}, {'사과':17}, {'자두':19}, {'자몽':15})
fruits = list(fruits)
print(fruits)
cIdx = 0; nIdx = 1
eIdx = len(fruits) - 1

flag = True
while flag:
    curDic = fruits[cIdx]
    nextDic = fruits[nIdx]

    curDicCnt = list(curDic.values())[0]
    nextDicNct = list(nextDic.values())[0]

    if nextDicNct < curDicCnt:
        fruits.insert(cIdx, fruits.pop(nIdx))
        nIdx = cIdx + 1
        continue

    nIdx += 1
    if nIdx > eIdx:
        cIdx += 1
        nIdx = cIdx + 1

        if cIdx == 5:
            flag = False
print(tuple(fruits))


10번 튜플 연습문제

  • 학급별 학생 수를 나타낸 튜플을 이용해서, 요구 사항에 맞는 데이터를 출력하는 프로그램을 만들어보자.
studentsCnt = ({'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(studentsCnt):
    for k, v in dic.items():
        totalCnt += v
        if minStdCnt == 0 or minStdCnt > v:
            minStdCnt = v
            minCls = k
        if maxStdCnt < v:
            maxStdCnt = v
            maxCls = k
print(f'전체 학생 수 : {totalCnt}')
avgCnt = totalCnt / len(studentsCnt)
print(f'평균 학생 수 : {avgCnt}')
print(f'학생 수가 가장 적은 학급 : {minCls}({minStdCnt})')
print(f'학생 수가 가장 많은 학급 : {maxCls}({maxStdCnt})')
for idx, dic in enumerate(studentsCnt):
    for k, v in dic.items():
        deviation.append(v - avgCnt)
print(f'학급별 학생 평차 : {deviation}')


11번 딕셔너리 연습문제

  • 과목별 점수를 딕셔너리에 저장하고 출력하는 프로그램을 만들어보자.
subject = ['국어', '영어', '수학', '과학', '국사']
scores = {}

for s in subject:
    score = int(input(s + '점수 입력 : '))
    scores[s] = score

print(f'과목별 점수 : {scores}')

  • 사용자의 아이디, 비밀번호를 이용해서 로그인 프로그램을 만들어보자.
members = {'urkpo':'0928^7$',
           'xxayv':'%2*9$91',
           'lsqvx':'!0%)&&4',
           'heums':'%@3^0%3',
           'uwcmc':'85236(&',
           'iemwv':')8!36^&',
           'sqblx':')^2)9!(',
           'jbbpy':'67269*3',
           'hjkwu':'$&@@#64',
           'fvwwy':'82$%)31'}

memID = input('ID 입력 : ')
memPW = input('PW 입력 : ')

if memID in members: # members에 memID에 해당하는 문자가 있으면 True
    if members[memID] == memPW:
        print('로그인 성공!!')
    else:
        print('비밀번호 확인!!')
else:
    print('아이디 확인!!')


12번 딕셔너리 연습문제

  • 삼각형부터 십각형까지의 내각의 합과 내각을 딕셔너리에 저장하는 프로그램을 만들어보자.
dic = {}

for n in range(3, 11):
    hap = 180 * (n-2)
    ang = int(hap/n)
    dic[n] = [hap, ang]

print(dic)

  • 1부터 10까지 각각의 정수에 대한 약수를 저장하는 딕셔너리를 만들고 출력하는 프로그램을 만들어보자.
dic = {}

for n1 in range(2, 11):
    tempList = []
    for n2 in range(1, n1+1):
        if n1 % n2 == 0:
            tempList.append(n2)
    dic[n1] = tempList
print(dic)


13번 딕셔너리 연습문제

  • 다음 문구를 공백으로 구분하여 리스트에 저장한 후, 인덱스와 단어를 이용해서 딕셔너리에 저장해보자.
aboutPython = '파이썬은 1991년 프로그래머인 귀도 반 로섬이 발표한 고급 프로그래밍 언어이다.'

splitList = aboutPython.split()
print(splitList)

dic = {}

for idx, v in enumerate(splitList):
    dic[idx] = v

print(dic)

  • 다음 문장에서 비속어를 찾고 비속어를 표준어로 변경하는 프로그램을 만들어보자.
    "강도는 서로 쪼개다, 짭새를 보고 빠르게 따돌리며 먹튀했다."
words = {'꺼지다':'가다',
         '쩔다':'엄청나다',
         '짭새':'경찰관',
         '꼽사리':'중간에 낀 사람',
         '먹튀':'먹고 도망',
         '지린다':'겁을 먹다',
         '쪼개다':'웃다',
         '뒷담 까다':'험담하다'}

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

keys = list(words.keys())

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

print(text)


14번 딕셔너리 연습문제

  • 딕셔너리를 이용해서 5명의 회원을 가입 받고 전체 회원 정보를 출력하는 프로그램을 만들어보자.
members = {}
n = 1
while n < 6:
    mail = input('메일 입력 : ')
    pw = input('비번 입력 : ')

    if mail in members:
        print('이미 사용 중인 메일 계정입니다.')
        continue
    else:
        members[mail] = pw
        n += 1
for key in members.keys():
    print(f'{key} : {members[key]}')

  • 위의 프로그램을 이용해서 특정 회원 계정을 삭제하는 프로그램을 만들어보자.
# 위의 코드와 이어서 사용해야함..
while True:
    delMail = input('삭제할 계정(메일) 입력 : ')

    if delMail in members:
        delPw = input('비번 입력 : ')
        if delPw == members[delMail]:
            del members[delMail]
            print(f'{delMail} 계정 삭제 완료')
            break
        else:
            print('비번 확인 요망!!')
    else:
        print('계정 확인 요망!!')

for key in members.keys():
    print(f'{key} : {members[key]}')


15번 딕셔너리 연습문제

  • 다음은 학생 정보 테이블이다. 파이썬에서 학생 정보를 가장 효율적으로 저장하고 관리할 수 있는 자료구조를 선택해서 컨테이너 자료형으로 만들어보자.
students = {'S21-001':{'이름':'최성훈',
                       '성구분': 'M',
                       '전공':'디자인',
                       '연락처':'010-1234-5678',
                       '메일':'hun@gmail.com',
                       '취미':['농구', '음악']},
            'S21-002': {'이름': '탁우영',
                        '성구분': 'M',
                        '전공': '바리스타',
                        '연락처': '010-5678-9012',
                        '메일': 'yeong@gmail.com',
                        '취미': '축구'},
            'S21-003': {'이름': '황진영',
                        '성구분': 'W',
                        '전공': '음악',
                        '연락처': '010-9012-3456',
                        '메일': 'jin@gmail.com',
                        '취미': ['수영', '코딩']}}
for k1 in students.keys():
    print(f'학생번호 : {k1}')
    student = students[k1]
    for k2 in student.keys():
        print(f'{k2} : {student[k2]}')
    print()

studentNo = input('조회 대상 학생 번호 입력 : ')
print(f'{studentNo} : {students[studentNo]}')

profile
코딩공부중

0개의 댓글