본문 바로가기
Python/Do it Python

Python 알고리즘 기초

by Thinking 2021. 7. 15.

알고리즘이란?

 알고리즘은  수학과 컴퓨터 과학, 언어학 또는 관련 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것을 의미한 것, 계산을 실행하기 위한 단계적 절차를 의미한다. 즉 문제 해결에 필요한 계산 절차 또는 처리과정의 순서를 뜻하며 프로그램 명령어의 집합을 의미하기도 한다. 현재 DO IT 자료구조와 함께 배우는 알고리즘 입문, 저자 BohYoh Shibata의 책으로 공부를 하고 있고, 터득한 지식을 정리해서 올릴 것이다. 파이썬이 아직 생소한 부분이 많아 쉬운 부분 또한 함께 정리하려 한다.

 

 

1) while 문을 이용한 합계 구하기

while i <=num:

  sum+= i

  i+= 1

 

2) for 문을 이용한 합계 구하기

for i in range(1, num+1):

  sum+=i

 

3) while 문을 이용한 무한루프와 break를 사용하여 조건에 맞는 값 입력하기

while True:(무한루프와 break)

  n=int(input("n값 :"))

  if n>0:

    break

 

cf)

 // -> 몫 연산자, %-> 나눗셈 연산자

아래는 a와 b를 오름차순으로 정렬하는 것인데 굉장히 간단하면서도 생각에 남아 적어보았다.

if a> b:

 a, b = b, a 

 

 

========================================================================================

 

<1> 합계 구하기 

 

a=int(input("a의 정수 값 :"))         #  a의 정수 값 입력

b=int(input("b의 정수 값 :"))          #  b의 정수값 입력

 

if a> b:                                                  # a, b의 오름차순 알고리즘

  a, b=b, a

sum =0

 

for i in range(a, b+1):                     # for 문 사용 a~b까지 합을 출력

  if i <b:

    print(f'{i}+', end='')

  else:

    print(f'{i}=', end='')

  sum+=i

 

print(sum)

 

 

<2> 합계 구하기

 

a=int(input("a의 정수 값 :"))

b=int(input("b의 정수 값 :"))

 

if a> b:

  a, b=b, a

sum =0

 

for i in range(a, b):                      # for문을 a~ b-1까지 합을 출력

    print(f'{i}+', end='')

    sum+=i

 

print(f'{b}=', end='')                    # b번째 값을 끝으로 합계를 구해야 하기 때문에 필요한 부분 더해줌

sum+=b

 

print(sum)

 

1번 코드와 2번 코드의 차이점

실행결과는 같지만 2번째 코드는 i가 b보다 크거나 같음 판단을 하지 않으므로 효율이 더 좋다.

즉 판단 횟수가 n번에서 0번으로 바뀌고, 반복 횟수도 1 감소하였다. 이렇게 프로그램을 개선하면 알고리즘 효율을 높일 수 있다. 비슷한 다른 코드도 확인해 보자.

 

========================================================================================

 

<1> +,-  홀, 짝 개수만큼 출력

 

print('+,-를 번갈아 출력')

num = int(input("몇개 출력  :"))

 

for i in range(num):                # 옆의 for 문과 같은 표현이다.( for i in range(1, num+1):)

 

  if i%2==0:                                   # 나머지가 0 이면 - 를 출력, 아니라면 + 를 출력

    print('-', end='')

  else:

    print('+', end='')

 

 

위 프로그램은 잘 작동하지만 2 가지 문제점이 있다.

  1. If 문이 for 문이 반복될 때마다 돌아가야 하는 것
  2. 상황에 따라 유연하게 수정하기 어렵다는 것

 

<2> +,-  홀, 짝 개수만큼 출력 (개선 부분)

 

print('+,-를 번갈아 출력')

num = int(input("몇개 출력  :"))

 

for _ in range(num//2):            # 반환하는 인덱스 값을 알 필요 없을 때는 언더스코어를 사용할 수 있다.

  print('+-', end='')

 

if num%2 :                                    # 파이썬에서 bool 연산자로 정수를 나타낸다면 0은 거짓을, 다른 값은 참

  print('+', end='')

 

========================================================================================

 

<약수를 나열하는 프로그램>

 

area = int(input("직사각형의 넓이를 입력하세요 :"))

 

for i in range(1, area+1):

  if i*i> area: break                        # i*i 가 면적보다 크게 되면 프로그램이 종료된다. 예로 area가 32이고 i가 6 이상이 되면 종료되는 것

  if area% i : continue                   # continue문은 area가 i로 나누어 떨어지면 print로 출력, 아니라면 조건 반복

  print(f'{i} x {area//i}')

 

 

cf) 

continue문과 break문에 대해 설명한다면, break문은 루프를 빠져나가게 하므로 코드가 더 이상 실행되지 않고 프로그램을 종료시킨다. continue문은 예를 들면 1 ~ 10까지 출력하는데 4,8 인 경우에만 출력하지 않고 건너뛸 때 사용할 수 있다.

 

 

 

<비교 연산자를 연속으로 사용하는 방법과 드모르간의 법칙>

 

 

이 프로그램은 2자리 양수를 입력받으면서 그 외 자리의 수는 프로그램을 종료시키는 것이다.  옆의 코드 말고도 다른 3,4가지 방법으로 해보면서  새롭게 알게 된 부분은 continue문, pass 문에 대해 내가 잘못 알고 있었다는 것이다. 그래서 다시 정리해 본다.

1. pass : 실행할 코드가 없는 것으로 다음 행동을 계속해서 진행합니다.

2. continue : 바로 다음 순번의 loop를 수행합니다.

3. break : 반복문을 멈추고 loop 밖으로 나가도록합니다.

'Python > Do it Python' 카테고리의 다른 글

Python 재귀 알고리즘  (0) 2021.08.10
Python Stack,Queue  (0) 2021.08.08
Python 검색 알고리즘  (0) 2021.08.07
Python 알고리즘 자료구조와 배열(하)  (0) 2021.07.21
Python 알고리즘 자료구조와 배열(상)  (0) 2021.07.18