알고리즘: 기초

Ju_Nik_e·2023년 4월 10일
0

알고리즘: 개념

목록 보기
1/12

알고리즘

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

올바른 알고리즘

  • 어떠한 경우에도 실행결과가 똑같이 나오는 것

알고리즘 기초

최대값 구하기

print('최대값 구하기')
a = int(input('정수 a :' ))
b = int(input('정수 b :' ))
c = int(input('정수 c :' ))

#maximum 에 a 대입
maximum = a 

#b가 더 크면 maximum에 b 대입
if b > maximum: 
    maximum = b
    
#c가 더 크면 maximum에 c 대입 
if c > maximum: 
    maximum = c

print(f'최대값은 {maximum}')
  • 조건식으로 평가한 결과에 따라 프로그램 실행 흐름이 변경되는 것을 선택구조(select structure)라고 함
  • 조건식에 따라 알고리즘 흐름이 두 갈래로 나뉘는 것을 양 갈래 선택이라고 함.

함수의 구조

#함수 선언
def max(a, b, c): 
	maximum = a
    #헤더 부분
    if b > maximum: 
    	#suite 부분
    	maximum = b 
    #헤더 부분
    if c > maximum: 
    	#suite 부분
    	maximum = c
    #결과값 반환
    return maximum 
  • if문이나 while문 등의 조건이 있는 부분을 헤더라고 하고 : 콜론 뒷 부분의 실행문을 수트(suite)라고 함

중앙값 구하기

def med3(a, b, c): #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

a = int(input())
b = int(input())
c = int(input())

print(med3(a, b, c))
  • if문의 경우 elif가 갯수만큼 분기함(elif가 2개면 분기가 총 4개)
  • else가 따로 작성하지 않더라도 else는 기본적으로 분기의 개수에 포함됨
  • 분기의 개수가 적을수록 더 효율적인 프로그램임

산술 연산자(operator)

  • +,-,<,>등의 기호
  • 단항 연산자 : 피연산자가 1개(-a)
  • 이항 연산자 : 피연산자가 2개(a < b)
  • 삼항 연산자 : a if b else c

피연산자(opernad)

  • 연산 대상

1부터 n까지 합 구하기

n = int(input())
sum = 0
i = 1
while i <= n:
	sum +=  i
    i += 1
print(sum)
  • 어떤 조건이 성립하는 동안 반복해서 처리하는 것을 반복 구조(repetition structure)(루프loop)라고 함.
print('1부터 n까지의 합을 구합니다.')
n = int(input('n값을 입력하세요.: '))

sum = 0
for i in range(1, n + 1):
    sum += i  # sum에 i를 더함

print(f'1부터 {n}까지 정수의 합은 {sum}입니다.')

가우스의 덧셈

sum = n * (n+1) //2
  • 1부터 n까지 정수 합 구하는 공식
  • n이 10이라면 sum에 55가 저장됨

for문과 while문의 차이점

  • 실행하기 전 반복을 계속할 것인지 판단함(사전 판단 반복구조)
  • 변수가 하나만 있을 때는 while문보다 for문을 주로 사용함

for문

for i in range(10):
	print(i)
  • 헤더에 반복 횟수를 설정해주기 때문에 미리 반복 횟수를 알고 있음
  • range(n) 0이상 n미만으로 나열
  • range(a, b) a이상 b미만으로 나열
  • range(a, b, step) a이상 b미만인 수를 step간격으로 나열
  • for _ in range(x)<- 반환하는 값을 사용할 필요 없을때는 _(언더스코어)를 사용
  • for i in range(a,b)는 [a, a+1, a+2, ... , b-1]이라는 이터러블 객체를 생성함.
    -> for문 종료시 i값은 b-1임.

while문

i = 0
while i < 10:
	print(i)
    i += 1
  • 조건에 따라 반복 횟수가 달라짐
  • while <= n은 종료 시 i값이 n+1임

연속하는 정수의 합 구하기

print('a부터 b까지의 합을 구합니다.')
a = int(input('정수 a를 입력하세요.: '))
b = int(input('정수 b를 입력하세요.: '))

if a > b:
    a, b = b, a  # a와 b를 오름차순으로 정렬

sum = 0
for i in range(a, b + 1):
    sum += i  # sum에 i를 더함

print(f'{a}부터 {b}까지 정수의 합은 {sum}입니다.')
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  # sum에 i를 더함

print(f'{b} = ', end ='')
sum += b      # sum에 b를 더함

print(sum)

+,-번갈아 출력하기

n = int(input()) # 출력개수
for _ in range(n//2):
	print('+-', end='')

if n%2:
	print('+', end='')
  • for문의 범위를 range(1, n+1)로 할 수 도 있지만 그러면 for문 안에 if문을 넣어야 함으로 해당 범위를 돌 때마다 if문을 확인해야 하기 때문에 효율이 떨어짐
  • _(언더 스코어)는 for문을 순환하면 반환하는 값을 사용할 필요가 없기 때문에 무시하고 싶은 값을 언더스코어로 표현할 수 있음.

*를 n개 출력하되, w개 마다 줄바꿈하기

n = int(input(출력갯수:))
w = int(input(줄바꿈:))

for _ in ragne(n //w):
	print('*' * w)
    
rest = n % w
if rest:
	print('*' * rest)

드모르간 법칙

  • 각 조건을 부정하고 논리곱(and)를 논리합(or)으로, 논리합을 논리곱으로 바꾸고 다시 전체를 부정하면 원래 조건과 같음

    if num >= 10 and num <= 99
    if 10 <= num <= 99
    if not (num < 10 or num > 99)
    모두 같음
    x and y == not(not x or not y)
    x or y == not(not x and not y)
    not(a and b) == (not a) or (not b)
    not(a or b) == (not a) and (not b)

0개의 댓글