
Python 3.8 64bit 설치 -> VS code 설치 후 실습 실행
알고리즘 기초
1-1. 알고리즘이란?
세 정수의 최댓값 구하기
# 세 정수 입력받아 최댓값 구하기
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}입니다.')
- 순차구조 : 한 문장씩 처리되는 구조
- 선택구조 ex) b>maximum: maximum =b
- input( ): 문자열을 전달받는 함수
- int(input( )): input함수에서 받은 문자열을 10진수 정수형으로 변환하고 싶을 때
int('17')
name = input('이름을 입력하세요: ')
print(f'안녕하세요 {name}님.')
문자열과 숫자 입력받기
#문자열로 이름을 입력받아 인사하기
print('이름을 입력하세요.: ', end='')
name = input()
print(f'안녕하세요 {name}님')
위의 첫 줄 print를 생략할 수 있음.
name = input('이름을 입력하세요: ')
print(f'안녕하세요 {name}님.')
input()함수에 전달한 문자열을 먼저 출력한다 --> enter가 입력될 때까지 키보드에서 문자열을 입력받는다 --> enter를 제외한 문자열을 반환한다.
문자열을 정수로 형 변환하는 예시
int('17') #10진수 문자열 --> 10진수 정수형
int('0b110',2) #2진수 문자열 --> 10진수 정수형
int('0o75',8) #8진수 문자열 --> 10진수 정수형
int('0x3F',16)#16진수 문자열 --> 10진수 정수형
float('3.14') #문자열 --> 실수
+a) float는 부동소수점 방식을 사용함.
- 부동소수점(floating point): 컴퓨터에서 실수를 근삿값으로 표현할 때 사용한다.
- 실수를 가수부분/ 지수부분으로 나누어 표현함.
- 가수부분: 유효숫자
- 지수부분: 소수점의 위치
- 양갈래 선택: 조건식에 따라 알고리즘 흐름이 두 갈래로 나뉘는 것.
복합문의 구조
if식 : 스위트
elif식: 스위트
else식: 스위트
#세 정수의 최댓값 구하기 (함수식 작성) - 틀린 예시
def max3(a, b, c):
maximum= a
if b > maximum: maximum=b
elif c> maximum: maximum = c #elif를 쓰게되면 윗조건이 아닐 때에만 실행되므로 원하는 값을 구할 수 없음.
return maximum #return 2가 되어버림
print(f'max3(3,2,1) = {max3(1,2,3)})')
#세 정수의 최댓값 구하기 (함수식 작성) - 맞는 예시
def max3(a, b, c):
maximum= a
if b > maximum: maximum=b
if c> maximum: maximum = c
return maximum
print(f'max3(3,2,1) = {max3(1,2,3)})')
max3( )함수는 매개변수 a,b,c에 숫자를 입력받아 최댓값을 구하여 반환함.
함수의 반환값과 함수 호출식 평가하기
- 함수 내부에서 처리한 값을 반환할 때는 return문을 사용하면 된다.
- 실제로 함수가 반환한 값을 얻으려면 함수를 호출해야 함.
즉 알고리즘이란?
어떠한 문제를 해결하기 위해 정해놓은 일련의 절차
어떠한 경우에도 실행결과가 똑같이 나오는 것.
복합문 작성 시 지켜야하는 규칙들
1. 들여쓰기
2. 스위트가 단순문일 때
3. 스위트가 복합문일 때
같은 행에 여러개 둘 수 없음.
세 정수의 중앙값 구하기
def med3(a, b, c):
if a>=b:
if b>=c:
return b
elif a<=c:
return a
else:
return c
elif a>c:
return a
elif b>c:
return c
else:
return b
print('세 정수의 중앙값을 구합니다.')
a= int(input('정수 a: '))
b= int(input('정수 b: '))
c= int(input('정수 c: '))
print(f'중앙값은 {med3(a,b,c)}입니다')
Q. 각 else부분의 조건은 무엇일까?
--> 중앙값구하기 다른 방식
효율은 좋지 않음. (b>=a, b<=a에서 b=a가 두 번 계산되니까)
a와 b 비교를 이미 마친 상태에서 다시 비교하기 때문에 효율이 좋지 않음
조건문과 분기
실습1-3) 입력받은 정수값의 부호 판단
n = int(input('정수를 입력하세요: '))
if n>0:
print("양수입니다.")
elif n<0:
print("음수입니다.")
else:
print("0 입니다.")
실습1-4) 3개로 분기하는 조건문
n = int(input('정수를 입력하세요: '))
if n==1:
print("A")
elif n==2:
print("B")
else:
print("C") #n이 3,4,5...일 때 전부 C를 출력
실습 1-5)
n = int(input('정수를 입력하세요: '))
if n==1:
print("A")
elif n==2:
print("B")
elif n==3:
print("C") # n==4일때 아무것도 출력하지 않음
실습 1-6) 실습1-5의 원래모습
n = int(input('정수를 입력하세요: '))
if n==1:
print("A")
elif n==2:
print("B")
elif n==3:
print("C")
else:
pass
보충1-6) 연산자와 피연산자
- 산술연산자: + - * / % > <
- 피연산자: 1 2 3 4
연산자는 피연산자 개수에 따라 3가지로 분류됨
- 단항 연산자 : -a
- 이항 연산자 : a<b
- 삼항 연산자 : if~else문은 파이썬의 유일한 삼항 연산자
ex) a if b else c
#b가 True이면 a=b, False면 a=c
a = x if x>y else y
# x>y가 참이면 a=x 거짓이면 a=y
# x>y중 큰 값을 a에 대입
순서도 기호 살펴보기
순서도란? 문제를 정의 분석하고 해결하는 방법을 그림으로 나타낸 것.
- 데이터: 기억장치를 지정하지 않은 데이터 자체
- 처리: 여러 종류의 처리 기능 EX) 연산, 연산 집합
- 미리 정리한 처리: 서브루틴이나 모듈등에서 이미 정의한 하나 이상의 연산 또는 명령
- 판단: 조건문
- 루프범위: 루프의 시작과 종료
- 선: 제어의 흐름
- 단말: 프로그램 흐름의 시작과 종료
1-2. 반복하는 알고리즘
실습 1-7) 1부터 n까지의 정수합 구하기
print("1부터 n까지 정수의 합을 구합니다.")
n = int(input("n값을 입력하세요: "))
sum= 0 #sum과 i를 정의해준다.
i=1
#그리고 루프 시작
while i<=n:
sum = sum+ i
i= i+1
print(f"1부터 n까지 합은 {sum}입니다.")
- while 반복문 : 조건이 성립하는 동안 반복해서 처리하는 것을 반복구조
print("1부터 n까지 정수의 합을 구합니다.")
n = int(input("n값을 입력하세요: "))
sum= 0
i=1
for i in range(1, n+1):
sum += i
print(f"1부터 n까지 합은 {sum}입니다.")
보충 1-7) range( )함수로 이터러블 객체 생성
#1부터 n까지 정수의 합
from re import I
#a부터 b까지 정수의 합 구하기(for)
print("a부터 b까지 정수의 합")
a= int(input("a: "))
b= int(input("b: "))
if a>b:
a,b= b,a
#일단 오름차순으로 정렬 조건 맞춰주고
sum= 0
i =1
for i in range(a, b+1):
sum += i
Q. i는 카운터 변수 아니었나? i값을 따로 초기화하지 않으면 , range( )함수 내 값이 i에 자동으로 대입되는 건가?
실습1-10) 반복과정에서 조건 판단
# a부터 b까지 정수합
print("a부터 b까지 정수합 구하기")
a= int(input("a: "))
b= int(input("b: "))
if a>b:
a,b= b,a
sum = 0
for i in range(a, b+1):
if i<b:
print(f"{i} +", end =' ') #i가 b보다 작으면 합을 구하는 과정 출력
elif i>=b:
print(f"{i}= ", end =' ') #i가 b보다 크거나 같으면 최종값 출력을 위해 i=를 출력
sum += i
print(sum)
Q. end =' '의 의미가 무엇인 지
그런데 for문안에 if문을 두는 것이 그렇게 좋은 방법은 아니므로 개선된 다른 예시를 살펴보자
실습1-11) a부터 b 정수의 합구하기(개선)
# a부터 b까지 정수합
print("a부터 b까지 정수합 구하기")
a= int(input("a: "))
b= int(input("b: "))
if a>b:
a,b= b,a
sum = 0
for i in range(a, b):
print(f"{i} +", end =' ')
sum += i
print(f"{b}= ", end=' ')
sum = sum + b
print(sum)1
--> for문 안에서 if문이 불필요하게(i >=b 와 같은 경우) 많이 돌아가지 않기 때문에 더 효율이 좋음.
보충1-9) 두 값 교환하기
sol1) a,b = b,a
sol2) t = a
a = b
b = t
실습1-12) 특정문자를 줄 바꿈 없이 연속으로 출력하기
# +와 -를 번갈아 출력하기1
print("+와 -를 번갈아 출력합시다")
n = int(input('몇 개를 출력할까요?: '))
for i in range(n):
if i%2==1:
print('-',end='')
elif i%2==0:
print('+', end='')
실습 1-13) 특정문자를 줄 바꿈 없이 연속으로 출력하기(불필요한 if문 반복을 개선해보자)
# +와 -를 번갈아 출력하기2
#이렇게도 생각할 수 있구나,,
print("+와 -를 번갈아 출력합시다")
n = int(input('몇 개를 출력할까요?: '))
for _ in range(n//2):
print('+-',end='')
if n%2==1:
print('+', end='')
Q. 마지막 문장에 if n%2: print('+', end='') 해도 코드가 잘 돌아가는데, n이 홀수일 때라는 조건이니까 n%2==1라고 써줘야 하지 않나?? n%2만 써도 코드가 잘 돌아가는 이유가 궁금
for문에서 _(언더스코어)를 사용한 이유: for문을 순환하며 반환하는 값(인덱스)를 사용할 필요가 없기 때문이다.
마치 C언어에서 for( ; ; )표시하는 것 처럼.
실습 1-14) 반복과정에서 조건 판단하기
# *를 n개 출력하되 w개마다 줄바꿈하기
print("*를 출력합시다")
n = int(input('몇 개를 출력할까요?: '))
w = int(input('몇 개마다 줄바꿈할까요?'))
for i in range(n):
print('*',end='')
if i%w == w-1:
print()
if n%w: #n이 w의 배수가 아니라면
print()
n=14, w=5 라면
i = 0,1,2,3,4, 5,6,7,8,9, 10,11,12,13,14
i가 4,9,14일 때 줄을 바꿔줘야 함. 이는 i%w == w-1 일 때 이다.