[3주차] 자료구조 1~4

이철민·2023년 2월 15일
0

[오늘 배운 내용]

[자료구조]

  • 여러 개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라 하고, 이 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.
  • 컨테이너 자료형: 리스트, 딕셔너리, 튜플, Set
    • 튜플은 리스트와 비슷하지만 리스트와는 달리 한 번 데이터가 정해지면 바꿀 수 없음
    • 딕셔너리는 key 와 value 값으로 구성
    • set은 중복된 데이터가 허용되지 않음.
student1 = '홍길동'
student2 = '박찬호'
student3 = '이용규'
student4 = '박승철'
student5 = '김지은'

# List
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print(students)
print(type(students))

for i in students:
    print(i)

# 튜플
students = ('홍길동', '박찬호', '이용규', '박승철', '김지은')
print(students)
print(type(students))

for i in students:
    print(i)

# 딕셔너리
scores = {'kor':95, 'eng':80, 'math':100}
print(scores)
print(type(scores))

# Set
allSales = {100, 200, 500}
print(allSales)
print(type(allSales))

[리스트]

  • 배열과 같이 여러 개의 데이터를 나열한 자료구조
    • [ ]를 이용해서 선언하고, 데이터 구분은 ,를 이용한다.
    • 리스트 안에는 다른 리스트나 데이터 자료구조가 들어갈 수 있음.
students = ['students', '박찬호', '이용규', '이대호', '전준우']
print('students: {}'.format(students))
print(type(students))

# 실습: 가족 이름을 리스트에 저장해보자.

myFamilyNames = ['홍아빠', '홍엄마', '홍길동', '홍동생']
print(myFamilyNames)

todaySchedule = ['9시: 자료구조 공부', '12시: 점심', '5시: 피부과', '7시: 포비기너 회의']
print(todaySchedule)
  • 인덱스: 리스트의 아이템에 자동으로 부여되는 번호표 (번호는 0부터 시작)
    • 리스트 아이템은 인덱스를 이용해서 조회 가능하다.
# 실습:
students = ['이기제', '김보경', '고명석', '아코스티', '전진우']

for i in range(5):
    if i % 2 == 0:
        print('인덱스가 짝수인 경우 --> students[{}]: {}'.format(i, students[i]))
    else:
        print('인덱스가 홀수인 경우 --> students[{}]: {}'.format(i, students[i]))
  • 리스트 길이: 리스트에 저장된 아이템 개수
# len()
students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
print('length: {}'.format(len(students)))

# len()을 이용한 조회

for i in range(len(students)):
    print(students[i])

# len() 함수는 리스트의 개수뿐만 아니라 문자열의 길이도 알 수 있다.

str = 'hello python!!'
print(len(str))   # 공백 포함

# 실습: 좋아하는 운동을 리스트에 저장하고 반복문으로 조회하자.

myFavoriteSports = ['수영', '배구', '야구', '조깅']

# for문
for i in range(len(myFavoriteSports)):
    print(myFavoriteSports[i])

# for문 다른 방법
for item in myFavoriteSports:
    print(item)

# while문
n = 0
while n < len(myFavoriteSports):
    print(myFavoriteSports[n])
    n += 1
  • for 문을 이용한 리스트 조회
    • for 문을 이용하면 리스트의 아이템을 자동으로 참조할 수 있다.
studentCnts = [[1, 19], [2, 20], [3, 21], [4, 22], [5, 23]]

for i in range(len(studentCnts)):
    print('{}학급의 학생수: {}'.format(studentCnts[i][0], studentCnts[i][1]))

for classNO, cnt in studentCnts:
    print('{}학급의 학생수: {}'.format(classNO, cnt))

------------------------------------------------------------

# 실습1: 학급별 학생 수와 전체 학생 수, 평균 학생 수를 출력하자.

studentsCounts = [[1, 18], [2, 19], [3, 23], [4, 21], [5, 20], [6, 22], [7, 17]]

sumN = 0

for classNo, cnt in studentsCounts:
    print('{}학급 학생수: {}'.format(classNo, cnt))
    sumN += cnt

averageN = sumN / len(studentsCounts)

print('전체 학생수: {}명'.format(sumN))
print('한 학급 평균 학생수: {}명'.format(averageN))
# 실습2: 사용자가 국어, 영어, 수학, 과학, 국사 점수를 입력하면 과락 과목과 점수를 출력하는 프로그램을 만들어보자.

korScore = int(input('국어 점수 입력: '))
engScore = int(input('영어 점수 입력: '))
mathScore = int(input('수학 점수 입력: '))
sciScore = int(input('과학 점수 입력: '))
hisScore = int(input('국사 점수 입력: '))

minScore = 70

scores= [['국어', korScore],['영어', engScore],['수학', mathScore],['과학', sciScore],['국사', hisScore]]

for item in scores:
    if item[1] < 70:
        print('과락 과목: {}, 점수: {}'.format(item[0], item[1]))
  • while 문을 이용한 리스트 아이템 참조
# 1번
n = 0
while n < len(cars):
    print(cars[n])
    n += 1

# 2번
n = 0
flag = True
while flag:
    print(cars[n])
    n += 1
    if n == len(cars):
       flag = False

# 3번
n = 0
while True:
    print(cars[n])
    n += 1
    if n == len(cars):
       break
# 실습1: while과 if문을 이용해서 과락 과목 출력하기 

minScore = 60

scores = [['국어', 58],['영어', 77], ['수학', 89], ['과학', 99], ['국사', 50]]

n = 0
while n < len(scores):
    if scores[n][1] >= minScore:
        n += 1
        continue

    print('과락 과목: {}, 점수: {}'.format(scores[n][0], scores[n][1]))
    n += 1

------------------------------------------------------------

# 실습2: while문을 이용해서 가장 학급 수가 많은 학급과 적은 학급을 출력해보자.

studentCnts = [[1,18], [2,19],[3,23],[4,21],[5,20],[6,22],[7,17]]

minclassNo = 0; maxclassNo = 0
minCnt = 0; maxCnt = 0

n = 0
while n < len(studentCnts):
    if minCnt == 0 or minCnt > studentCnts[n][1]:
        minclassNo = studentCnts[n][0]
        minCnt = studentCnts[n][1]

    if maxCnt < studentCnts[n][1]:
        maxclassNo = studentCnts[n][0]
        maxCnt = studentCnts[n][1]

    n += 1

print('학생 수가 가장 적은 학급(학생 수): {}학급({}명)'.format(minclassNo, minCnt))
print('학생 수가 가장 많은 학급(학생 수): {}학급({}명)'.format(maxclassNo, maxCnt))
  • enumerate( ) 함수
sports = ['농구', '축구', '야구', '배구', '골프']

for idx, value in enumerate(sports):
    print('{}: {}'.format(idx, value))

str = 'hello python.'

for idx, value in enumerate(str):
    print('{}: {}'.format(idx, value))

# 실습1: 가장 좋아하는 스포츠가 몇 번째에 있는지 출력

sports = ['축구','야구','골프','농구','배구']
favoriteSport = input('가장 좋아하는 스포츠 입력: ')

mybestSport = 0

for idx, value in enumerate(sports):
    if value == favoriteSport:
        mybestSport = idx + 1

print('{}(은)는 {}번째에 있습니다.'.format(favoriteSport,mybestSport))

# 실습2 사용자가 입력한 문자열에서 공백의 개수를 출력해보자.

message = input('메시지 입력: ')

blankCnt = 0

for idx, value in enumerate(message):
    if value == ' ':
        blankCnt += 1

print('문자 공백 개수: {}'.format(blankCnt))

[리스트 아이템 추가]

  • append() 함수를 이용하면 마지막 인덱스에 아이템을 추가할 수 있다.
# 1)
students = ['홍길동','박찬호','이용규','이대호','전준우']

students.append('강호동')
print(students)
print(len(students))

# 2)
scores = [['국어', 88], ['영어', 91]]

print('scores: {}'.format(scores))
print('scores length: {}'.format(len(scores)))

scores.append(['수학',96])

print('scores: {}'.format(scores))
print('scores length: {}'.format(len(scores)))

for subject, score in scores:
    print('과목: {}, 점수: {}'.format(subject, score))
  • insert()함수를 이용하면 특정 위치(인덱스)에 아이템을 추가할 수 있다.
students = ['이대호', '전준우', '한동희', '박세웅', '김원중']
print(students)

students.insert(3, '유강남')
print(students)

# 실습: 오름차순으로 정렬되어 있는 숫자들에 사용자가 입력한 정수를 추가하는 프로그램을 만들어보자. (단, 추가 후에도 오름차순 유지)

numbers = [1, 3, 6, 11, 45, 54, 62, 74, 85]

inputNumber = int(input('정수 입력: '))
insertIdx = 0

for idx, number in enumerate(numbers):
    print(idx, number)
    if insertIdx == 0 and inputNumber < number:
        insertIdx = idx

numbers.insert(insertIdx, inputNumber)
print('numbers: {}'.format(numbers))

[리스트 아이템 삭제]

  • pop() 함수를 이용하면 마지막 인덱스에 해당하는 아이템을 삭제할 수 있다
  • pop(n) 함수는 인덱스 n에 해당하는 아이템을 삭제할 수 있다.
students = ['이대호', '전준우', '한동희', '박세웅', '김원중']
print('students: {}'.format(students))
print('students length: {}'.format(len(students)))

rValue = students.pop()
print('rValue: {}'.format(rValue))

students.pop(3)
print('students: {}'.format(students))
print('students length: {}'.format(len(students)))

# 실습: 체조 선수의 점수표에서 최저, 최고 점수를 삭제해보자.

playerScores = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('playerScores: {}'.format(playerScores))

minScore = 0; maxScore = 0
minScoreIdx = 0; maxScoreIdx = 0

for idx,score in enumerate(playerScores):
    if  idx == 0 or minScore > score:          # 처음에 idx가 0이면 최저점수는 9.5  그 다음에 idx 1이 되면 최저 점수는 8.9로 교체.
        minScoreIdx = idx                      # 이렇게 가다보면 minScoreIdx와 minScore에는 최저 점수 인덱스와 최저 점수가 들어감.
        minScore = score

print('minScore: {}, minScoreIdx: {}'.format(minScore,minScoreIdx))
playerScores.pop(minScoreIdx)

for idx, score in enumerate(playerScores):
    if  maxScore < score:
        maxScoreIdx = idx
        maxScore = score

print('maxScore: {}, maxScoreIdx: {}'.format(maxScore,maxScoreIdx))
playerScores.pop(maxScoreIdx)

print('playerScores: {}'.format(playerScores))
  • 리스트 특정 아이템 삭제
  • remove() 함수를 이용하면 특정 아이템을 삭제할 수 있다.
students = ['이대호', '전준우', '정훈', '안치홍', '한동희', '유강남']
print(students)

students.remove('전준우')
print(students)
  • remove()는 한 개의 아이템만 삭제 가능하다. 삭제하려는 데이터가 2개 이상이라면 while문을 이용하자.
students = ['이대호', '전준우', '정훈', '안치홍', '한동희', '유강남', '전준우']
print(students)

while '전준우' in students:     # in 이라는 키워드는 리스트 안에 '전준우'라는 데이터가 있으면 True 없으면 False
    students.remove('전준우')
print(students)

# 실습: 아래 시험 과목표에서 사용자가 입력한 과목을 삭제하는 프로그램

subjects = ['국어', '영어', '수학', '과학', '국사']
print('시험 과목표: {}'.format(subjects))

removeSubject = input('삭제 과목명 입력: ')
while removeSubject in subjects:
    subjects.remove(removeSubject)

print('시험 과목표: {}'.format(subjects))

[리스트 연결(확장)]

  • extend() 함수를 이용하면 리스트에 또 다른 리스트를 연결(확장) 할 수 있다.
  • 덧셈 연산자를 이용해서 리스트를 연결할 수도 있다.
group1 = ['홍길동', '박찬호', '이용규']
group2 = ['강호동', '박승철', '김지은']
print('group1: {}'.format(group1))
print('group2: {}'.format(group2))

# extend
group1.extend(group2)
print('group1: {}'.format(group1))
print('group2: {}'.format(group2))

# 덧셈 연산
result = group1 + group2
print('result: {}'.format(result))
print('group1: {}'.format(group1))
print('group2: {}'.format(group2))

# 실습: 나와 친구가 좋아하는 번호를 합치되 번호가 중복되지 않도록 하는 프로그램 만들기

myFavoriteNumbers = [1, 3, 5, 6, 7]
friendFavoriteNumbers = [2, 3, 5, 8, 10]

print('myFavoriteNumbers: {}'.format(myFavoriteNumbers))
print('friendFavoriteNumbers: {}'.format(friendFavoriteNumbers))

addList = myFavoriteNumbers + friendFavoriteNumbers
print('addList: {}'.format(addList))

result = []
for number in addList:
    if number not in result:
        result.append(number)

print('result: {}'.format(result))

[리스트 아이템 정렬]

  • sort() 함수를 이용하면 아이템을 오름차순 정렬 가능
  • sort(reverse=True) 함수를 이용하면 아이템을 내림차순 정렬 가능
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))

numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers))

# 오름차순
students.sort()
print('students: {}'.format(students))

numbers.sort()
print('numbers: {}'.format(numbers))

# 내림차순
students.sort(reverse=True)
print('students: {}'.format(students))

numbers.sort(reverse=True)
print('numbers: {}'.format(numbers))

# 실습: 점수표에서 최저 및 최고 점수를 삭제한 후 총점과 평균을 출력해보자.

playerScore = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
print('playerScore: {}'.format(playerScore))

playerScore.sort()
print('playerScore: {}'.format(playerScore))

playerScore.pop(0)
playerScore.pop(len(playerScore)-1)
print('playerScore: {}'.format(playerScore))

sum = 0
avg = 0

for score in playerScore:
    sum += score

avg = sum/len(playerScore)

print('총점: %.2f' % sum)
print('평균: %.2f' % avg)

[리스트 아이템 순서 뒤집기]

  • reverse() 함수를 이용하면 아이템 순서를 뒤집을 수 있다.
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))

students.reverse()
print('students: {}'.format(students))

numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers))

numbers.reverse()
print('numbers: {}'.format(numbers))

# 실습: 다음은 전쟁에서 사용되는 암호이다. 암호를 해독하는 프로그램을 만들어보자.

secret = '27156231'
secretList = []
solvedList = ''

for cha in secret:
    secretList.append(int(cha))

print('secretList: {}'.format(secretList))

secretList.reverse()
print('secretList: {}'.format(secretList))

val = secretList[0] * secretList[1]
secretList.insert(2, val)

val = secretList[3] * secretList[4]
secretList.insert(5, val)

val = secretList[6] * secretList[7]
secretList.insert(8, val)

val = secretList[9] * secretList[10]
secretList.insert(11, val)

print('secretList: {}'.format(secretList))

[리스트 슬라이싱]

  • [n:m]을 이용하면 리스트에서 원하는 아이템만 뽑아낼 수 있다.
    • [2:4] -> 2 <= n < 4
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))
print('students: {}'.format(students[2:4]))
print('students: {}'.format(students[:4]))
print('students: {}'.format(students[2:]))
print('students: {}'.format(students[2:-2]))   # 2부터 -2의 앞에까지
print('students: {}'.format(students[-5 :-2]))

numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers))
print('numbers: {}'.format(numbers[2:4]))
print('numbers: {}'.format(numbers[:4]))
print('numbers: {}'.format(numbers[2:]))
print('numbers: {}'.format(numbers[2:-2]))
print('numbers: {}'.format(numbers[-5 :-2]))
  • [n:m]을 이용하면 문자열도 슬라이싱 가능하다.
  • 슬라이싱할 때 단계를 설정할 수 있다. -> [2:-2:2] 2부터 -2 앞까지 중에 2칸씩 띄워서 뽑아낸다.
numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers[2:-2:2]))
-> numbers: [0.12, 9, 17]
  • 슬라이싱을 이용해 아이템을 변경할 수 있다.
students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))

students[1:4] = ['park chanho', 'lee yonggyu', 'gang hodong']
print('students: {}'.format(students))
  • slice()함수를 이용해서 아이템을 슬라이싱 할 수 있다.
    -> students[2:4] = students[slice(2,4)]
profile
늘 온 마음을 다해 :)

0개의 댓글