Computer Science/자료구조

[4.18] 01-2 반복하는 알고리즘

토마토. 2021. 4. 18. 15:57

<Do it! 자료구조와 함께 배우는 알고리즘 입문>

1장 알고리즘 기초

01-2 반복하는 알고리즘

 

1부터 n까지의 정수의 합 구하기

방법 1

def sum(n):
  sum = 0
  for i in range(1, n+1):
    sum += i
  return sum

print(sum(5))

방법 2

def sum(n):
  sum = 0
  i = 1
  while i <= n:
    sum += i
    i += 1
  return sum

print(sum(5))

while문 반복

- 반복 구조 repetition structure / loop : 어떤 조건이 성립하는 동안 반복해서 처리하는 것

- 사전 판단 반복 구조 - while 조건식 :

- 명령문(루프 본문)

- 카운터용 변수 - 반복을 제어할 때 사용하는 변수 ex) i

 

for문 반복

-루프 범위 loop limit : {시작 지점} ~ {종료 지점}

- 이터러블 객체 생성 : 반복할 수 있는 객체(생성하는 건 range() / 객체 - list, str, tuple)

* range(a, b, step) : a 이상 b 미만 step 간격으로 나열

 

연속하는 정수의 합을 구하기 위해 값 정렬하기

입력 a, b출력 a에서 b까지의 정수 합

def sum(a, b):
  sum = 0
  for i in range(a, b+1):
    sum += i
  return sum

print(sum(2, 3))

* a > b일 때는?

def sum(a, b):
  sum = 0
  if a > b:
    a1 = b
    b1 = a
  for i in range(a1, b1+1):
    sum += i
  return sum

print(sum(5, 3))

**예제 - 두 값 교환하기** 

- 튜플을 생성해서 교환한다고 한다. (cf) 02-1 튜플)

a, b = b, a

 

반복 과정에서 조건 판단하기 1

입력 : 정수 a, b

출력 : 'a부터 b까지 정수의 합을 구합니다.

정수 a를 입력하세요 : 3

정수 b를 입력하세요 : 5

3 + 4 + 5 = 12'

hmm..

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

sum = 0

if a > b:
  a, b = b, a
for i in range(a, b):
  print(str(i) + '+', end = '')
  sum += i

print(str(b), '=', str(sum+b), end = '')

예제 코드 - f 없으면 {i}로 그대로 출력한다. 

* if문 때문에 비효율적 *

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

sum = 0

if a > b:
  a, b = b, a
for i in range(a, b+1):
  if i < b:
    print(f'{i} + ', end = '')
  else:
    print(f'{i} = ', end = '')
  sum += i

print(sum)

 

두 값 교환하기 2 - 임시 변수 t를 이용할 수도 있음 ㅇㅎ

 

반복 과정에서 조건 판단하기 2

 

* 줄바꿈 없이 연속으로 출력하기

* 입력 - 출력 개수

* 출력 - '+와 -를 번갈아 출력합니다. 

몇 개를 출력할까요? : 12

+-+-+-+-+-+-' 

print('+와 -를 번갈아 출력합니다.')
n = int(input('몇 개를 출력할까요? : '))

if n % 2 == 1:
  print('+-' * (n//2) + '+')
else:
  print('+-' * (n//2))

반복 조건에서 조건 판단하기 3

입력 : 출력 개수, 줄바꿈 간격

출력 : '*를 출력합니다.

몇 개를 출력할까요? : 14

몇 개마다 줄바꿈할까요? : 5'

 

print('*를 출력합니다.')
n = int(input('몇 개를 출력할까요? : '))
div = int(input('몇 개마다 줄바꿈할까요? : '))

for i in range(1, n//div+1):
  print('*' * div)
print('*' * (n%div))

예제 코드

print('*를 출력합니다.')
n = int(input('몇 개를 출력할까요? :'))
w = int(input('몇 개마다 줄바꿈할까요? :'))

for i in range(n):
  print('*', end='')
  if i % w == w - 1:
    print() #어머 이게 줄바꿈!
if n % w:
  print()

- i % w == w - 1 (다음 단계에서 배수니까 한 줄 띄운다)

예제 코드 2

print('*를 출력합니다.')
n = int(input('몇 개를 출력할까요? :'))
w = int(input('몇 개마다 줄바꿈할까요? :'))

for i in range(n//w):
  print('*' * w)

rest = n % w
if rest:
  print('*' * rest)

양수만 입력받기

1부터 n까지의 합을 구한다. 

입력: n

출력 : 'n값을 입력하세요 : -1

n값을 입력하세요 : 0

n값을 입력하세요 : 2

1에서 n까지의 합은 3'

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

while True:
  if n > 0:
    break
  n = int(input('n값: '))

print(n * (n+1) // 2)

무한 루프infinite loop와 break문

 for문이 종료된 이후 카운터용 변수 i값

 

직사각형 넓이로 변의 길이 구하기

입력 : 넓이

출력 : 모든 가능한 변의 조합

ex) 4

4 * 1

2 * 2

n = int(input('넓이는 : '))
for i in range(1, n+1):
  if n % i == 0:
    print(str(i), '*', str(n // i))