파이썬 자료구조/알고리즘 02 : 알고리즘 기초2

728x90

반복 과정에서 조건 판단

다음은 n을 입력받고 1부터 값을 증가시키면서 홀수인 경우 +, 짝수인 경우-를 출력하는 코드이다.

n = int(input('몇 개를 출력? :'))

for i in range(1, n+1):
    if i % 2:
        print('+', end='')

    else :
        print('-', end='')

print()

이 코드는 n의 값이 커지면 if문도 그만큼 반복되어야하므로 상황에따라 유연하게 수정하기 어려워진다.

 

개선한 코드

n = int(input('몇 개를 출력 :'))

for _ in range(n // 2):
    print('+-', end='')

if n % 2:
    print('+', end='')

print()

+-가 반복되는 부분은 반복문에서 모두 출력되도록 하고, 입력받은 값이 홀수일 경우 마지막 값으로 +를 출력한다.

n이 15를 입력받은 경우, 7번 +-를 출력하고 홀수이므로 +를 하나 더 출력하게 될 것이다.

(//는 몫을 출력하는 연산자이다.)

 

윗코드에서 인덱스 값으로 쓰이던 i를 _(언더스코어)로 대체하였다. 파이썬에서는 인덱스 값을 사용할 필요가 없을때 언더스코어로 표현할 수 있다.

 

 

다음은 *를 n개 출력하되 w개마다 줄바꿈하는 코드다.

n = int(input('몇 개 출력?'))
w = int(input('몇 개마다 줄 바꿈?'))

for i in range(n):
    print('*', end='')
    if i % w == w - 1:
        print()
결과 >
몇 개 출력?14
몇 개마다 줄 바꿈?5
*****
*****
****

i가 4, 9, 14일때마다 줄바꿈이 된다. 0부터 시작하므로 5개를 출력후에 줄바꿈이 된다.

if문을 for문 밖으로 빼서 다시 코드를 작성해 보자.

 

n = int(input('몇 개 출력?'))
w = int(input('몇 개마다 줄바꿈?'))


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


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

 

 


반복문 탈출하기 break, 반복문 재시작하기 continue

break문으로 반복문에서 빠져나올 수 있다.

다음은 직사각형의 넓이를 입력하여 짧은 변과 긴 변의 길이를 출력하는 코드다.

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}')
직사각형 넓이 : 32
1 x 32
2 x 16
4 x 8

area % i 가 0이 나오지 않는 경우 반복문의 나머지 스위트 부분을 건너뛰고 다시 반복문의 처음 부분으로 돌아가는 continue문에 의해 i에는 32의 약수만 출력되도록 하였다.

8x4, 16x2, 32x1의 경우는 중복이 되므로 출력하지 않도록 한다. 이를 방지하기 위해 ixi값이 입력받은 수보다 커버리면 반복문을 빠져나오도록 한다.

32에 각 약수를 나눈 값 또한 32의 약수가 된다는 점을 이용해 print(f'{i} x {area //i}')과 같은 식을 도출할 수 있다.

 

 

 


이중 루프

정수 n을 입력 받고 

*

**

*** 의 형태로 *을 n개의 줄만큼 출력하는 코드를 작성해 보자.

 

이 형태를 행렬로 비유하면 열의 개수는 1부터 행의 개수만큼 하나씩 늘어나는 형태라고 할 수 있다.

0행 0열

1행 0열 1열

2행 0열 1열 2열

3행 0열 1열 2열 3열

.

.

.

각 행을 i라고 하고, 열마다 *을 출력하도록 하면 다음과 같은 코드가 될 것이다.

n = int(input('* 몇줄 출력? : '))
for i in range(n):
    for j in range(i+1):
        print('*', end="")
    print()
결과 >
* 개수는? : 5
*
**
***
****
*****

단순히 i값이 0일 때 j값이 0부터 i값까지 증가하면서 *를 출력하고 줄바꿈까지 하는 것을 반복하는 것이다.

이것을 이용해서 

        *

      **

    ***

  ****

*****

의 형태로 출력하는 코드를 작성해보자. (오른쪽으로 정렬된 형태)

n이 5라면 다음과 같은 형태일 것이다.

0행 0열 1열 2열 3열 4열

1행 0열 1열 2열 3열 4열

2행 0열 1열 2열 3열 4열

3행 0열 1열 2열 3열 4열

4행 0열 1열 2열 3열 4열

n = int(input('* 몇줄 출력? : '))
for i in range(n):
    for _ in range(n-i-1):
        print(' ', end='')
    for _ in range(i+1):
        print('*', end='')    
    print()
* 몇줄 출력? : 5 
        *
      **
    ***
  ****
*****

n이 5일때 i는 0~4까지 증가한다.

공백의 개수는 행이 증가할수록 4, 3, 2, 1, 0으로 감소한다.

*의 개수는 행이 증가할수록 1, 2, 3, 4, 5로 증가한다.

728x90