중첩 루프 (다중 루프)

Jeongyun Heo·2021년 1월 10일
0

Python

목록 보기
24/36
post-thumbnail

19.1 중첩 루프 사용하기
https://dojang.io/mod/page/view.php?id=2259

sep, end
https://rfriend.tistory.com/560

중첩 루프 사용하기

반복문 안에 반복문이 들어가는 형태를 중첩 루프, 다중 루프 라고 한다.
반복문의 루프 인덱스 변수는 index의 첫 글자를 따서 i를 사용한다.
반복문 안에 반복문이 들어갈 때는 변수 이름을 i, j, k처럼 i부터 알파벳 순서대로 짓는다.(관례적으로 사용하고 있다.)

바깥쪽 루프는 세로 방향을 처리하고, 안쪽 루프는 가로 방향을 처리한다.

for i in range(2, 10):       # 2~9, 바깥쪽 루프는 세로 방향
    for j in range(1, 10):   # 1~9, 안쪽 루프는 가로 방향
        print(i*j, end=' ')  # 한 줄에 계속해서 출력
    print('')                # 안쪽 루프가 끝나면 다음 줄부터 출력

-------------------------------
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81 

바깥쪽 루프에서 시작하여 안쪽 루프가 가로 방향으로 i*j 값을 출력한다.
줄바꿈 없이 가로 방향으로 출력하기 위해 end=' '를 넣어주었다.
가로 방향 출력이 끝나면 바깥쪽 루프에서 print('') 다음 줄부터 출력하게 해주는 문장이다.

for i in range(5):  # 바깥쪽 루프는 세로 방향
    for j in range(5):  # 안쪽 루프는 가로 방향
        print('j', j, sep='', end=' ')  # j값 출력
    print('i', i, sep='')  # i값 출력

----------------------------------------
j0 j1 j2 j3 j4 i0
j0 j1 j2 j3 j4 i1
j0 j1 j2 j3 j4 i2
j0 j1 j2 j3 j4 i3
j0 j1 j2 j3 j4 i4

먼저 바깥쪽 루프로 시작하여 안쪽 루프가 가로 방향으로 j값을 출력한다.
줄바꿈을 하지 않기 위해서 end=' '를 넣어주었다.
그리고 가로 방향 출력이 끝나면 바깥쪽 루프 실행문을 실행한다.
오른쪽 끝에 세로로 i값 출력된 거 볼 수 있다.

sep='' 써야 j0 이렇게 붙어서 나옴. 안 써주면 j 0 이렇게 띄어서 나옴

sep='separator'

sep='separator' 두 개의 문자열 사이에 '' 안에 입력한 문자로 구분하여 붙여서 출력된다.

사각형으로 별 출력하기

이제 중첩된 반복문을 사용하여 5x5 사각형 형태로 별을 출력해보자.

for i in range(5):    # 바깥쪽 루프는 세로 방향
    for j in range(5):  # 안쪽 루프는 가로 방향
        print('*', end='') # 별 출력, 줄바꿈 하지 않음
    print()   # 가로 방향 출력 다 하고 다음 줄로 넘어감

--------------------------------------------------
*****
*****
*****
*****
*****

end='end_string'
앞의 문자열에 바로 이어서 'end_string'을 붙여서 인쇄

end='' 👈 '' 안에 아무것도 안 써서 바로 옆에 붙어서 쭉 출력되게 해줌

print에 end=''를 지정했을 때 줄바꿈이 되지 않고 오른쪽 방향으로 문자가 계속 붙는 특성을 이용했다.

print() 👈 가로 방향 출력 다 하면 다음 줄로 넘어가게 함. print는 출력 후 기본적으로 다음 줄로 넘어감.

print는 기본적으로 end='\n' 상태이므로 아무것도 지정하지 않아도 \n은 출력됨

사각형 모양 바꾸기

3줄로 별 7개씩 출력

for i in range(3):       # 세로 방향
    for j in range(7):   # 가로 방향
        print('*', end='')  # 붙어서 출력
    print()  # \n 출력

----------------------------
*******
*******
*******

안쪽 반복문은 7번 반복하고, 바깥쪽 반복은은 3번 반복하도록 했다.
즉, 7x3 크기의 사각형을 그린다.

계단식으로 별 출력하기

계단식으로 별이 하나씩 증가하게 출력하려면 if문을 사용해야 한다.

for i in range(5):       # 세로 방향
    for j in range(5):   # 가로 방향
        if j <= i:       # 세로 방향 변수만큼
            print('*', end='')
    print()

--------------------------------
*
**
***
****
*****

첫 번째 줄에는 별 한 개
두 번째 줄에는 별 두 개
세 번째 줄에는 별 세 개
...

별의 개수는 세로 방향인 줄의 위치에 비례하므로 조건식도 세로 방향 변수를 이용해서 작성한다.

if j <= i:와 같이 작성하여 가로 방향으로 별을 출력할 때는 세로 방향의 변수만큼 출력하도록 한다. 따라서 i가 증가하면 별이 늘어난다.

i가 0일 때 j는 0부터 4까지 반복하지만, if문을 만족하는 경우는 j가 0일 때 한 번 뿐이므로 별이 1개만 출력된다.

대각선으로 별 출력하기

for i in range(5):
    for j in range(5):
        if j == i:
            print('*', end='')
    print()

---------------------------------
*
*
*
*
*

if j == i:와 같이 작성하면 가로 변수랑 세로 변수가 같을 때만 별을 출력하는 거라 한 줄에 한 개씩만 출력이 된다.

for i in range(5):
    for j in range(5):
        if j == i:     # 세로 방향 변수와 같을 때
            print('*', end='')  # 별 출력
        else:          # 세로 방향 변수와 다를 때
            print(' ', end='')  # 공백 출력
    print()

----------------------------------
*    
 *   
  *  
   * 
    *

가로 방향 변수와 세로 방향 변수가 같을 때 별을 출력하고, 같지 않을 때는 공백을 출력해서 별이 대각선으로 출력되게 만들었다.

바깥쪽 루프가 세로 방향, 안쪽 루프가 가로 방향을 처리한다.

연습문제: 역삼각형 모양으로 별 출력하기

for i in range(5):
    for j in range(5):
        if j < i:
            print(' ', end='')
        else:
            print('*', end='')
    print()

--------------------------------
*****
 ****
  ***
   **
    *

공백 부분은 세로 방향인 줄의 위치와 비례하므로 조건식도 세로 방향 변수에 맞추어 작성한다.

심사문제: 산 모양으로 별 출력하기

표준 입력으로 삼각형의 높이가 입력됩니다. 입력된 높이만큼 산 모양으로 별을 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다). 이때 출력 결과는 예제와 정확히 일치해야 합니다. 모양이 같더라도 공백이나 빈 줄이 더 들어가면 틀린 것으로 처리됩니다.

height = int(input())

for i in range(height):  # 세로 방향
    for j in reversed(range(height)):  # 가로 방향
        if j > i:
            print(' ', end='')
        else:
            print('*', end='')
    for j in range(height):            # 가로 방향
        if j < i:
            print('*', end='')
    print()

----------------------------------------
5 (입력)
    *
   ***
  *****
 *******
*********

가로 방향 for문을 2개 써서 반씩 출력한다.

reversed로 숫자의 순서를 뒤집는다.

0개의 댓글