AIVLE

Python 프로그래밍

민주82 2023. 2. 3. 22:02

<알고리즘과 플로우 차트>

 

알고리즘

: 어떠한 수학 문제를 해결하기 위해 정해 놓은 일련의 절차

 

 

문자열 입력 받기

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