[제로베이스] 데이터 사이언스 15기 - (05-23 자료 구조 스터디노트)

윤태호·2023년 5월 23일
0
post-thumbnail

오늘 수강한 강의 - 자료구조 문제풀이(39 ~ 53)

리스트 39 ~ 43

[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)

if number % n == 0 이라면 약수가 있다는 뜻이므로 소수가 아니다

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(listA))
print('소수: {}'.format(listB))

[2] 1부터 100사이에 난수 10개를 생성한 후 짝수와 홀수를 구분해서 리스트에 저장하고 각각의 개수를 출력하는 프로그램

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('짝수: {}, 개수: {}개'.format(evens, len(evens)))
print('홀수: {}, 개수: {}개'.format(odds, len(odds)))

[3] 1일 총 입장객이 100명이라고 할 때, 1일 전체 입장 요금을 구하는 프로그램(단, 입장 고객의 나이는 난수 사용)

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
    else:
        group5 += 1
group1Price = group1 * 0
group2Price = group2 * 200
group3Price = group3 * 300
group4Price = group4 * 500
group5Price = group5 * 0
print('-' * 25)
print('영유아\t: {}명\t: {}원'.format(group1, group1Price))
print('어린이\t: {}명\t: {}원'.format(group2, group2Price))
print('청소년\t: {}명\t: {}원'.format(group3, group3Price))
print('성인\t: {}명\t: {}원'.format(group4, group4Price))
print('어르신\t: {}명\t: {}원'.format(group5, group5Price))
sum = group1Price + group2Price + group3Price + group4Price + group5Price
sumFormat = format(sum, ',')
print('-' * 25)
print('1일 요금 총합계: {}원'.format(sumFormat))
print('-' * 25)

[4] 친구 이름 다섯 명을 리스트에 저장하고 오름차순과 내림차순으로 정렬

friends = []
for i in range(5):
    friends.append(input('친구 이름 입력: '))
print('friends : {}'.format(friends))
friends.sort()
print('friends(오름차순) : {}'.format(friends))
friends.sort(reverse=True)
print('friends(내림차순) : {}'.format(friends))

[5] 다음 리스트에서 중복 아이템(숫자)을 제거하는 프로그램

numbers = [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
print('numbers : {}'.format(numbers))
idx = 0
while True:
    if idx >= len(numbers):
        break

if numbers.count(numbers[idx]) >= 2 -> 값이 두개 이상이라면 중복

    if numbers.count(numbers[idx]) >= 2:
        numbers.remove(numbers[idx])
        continue
    idx += 1
print('numbers : {}'.format(numbers))

[6] 4개의 숫자 중 서로 다른 숫자 2개를 선택해서 만들 수 있는 모든 경우의 수를 출력하는 프로그램

for문

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

공식사용 n!/(n-r)!

import math
permutation = math.factorial(len(numbers)) / math.factorial((len(numbers) - 2))
print('permutation : {}'.format(int(permutation)))

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

for문

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: {}'.format(result))
print('result length: {}'.format(len(result)))

공식사용 n!/(n-r)!

import math
permutation = math.factorial(len(numbers)) / math.factorial((len(numbers) - 2))
print('permutation : {}'.format(int(permutation)))

튜플 44 ~ 48

[1] 자주 접속하는 웹사이트 비번을 튜플에 저장해보자

passwords = ('password1234', 'abc123', 'qwerty', 'letmein', 'welcome00')
print('passwords : {}'.format(passwords))

[2] 졸업할 때 4.0 이상의 학점을 받기 위해 길동이가 받아야 하는 4학년 1, 2학기의 최소 학점을 구해보자

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 = round((total / 6), 1)
print('3학년 총학점: {}'.format(total))
print('3학년 평균: {}'.format(avg))
grade4TargetScore = round((4.0 * 8 - total), 1)
print('4학년 목표 총학점: {}'.format(grade4TargetScore))
minScore = round((grade4TargetScore / 2), 1)
print('4학년 한학기 최소학점: {}'.format(minScore))
scores = list(scores)
scores.append((minScore, minScore))
scores = tuple(scores)
print('scores: {}'.format(scores))

[3] 다음 2개의 튜플에 대해서 합집합과 교집합을 출력

for문

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('합집합(중복X) : {}'.format(tempHap))
print('교집합 : {}'.format(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: {}'.format(tempHap))
print('tempGyo: {}'.format(tempGyo))
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('tempHap: {}'.format(tempHap))
print('tempHap(tuple): {}'.format(tuple(sorted(tempHap))))
print('tempGyo: {}'.format(tempGyo))
print('tempGyo(tuple): {}'.format(tuple(sorted(tempGyo))))

[4] 다음 튜플을 요구 사항에 맞춰 아이템을 슬라이스하자

numbers = (8.7, 9.0, 9.1, 9.2, 8.6, 9.3, 7.9, 8.1, 8.3)

# index: 0 ~ 3

print('numbers[0:4] : {}'.format(numbers[0:4]))

# index: 2 ~ 4

print('numbers[2:5] : {}'.format(numbers[2:5]))

# index: 3 ~ end

print('numbers[3:] : {}'.format(numbers[3:]))

# index: 2 ~ end-2

print('numbers[2:-1] : {}'.format(numbers[2:-1]))

# index: 0 ~ end, step = 3

print('numbers[::3] : {}'.format(numbers[::3]))

# 최솟값

print('최솟값 : {}'.format(min(numbers)))
print('최솟값 인덱스 : {}'.format(numbers.index(min(numbers))))

# 최댓값

print('최댓값 : {}'.format(max(numbers)))
print('최댓값 인덱스 : {}'.format(numbers.index(max(numbers))))

[5] 시험 점수를 입력한 후 튜플에 저장하고 과목별 학점을 출력

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: {}'.format(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('scores: {}'.format(scores))

[6] 다음 튜플의 과일 개수에 대해서 오름차순 및 내림차순으로 정렬

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]
    curDicCnt = list(curDic.values())[0]
    nextDicCnt = list(nextDic.values())[0]
    if nextDicCnt < 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))

[7] 학급별 학생 수를 나타낸 튜플을 이용해서, 요구 사항에 맞는 데이터를 출력하는 프로그램

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

딕셔너리 49 ~ 53

[1] 과목별 점수를 딕셔너리에 저장하고 출력하는 프로그램

subject = ['국어', '영어', '수학', '과학', '국사']
scores = {}
for s in subject:
    score = input(s + ' 점수 입력: ')
    scores[s] = score
print('과목별 점수: {}'.format(scores))

[2] 사용자의 아이디, 비밀번호를 이용한 로그인 프로그램

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:
    if members[memID] == memPW:
        print('로그인 성공!!')
    else:
        print('비밀번호 확인!!')
else:
    print('아이디 확인!!')

[3] 삼각형부터 십각형까지의 내각의 합과 내각을 딕셔너리에 저장하는 프로그램

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

[4] 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)

[5] 다음 문구를 공백으로 구분하여 리스트에 저장한 후, 인덱스와 단어를 이용해서 딕셔너리에 저장해보자

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

split() -> 공백을 기준으로 띄어서 리스트로 나타내줌

splitList = aboutPython.split()
print(splitList)
dic = {}
for idx, v in enumerate(splitList):
    dic[idx] = v
print(dic)

[6] 문장에서 비속어를 찾고 비속어를 표준어로 변경하는 프로그램

words = {'꺼지다':'가다',
         '쩔다':'엄청나다',
         '짭새':'경찰관',
         '꼽사리':'중간에 낀 사람',
         '먹튀':'먹고 도망',
         '지린다':'겁을 먹다',
         '쪼개다':'웃다',
         '뒷담 까다':'험담하다'}
text = '강도는 서로 쪼개다, 짭새를 보고 빠르게 따돌리며 먹튀했다.'
keys = list(words.keys())
for key in keys:
    if key in text:
        print('key: {}'.format(key))
        print('words[{}]: {}'.format(key, words[key]))
        text = text.replace(key, words[key])
print(text)

[7] 딕셔너리를 이용해서 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('{} : {}'.format(key, members[key]))

[8] 위의 프로그램을 이용해서 특정 회원 계정을 삭제하는 프로그램

7번 문제와 동일

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('{} : {}'.format(key, members[key]))

추가된 부분

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

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

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('-' * 40)
    print('학생번호: {}'.format(k1))
    student = students[k1]
    for k2 in student.keys():
        print('{} : {}'.format(k2, student[k2]))
studentNo = input('조회 대상 학생 번호 입력: ')
print('{} : {}'.format(studentNo, students[studentNo]))

재미있었던 부분

가장 기억에 남는 부분은 딕셔너리를 이용해서 회원을 가입 받고 전체 회원 정보를 출력, 삭제하는 프로그램 실습 문제였다
직접 회원정보를 입력하고 삭제 해보았는데 처음에는 어려웠지만 반복해보니 이해가 갔다

어려웠던 부분

어제도 그랬지만 딕셔너리의 keys() 부분과 그 뒤에 [key]로 나타내는 부분이 아직도 헷갈리고 조금만 집중을 놓으면 위에부터 내려오면서 코드를 다시 이해해야되는 상황이 일어났었다
리스트와 튜플과는 다른부분이 너무 헷갈린다

느낀점 및 내일 학습 계획

문제풀이를 풀어보니 역시 더 이해가 잘 가는 부분도 있었지만 막상 혼자 코드를 만들어보려하면 막막한 문제들이 대부분이었다
혼자 코드를 만들어보는 경험이 중요하다고 하지만 아직까지는 강의를 따라가는것도 어렵다
조금 더 익숙해지면 다시 혼자 풀어볼 생각이다
내일은 알고리즘 파트를 공부할 예정이다

profile
데이터 부트캠프 참여중

0개의 댓글