16.자료구조&알고리즘-1

SOWA·2023년 3월 20일
0

🧷자료구조

여러개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라하고, 이러한 컨테이너 자료형의 데이터구조를 자료구조라고 함

  • 파이썬의 대표적인 컨테이너 자료형

    • 리스트List

      -변수명=[a,b,c...]
      : 리스트내의 데이터를 바꿀 수 있음
    • 튜플 Tuple

      -변수명=(a,b,c..)
      : 한번 어떤 데이터가 정해지면 바꿀 수 없음
    • 딕셔너리 Dic

      -변수명={'a':50,'b':60,'c':70...}
      :키key값에 해당하는 밸류value값으로 이루어짐
    • 세트 Set

      -변수명={100,150,200,400}
      : 중복된 데이터가 존재하지 않음.(중복되는 값은 하나로 침)
 #단일 데이터
student1 = '홍길동'
student2 = '박찬호'
student3 = '이용규'
student4 = '박승철'
student5 = '김지은'

###컨테이너 자료형

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

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

#딕셔너리
scores = {'kor':95, 'eng': 89, 'mat': 90}
print(scores)
print(type(scores))

#세트
allSales = {100, 200, 400, 90, 400}
print(allSales)
print(type(allSales))

['홍길동', '박찬호', '이용규', '박승철', '김지은']
<class 'list'>

('홍길동', '박찬호', '이용규', '박승철', '김지은')
<class 'tuple'>

{'kor': 95, 'eng': 89, 'mat': 90}
<class 'dict'>

{200, 90, 100, 400}
<class 'set'>


🖇️ 리스트(List)

배열과 같이 여러 개의 데이터를 나열한 자료구조

─[]를 이용해서 선언하고 데이터 구분은 ','를 이용

  • 숫자,문자(열),논리형 등 모든 기본 데이터를 같이 저장 가능

    students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
    numbers = [10, 20, 30, 40, 50]
    str = [3.14, '십', 20, 'one', '3.141592']
  • 리스트에 또 다른 컨테이너 자료형 데이터 저장가능

    data = [10, 20, 30, [40, 50, 60]]

    ─리스트 아이템조회

  • 인덱스 : 아이템에 자동으로 0부터 부여되는 번호표

  • 리스트 아이템은 인덱스를 이용해서 조회 가능

    #5명의 학생이름을 리스트에 저장하고 인덱스가 홀수인 학생과 짝수(0포함)인 학생을   구분해서 인덱스와 학생이름 출력
    students = ['김성예', '신경도', '박기준', '최승철', '황동석']
    print('--인덱스가 짝수인 학생--')
    print(f'students[0]: {students[0]}')
    print(f'students[2]: {students[2]}')
    print(f'students[4]: {students[4]}')
    print('--인덱스가 홀수인 학생--')
    print(f'students[0]: {students[1]}')
    print(f'students[2]: {students[3]}')
    ##for문으로 변경
    
    for i in range(5):
      if i % 2 == 0:
          print(f'인덱스 짝수: students[{i}]: {students[i]}')
      else:
          print(f'인덱스 홀수: students[{i}]: {students[i]}')

    --인덱스가 짝수인 학생--
    students[0]: 김성예
    students[2]: 박기준
    students[4]: 황동석
    --인덱스가 홀수인 학생--
    students[0]: 신경도
    students[2]: 최승철
    인덱스 짝수: students[0]: 김성예
    인덱스 홀수: students[1]: 신경도
    인덱스 짝수: students[2]: 박기준
    인덱스 홀수: students[3]: 최승철
    인덱스 짝수: students[4]: 황동석

─리스트 길이

리스트에 저장된 아이템 개수

  • len()과 반복문을 이용하면 리스트 아이템 조회 가능

    ###for문
    students = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
    
    for i in range(len(students)):
        print(f'i : {i}')
        print(f'students[{i}] : {students[i]}')
        
     ##while문   
     n = 0
    sLength = len(students)
    while n < sLength:
        print(f'n: {n}')
        print(f'students[{n}]: {students[n]}')
        n += 1   

    i : 0
    students[0] : 홍길동
    i : 1
    students[1] : 박찬호
    i : 2
    students[2] : 이용규
    i : 3
    students[3] : 박승철
    i : 4
    students[4] : 김지은
    
    n: 0
    students[0]: 홍길동
    n: 1
    students[1]: 박찬호
    n: 2
    students[2]: 이용규
    n: 3
    students[3]: 박승철
    n: 4
    students[4]: 김지은
  • len()함수는 리스트 개수뿐만 아니라 문자열의 길이도 알 수 있음

    str = 'Hello python'
    print(len(str))

    12

─리스트와 for문

  • for문을 이용하면 리스트의 아이템을 자동으로 참조가능

    cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']
    
    for i in range(len(cars)):
        print(cars[i])
    
    print('-'*40)
    
    for car in cars:
        print(car)

    그랜저
    소나타
    말리부
    카니발
    쏘렌토
    ----------------------------------------
    그랜저
    소나타
    말리부
    카니발
    쏘렌토
  • for문을 이용하면 리스트 내부의 또다른 리스트 아이템 조회 가능

    studentCnt = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]
    for classNo, cnt in studentCnt:
        print(f'{classNo}학급 학생수: {cnt}')

    1학급 학생수: 19
    2학급 학생수: 20
    3학급 학생수: 22
    4학급 학생수: 18
    5학급 학생수: 21


─리스트와 while문

while문을 이용하면 다양한 방법으로 아이템 조회 가능

cars = ['그랜저', '소나타', '말리부', '카니발', '쏘렌토']

n = 0
while n < len(cars):
    print(cars[n])
    n += 1
n = 0
flag = True
while flag:
    print(cars[n])
    n += 1

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

    if n == len(cars):
        break
##셋 다 결과는 같음

그랜저
소나타
말리부
카니발
쏘렌토

─enumerate() 함수

아이템을 열거할 수 있는 함수

sports = ['농구', '수구', '축구', '마라톤', '테니스']

for idx, value in enumerate(sports): ##idx:인덱스 value:아이템
    print(f'{idx} : {value}')
    
 

0 : 농구
1 : 수구
2 : 축구
3 : 마라톤
4 : 테니스

-문자열에도 적용 가능

str = 'Hello python'
for idx, value in enumerate(str):
    print(f'{idx} : {value}')

0 : H
1 : e
2 : l
3 : l
4 : o
5 :  
6 : p
7 : y
8 : t
9 : h
10 : o
11 : n

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

sports = ['농구', '수구', '축구', '마라톤', '테니스']
favoriteSports = input('가장 좋아하는 스포츠 입력: ')


bestSportIdx = 0
for idx, value in enumerate(sports):
    if value == favoriteSports:
        bestSportIdx = idx + 1

print(f'{favoriteSports}은(는) {bestSportIdx}번째에 있습니다')

가장 좋아하는 스포츠 입력: 농구
농구은() 1번째에 있습니다


─리스트에 아이템 추가 : append()

마지막 인덱스에 아이템 추가 가능

scores = [['국어',75], ['영어', 98]]
scores.append(['수학', 70])

print('scores: {}'.format(scores))
for subject, score in scores:
    print(f'과목: {subject} \t 점수: {score}')

scores: [['국어', 75], ['영어', 98], ['수학', 70]]
과목: 국어 	 점수: 75
과목: 영어 	 점수: 98
과목: 수학 	 점수: 70

─특정 위치에 아이템 추가: insert()

특정 위치(인덱스)에 아이템 추가 가능
기존에 있던 아이템은 삭제 되는게 아닌 뒤로 밀려남

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)

숫자 입력: 25
0 1
1 3
2 6
3 11
4 45
5 54
6 62
7 74
8 85
[1, 3, 6, 11, 25, 45, 54, 62, 74, 85]

─리스트 아이템 삭제 : pop()

마지막 인덱스에 해당하는 아이템 삭제 가능

#점수표에서 최저,최고점수 삭제후 출력
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:
        minScoreIdx = idx
        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))

playerscores: [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
minScore: 8.8, minScoreIdx: 4
maxScore: 9.8, maxScoreIdx : 3
playerscores: [9.5, 8.9, 9.2, 9.0]

─리스트 특정 아이템 삭제 : remove()

한 개의 아이템만 삭제 가능. 만약 삭제하려는 데이터가 2개 이상이라면 while문 이용

#일정표에서 사용자가 입력한 일정을 삭제
myList = ['마케팅 회의', '회의록 정리', '점심 약속', '월간 업무 보고', '치과 방문', '마트 장보기']
print('일정: {}'.format(myList))

removeItem = input('삭제 대상 입력: ')
myList.remove(removeItem)
print('일정: {}'.format(myList))

일정: ['마케팅 회의', '회의록 정리', '점심 약속', '월간 업무 보고', '치과 방문', '마트 장보기']
삭제 대상 입력: 점심 약속
일정: ['마케팅 회의', '회의록 정리', '월간 업무 보고', '치과 방문', '마트 장보기']


─리스트 연결 : extend()

리스트에 또 다른 리스트를 연결(확장)
덧셈 연산자를 이용해서 리스트 연결 가능

# 나와 친구가 좋아하는 번호를 합치되, 번호가 중복되지않게 출력

myFavNum = [1, 3, 5, 6, 7]
friFavNum = [2, 3, 5, 8, 10]

print(f'myfavNum: {myFavNum}')
print(f'frifavNum: {friFavNum}')

addList = myFavNum + friFavNum
print(f'add List: {addList}')

result = []
for number in addList: ###addList에 있는 숫자 호출
    if number not in result:  ##number가 result내에 없다면
        result.append(number)  ##중복되지 않은 숫자만 호출

print(f'reesult: {result}')

myfavNum: [1, 3, 5, 6, 7]
frifavNum: [2, 3, 5, 8, 10]
add List: [1, 3, 5, 6, 7, 2, 3, 5, 8, 10]
reesult: [1, 3, 5, 6, 7, 2, 8, 10]


─리스트 아이템 정렬: sort()

sort(reverse=True) : 내림차순 정렬

#점수표에서 최저 및 최소 젖ㅁ수를 삭제한 후 총점과 평균 출력

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

playerScore.sort() ##적은 수 부터 정렬
print('playreScore: {}'.format(playerScore))
playerScore.pop(0)
playerScore.pop(len(playerScore) - 1)
print('playreScore: {}'.format(playerScore))

sum = 0; avg = 0
for score in playerScore:
    sum += score

avg = sum / len(playerScore)

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

playreScore: [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]
playreScore: [8.8, 8.9, 9.0, 9.2, 9.5, 9.8]
playreScore: [8.9, 9.0, 9.2, 9.5]
총점: 36.60
평점: 9.15

─리스트 순서 뒤집기 : reverse()

아이템 순서 뒤집기

##암호 해독 프로그램
secret = '27156231'
secretList = []
solvedList = ''

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

secretList.reverse()
print(secretList)

val = secretList[0] * secretList[1]
secretList.insert(2, val)  #첫번째,두번째를 곱한것을 다음순서에 놓기
print(secretList)

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

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

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

[1, 3, 2, 6, 5, 1, 7, 2]
[1, 3, 3, 2, 6, 5, 1, 7, 2]
[1, 3, 3, 2, 6, 12, 5, 1, 7, 2]
[1, 3, 3, 2, 6, 12, 5, 1, 5, 7, 2]
[1, 3, 3, 2, 6, 12, 5, 1, 5, 7, 2, 14]


─리스트 슬라이싱 : [n:m]

리스트에서 원하는 아이템만 뽑기
문자열 슬라이싱 가능

n<= [n:m] <m

-슬라이싱 할 떄 단계 설정 가능

numbers = [2, 50, 0.12, 1, 9, 7, 17, 35, 100, 3.14]
print('numbers: {}'.format(numbers[2:-2]))  ##세번쨰 숫자부터 맨 끝에서 세번째 숫자까지
print('numbers: {}'.format(numbers[2:-2:2]))  ## 마지막 숫자는 '단계'
print('numbers: {}'.format(numbers[:-2:2])) ##앞 쪽 숫자 생략(맨 처음부터)
print('numbers: {}'.format(numbers[::2])) ##시작,끝 생략가능(리스트내 숫자) 전부 다 사용)

numbers: [0.12, 1, 9, 7, 17, 35]
numbers: [0.12, 9, 17]
numbers: [2, 0.12, 9, 17]
numbers: [2, 0.12, 9, 17, 100]

-슬라이싱을 이용해서 아이템 변경 가능

students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students))

students[1:4] = ['park chan-ho', 'lee young-gyu', 'kang ho-dong']
print('students: {}'.format(students))

students: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students: ['홍길동', 'park chan-ho', 'lee young-gyu', 'kang ho-dong', '박승철', '김지은']

-slice() 함수

students = ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
print('students: {}'.format(students[slice(2, 4)]))
print('students: {}'.format(students[slice(4)]))
print('students: {}'.format(students[slice(2, len(students))]))
print('students: {}'.format(students[slice(2, len(students)-2)]))
print('students: {}'.format(students[slice(len(students)-5, len(students)-2)]))

students: ['홍길동', '박찬호', '이용규', '강호동', '박승철', '김지은']
students: ['이용규', '강호동']
students: ['홍길동', '박찬호', '이용규', '강호동']
students: ['이용규', '강호동', '박승철', '김지은']
students: ['이용규', '강호동']
students: ['박찬호', '이용규', '강호동']


─리스트 곱셈 연산

리스트를 곱셈 연산하면 아이템 반복

students = ['홍길동', '박찬호', '이용규']
print(f'students: {students}')

studentsMul = students * 2
print(f'students: {studentsMul}')

students: ['홍길동', '박찬호', '이용규']
students: ['홍길동', '박찬호', '이용규', '홍길동', '박찬호', '이용규']

─아이템 위치 찾기

index(item) 함수로 item의 인덱스를 알 수 있음

students = ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은']
print(f'students: {students}')

searchIdx = students.index('강호동', 2, 6) #2번째에서 6번째 사이에서 '강호동' 찾기
print(f'students: {searchIdx}')

students: ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은']
students: 4

─count()

특정 아이템의 개수를 알아낼 수 있음

students = ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은', '박승철']
print('students: {}'.format(students))

searchCnt = students.count('박승철')
print('students: {}'.format(searchCnt))

searchCnt = students.count('홍길동')
print('students: {}'.format(searchCnt))

searchCnt = students.count('김누구')
print('students: {}'.format(searchCnt))

students: ['홍길동', '박찬호', '이용규', '박승철', '강호동', '김지은', '박승철']
students: 2
students: 1
students: 0

from.제로베이스 데이터 취업스쿨 강의

0개의 댓글