04-02 자료구조 (파이썬) 문제풀이
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('{}의 약수: {}'.format(inputNum, listA))
print('{}까지의 소수: {}'.format(inputNum, listB))

import random
randomList = random.sample(range(1, 101), 10)
evens = []
odds = []
for n in randomList:
if n % 2 == 0:
evens.append(n)
else:
odds.append(n)
print('짝수 개수:', len(evens), evens)
print('홀수 개수:', len(odds), odds)

'''
구분 | 영유아 | 어린이 | 청소년 | 성인 | 어르신
나이 | 0-7세 | 8-13세 | 14-19세 | 20-64세 | 65세 이상
요금 | 무료 | 200 | 300 | 500 | 무료
'''
import random
visitors = []
for n in range(100):
visitors.append(random.randint(1, 100))
group1, group2, group3, group4, group5 = 0,0,0,0,0
for age in visitors:
if age >= 0 and age <= 7:
group1 += 1
elif age >= 8 and age <= 13:
group2 += 1
elif age >= 14 and age <= 19:
group3 += 1
elif age >= 20 and age <= 64:
group4 += 1
elif age >=65:
group5 += 1
group1Price = group1 * 0
group2Price = group2 * 200
group3Price = group3 * 300
group4Price = group4 * 500
group5Price = group5 * 0
print('-'*30)
print(f'영유아: {group1}명 : {group1Price}원')
print(f'어린이: {group1}명 : {group2Price}원')
print(f'청소년: {group1}명 : {group3Price}원')
print(f'성인: {group1}명 : {group4Price}원')
print(f'65세이상: {group1}명 : {group5Price}원')
print('-'*30)
sum = group1Price + group2Price + group3Price + group4Price + group5Price
print('1일 요금 총합계:', sum)

numbers = [4,6,7,9]
result = []
for n1 in numbers:
for n2 in numbers:
if n1 == n2:
continue
result.append([n1, n2])
print('result:', result)
print('result length:', len(result))

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])
print('result:', result)
print('result length:', len(result))

2. 튜플 문제풀이
passwords = ('password1234', 'abc123', 'querty', 'letmein', 'welcome00')
print(f'passwords: {passwords}')

scores = ((3.7, 4.2), (2.9, 4.3), (4.1, 4.2))
total = 0
for s1 in scores:
for s2 in s1:
total += s2
total = round(total, 1)
avg = total/6
print('3학년까지 총 학점:', total)
print('3학년까지 평균 학점:', avg)
target_for_gpa4 = round((4.0 * 8 - total), 1)
print('4학년 때 받아야 할 학점:', target_for_gpa4)
minScore = round((target_for_gpa4 / 2), 1)
print('4학년 때 필요한 한학기 최소 학점:', minScore)
scores = list(scores)
scores.append((minScore,minScore))
scores = tuple(scores)
print('scores:', scores)

numbers = (8.7,9.0,9.1,9.2,8.6,9.3,7.9,8.1,8.3)
print('index 0부터 3까지:', numbers[0:4])
print('index 2부터 4까지:', numbers[2:5])
print('index 3부터 끝까지:', numbers[3:])
print('index 2부터 뒤에서 -2까지:', numbers[2:-1])
print('index 0부터 끝까지, 3단계:', numbers[0::3])
print('최소값:', min(numbers))
print('최대값:', max(numbers))
print('최소값 index 위치:', numbers.index(min(numbers)))
print('최대값 index 위치:', numbers.index(max(numbers)))

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(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'
else:
item[key] = 'F'
print(scores)

fruits = ({'수박':8}, {'포도':13}, {'참외':12}, {'사과':17}, {'자두':19}, {'자몽':15})
print(fruits)
print('-'*30)
fruits = list(fruits)
cIdx = 0
nIdx = 1
eIdx = len(fruits) - 1
flag = True
while flag:
curDic = fruits[cIdx]
nextDic = fruits[nIdx]
curDictCnt = list(curDic.values())[0]
nextDictCnt = list(nextDic.values())[0]
if nextDictCnt > curDictCnt:
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))
print('-'*30)
fruits = ({'수박':8}, {'포도':13}, {'참외':12}, {'사과':17}, {'자두':19}, {'자몽':15})
fruits = list(fruits)
cIdx = 0
nIdx = 1
eIdx = len(fruits) - 1
flag = True
while flag:
curDic = fruits[cIdx]
nextDic = fruits[nIdx]
curDictCnt = list(curDic.values())[0]
nextDictCnt = list(nextDic.values())[0]
if nextDictCnt < curDictCnt:
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))

'''
- 전체 학생 수
- 평균 학생 수
- 학생 수가 가장 적은 학급
- 학생 수가 가장 많은 학급
- 학급별 학생 편차
'''
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():
totalCnt += v
if minStdCnt == 0 or minStdCnt > v:
minStdCnt = v
minCls = k
if maxStdCnt < v:
maxStdCnt = v
maxCls = k
print('전체 학생 수:', totalCnt)
avgCnt = totalCnt/len(studentCnt)
print('평균 학생 수:', avgCnt)
print('학생 수가 가장 적은 학급:', minCls, '({})'.format(minStdCnt))
print('학생 수가 가장 많은 학급:', maxCls, '({})'.format(maxStdCnt))
for idx, dic in enumerate(studentCnt):
for k, v in dic.items():
deviation.append(v - avgCnt)
print('학급별 학생 편차:', deviation)

3. 딕셔너리 문제풀이
subject = ['국어', '영어', '수학', '과학', '국사']
scores = {}
for s in subject:
score = input('점수 입력:')
scores[s] = score
print('과목별 점수:', scores)

members ={'hahaha':'123',
'xxavv':'dksk',
'pdsd':'dfef'}
myID = input('ID 입력: ')
myPW = input('PW 입력: ')
if myID in members:
if members[myID] == myPW:
print('로그인 성공')
else:
print('비밀번호를 확인해라')
else:
print('ID를 확인해라')

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

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)

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(key)
print(words[key])
txt = txt.replace(key, words[key])
print(txt)

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:
del_mail = input('삭제할 계정(메일) 입력: ')
if del_mail in members:
del_pw = input('비번 입력:')
if members[del_mail] == del_pw:
del members[del_mail]
print(f'{del_mail} 계정 삭제 완료')
break
else:
print('비번을 확인해 주세요.')
else:
print('게정을 확인해 주세요.')

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', '취미':['수영','코딩']}}
for k1 in students.keys():
print('학생번호:', k1)
student = students[k1]
for k2 in student.keys():
print('{} : {}'.format(k2, student[k2]))
print('-'*30)
student_no = input('학생 번호 입력:')
print('{} : {}'.format(student_no, students[student_no]))
