<알고리즘과 플로우 차트>
알고리즘
: 어떠한 수학 문제를 해결하기 위해 정해 놓은 일련의 절차
문자열 입력 받기
name = input('이름을 입력하세요.:')
print(f'안녕하세요?{name}님.'})

숫자 입력 받기
length = input('정사각형의 한 변의 길이를 입력하세요.: ')
print(f'정사각형의 넓이는 {int(length)**2}입니다.')

세 정수의 최댓값 구하기
print('세 정수의 최댓값을 구합니다.')
a = int(input('정수 a의 값을 입력하세요.: '))
b = int(input('정수 b의 값을 입력하세요.: '))
c = int(input('정수 c의 값을 입력하세요.: '))
maximum = a
if b > maximum:
maximum = b
if c > maximum:
maximum = c
print(f'최대값은 {maximum}입니다.')
조건과 분기문
: 조건문을 충족 여부에 따라 프로그램이 분기하게 됨
분기 - 프로그램의 실행 흐름을 다른 곳으로 변경하는 명령
n = int(input('정수를 입력하세요.: '))
if n > 0:
print('이 수는 양수입니다.')
elif n < 0:
print('이 수는 음수입니다.')
else:
print('이 수는 0입니다.')
if - elif - else(조건 필요 없음)
<반복하는 알고리즘>
1부터 n까지 정수의 합 구하기
1) while
print('1부터 n까지 정수의 합을 구합니다.')
n = int(input('n값을 입력하세요.: '))
sum = 0 #합은 0부터 시작
i = 1 #정수는 1부터 시작
while i <= n: #1부터 n까지
sum += i #sum에 i를 더함
i += 1 #i는 1씩 증가
print(f'1부터 {n}까지 정수의 합은 {sum}입니다.')
2) for
print('1부터 n까지 정수의 합을 구합니다.')
n = int(input('n값을 입력하세요.: '))
sum = 0 #합은 0부터 시작
for i in range(1, n+1): #i는 1부터 n까지
sum += i #합에 i를 더함
print(f'1부터 {n}까지 정수의 합은 {sum}입니다.')
무한루프와 break
# 1부터 n까지 정수의 합 구하기 (n값은 양수만 입력받음)
print('1부터 n까지 정수의 합을 구합니다.')
while True:
n = int(input('n값을 입력하세요.: '))
if n > 0:
break # n이 0보다 커질때 까지 반복
# 위에서 본 1부터 n까지 더하는 코드
sum = 0
i = 1
for i in range(1, n+1):
sum += i
i += 1
print(f'1부터 {n}까지 정수의 합은 {sum}입니다.')
continue와 break
# 가로, 세로 길이가 정수이고 넓이가 area인 직사각형에서 가능한 변의 길이 나열
area = int(input('직사각형의 넓이를 입력하세요.: '))
for i in range(1, area + 1):
if i * i > area: break
if area % i: continue
print(f'{i} x {area // i}')
i*i 이면 for loop를벗어남(break)
area % i 값이 있으면 for loop의 다음 반복 진행(continue)
<자료구조와 배열>
자료구조란..?
: 논리적인 관계로 이루어진 데이터 구성 / 데이터가 모여있는 구조다.
리스트 원소의 최댓값 구하기
a = [1,2,3]
maximum = a[0]
if a[1] > maximum:
maximum = a[1]
if a[2] > maximum:
maximum = a[2]
함수로 작성하게 된다면 아래와 같다.
def max_of(a):
maximum = a[0]
for i in range(1,len(a)):
if a[i] > maximum:
maximum =a[i]
return maximum
t = (4, 6.7, 3, 9.2) # 예시를 들어 결과값 확인
print(f'{max_of(t)}')
리스트와 튜플의 차이
리스트는..
리스트명 = [요소1, 요소2, 요소3]
튜플은..
튜플명 = (요소1, 요소2, 요소3)
--> 보기에는 비슷하지만 튜플은 리스트와 다르게 추가,수정,삭제가 불가능하다!
사용자의 입력으로 리스트 생성하는 방법
ⓛ 미리 원소의 개수를 입력하고, 그에 맞는 개수의 요소들을 입력
num = int(input('원소 수를 입력하세요.: '))
x = [None] * num # 원소 수가 num인 리스트를 생성
for i in range(num):
x[i] = int(input(f'x[{i}]값을 입력하세요.: '))
② 원하는 만큼 요소들을 입력한 후, End로 종료
print('주의: "End"를 입력하면 원소 입력을 종료합니다.')
i = 0
x = []
while True:
s = input(f'x[{i}]값을 입력하세요.: ')
if s == 'End':
break
x.append(int(s))
i += 1
리스트의 모든 원소 스캔하기
X = ['Hi', 'I', 'like', 'Pizza']
for i in range(len(x)):
print(f'x[{i}] = {x[i]}')

→ 내장 함수 'enumerate' 사용해도 동일한 결과를 얻을 수 있다.
for i, name in enumerate(x):
print(f'x[{i}] = {name}')
인덱스 값을 사용하지 않을 경우
X = ['Hi', 'I', 'like', 'Pizza']
for i in x:
print(i)

원소를 역순으로 정렬하기
a = [4,7,9,1,5,2,3]
| 4 | 7 | 9 | 1 | 5 | 2 | 3 |
교환
| 3 | 7 | 9 | 1 | 5 | 2 | 4 |
교환
| 3 | 2 | 9 | 1 | 5 | 7 | 4 |
교환
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
끝!
교환 횟수 = 원소 수 / 2
왼쪽 원소의 인덱스 i와 오른쪽 원소의 인덱스 n-i-1를 교환하는 방식!
원소를 역순으로 정렬하는 함수
def reverse_list(a):
n = len(a)
for i in range(n // 2): #교환하는 횟수
a[i], a[n - i - 1] = a[n - i - 1], a[i]
a = [4,7,9,1,5,2] # 예시를 들어 결과값 확인하기
reverse_list(a)
print(a)
<검색 알고리즘>
검색 알고리즘이란?
: 원하는 값을 가진 원소를 찾아내는 알고리즘,
자료구조에 따라 활용할 수 있는 검색 알고리즘이 달라짐
1) 선형검색
직선 모양으로 늘어선 리스트에서 검색하는 경우에 원하는 값을 가진 원소를 찾을 때까지 맨 앞부터 스캔하여 순서대로 검색하는 알고리즘
ex) 1을 검색하는 경우
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
성공적으로 검색!
ex) 9를 검색하는 경우
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
| 3 | 2 | 5 | 1 | 9 | 7 | 4 |
검색할 값과 같은 원소를 찾지 못하고 리스트의 맨끝에 도달한 경우--> 검색 실패!
# While문
def seq_search(a, key):
i = 0
while True:
if i == len(a):
return -1
if a[i] == key:
return i
i += 1
# For문
def seq_search_for(a, key):
for i in range(len(a)):
if a[i] == key:
return i
return -1
####################
a = [6,7,3,2,9,4]
index = seq_search(a, 3)
index = seq_search_for(a, 4)
if index == -1:
print('검색값을 갖는 원소가 존재하지 않습니다.')
else:
print(f'검색값은 a[{index}]에 있습니다.')
2) 이진 검색
: 리스트의 데이터가 오름차순이나 내림차순으로 정렬되어 있어야 적용가능
선형검색에 비해 빠르게 검색값을 찾을 수 있음
아래의 리스트에서 39를 검색
인덱스
0 1 2 3 4 5 6 7 8
| 5 | 7 | 15 | 28 | 31 | 39 | 58 | 68 | 70 |
중앙에 위치한 값 찾음
| 5 | 7 | 15 | 28 | 31 | 39 | 58 | 68 | 70 |
39가 31봐 크므로 검색 대상은 5~8 인덱스
5~8 인덱스의 중앙값은 int((5+8)//2)로 6임
| 5 | 7 | 15 | 28 | 31 | 39 | 58 | 68 | 70 |
#검색 범위 맨 앞: pl, 맨 끝: pr, 중앙의 인덱스: pc
def bin_search(a, key):
pl = 0
pr = len(a)-1 #인덱스는 0부터 시작
while True:
pc = (pl + pr) // 2
if a[pc] == key:
return pc
elif a[pc] < key:
pl = pc + 1
else:
pr = pc - 1
if pl > pr:
break
return -1
a = [5, 7, 15, 28, 31, 39, 58, 68, 70]
index = bin_search(a, 39)
if index == -1:
print('검색값을 갖는 원소가 존재하지 않습니다.')
else:
print(f'검색값은 a[{index}]에 있습니다.')

'AIVLE' 카테고리의 다른 글
| Web Crwaling ② - 네이버 주가 데이터 수집 (1) | 2023.02.17 |
|---|---|
| Web Crwaling ① - basic (0) | 2023.02.17 |
| 데이터 분석 및 의미 찾기 (0) | 2023.02.09 |
| 데이터 처리 (0) | 2023.02.07 |
| Python 라이브러리 (0) | 2023.02.06 |