본문 바로가기
Python 코딩도장

파이썬 코딩도장 Unit 19 정리 : 중첩 루프 사용

by chanfficial 2022. 1. 16.

Unit 19

1. 중첩 루프 사용하기

  • 반복문 안에 반복문이 들어가는 형태를 중첩 루프(다중 루프)라고 한다.
  • 반복문의 루프 인덱스 변수는 index의 첫 글자를 따서 i 를 사용하는데, 반복문에서 반복문이 들어갈 때(중첩 루프)는 변수 이름을 i - j - k 처럼 i 부터 알파벳 순서대로 짓는다.
    중첩 루프(다중 루프)
  • i 를 사용하는 바깥쪽 루프는 세로 방향을 처리하고, j 를 사용하는 안쪽 루프는 가로 방향을 처리한다.
    for i in range(5):       # 5번 반복. 바깥쪽 루프는 세로 방향
        for j in range(5):   # 5번 반복. 안쪽 루프는 가로 방향
            print('j:', j, sep='', end=' ')   # j값 출력. end에 ' '를 지정하여 줄바꿈 대신 한 칸 띄움
        print('i:', i, '\\n', sep='')   # i값 출력, 개행 문자 모양도 출력
                                        # 가로 방향으로 숫자를 모두 출력한 뒤 다음 줄로 넘어감
                                        # (print는 기본적으로 출력 후 다음 줄로 넘어감)​
    중첩 루프 실행 결과
  • 먼저 안쪽 루프가 가로 방향으로 j 값을 출력하고 sep = ' ' 과 end = ' '를 지정했기 때문에 한 칸씩 띄워주며 줄바꿈은 하지 않는다.
  • 가로 방향 출력이 끝나면 바깥쪽 루프에서 i 값과 개행 문자를 출력하여 세로 방향을 출력하게 된다.
  • 이처럼 중첩 루프는 2차원 평면을 다룰 수 있으므로 이미치 처리, 영상 처리, 좌표계 처리 등에 주로 쓰인다.

 

2. 사각형으로 별 출력하기

for i in range(5):          # 5번 반복. 바깥쪽 루프는 세로 방향
    for j in range(5):      # 5번 반복. 안쪽 루프는 가로 방향
        print('*', end='')  # 별 출력. end에 ''를 지정하여 줄바꿈을 하지 않음
    print()  # 가로 방향으로 별을 다 그린 뒤 다음 줄로 넘어감
             # (print는 출력 후 기본적으로 다음 줄로 넘어감)
             
# 실행결과
*****
*****
*****
*****
*****
  • 이 방식은 print에 end = ' ' 를 지정했을 때 줄바꿈이 되지 않고 오른쪽 방향으로 문자가 계속 붙는 특성을 이용한 것이다.
  • 바깥쪽의 반복문은 안쪽 반복문을 실행하면서 별을 다섯개씩 그리며 print()를 이용하여 줄바꿈을 한 뒤 다시 별 다섯개를 그리는 것을 총 다섯 번 반복한다.
  • for 반복문의 조건식을 수정하여 사각형의 모양을 바꿀 수 있다.
    for i in range(3):          # 3번 반복. 세로 방향
        for j in range(7):      # 7번 반복. 가로 방향
            print('*', end='')  # 별 출력. end에 ''를 지정하여 줄바꿈을 하지 않음
        print()   # 가로 방향으로 별을 다 그린 뒤 다음 줄로 넘어감
                  # (print는 출력 후 기본적으로 다음 줄로 넘어감)
                  
    # 실행결과
    *******
    *******
    *******​

 

3. 계단식으로 별 출력하기

  • 계단식으로 출력할 때는 별을 출력하지 않는 부분이 있기 때문에 if 조건문으로 print를 제어해야 한다.
    for i in range(5):      # 0부터 4까지 5번 반복. 세로 방향
        for j in range(5):  # 0부터 4까지 5번 반복. 가로 방향
            if j <= i:              # 세로 방향 변수 i만큼
                print('*', end='')  # 별 출력. end에 ''를 지정하여 줄바꿈을 하지 않음
        print()  # 가로 방향으로 별을 다 그린 뒤 다음 줄로 넘어감
                 # (print는 출력 후 기본적으로 다음 줄로 넘어감)​
  • 별의 개수는 세로 방향인 줄의 위치에 비례하므로 조건식도 세로 방향 변수 i 에 맞춰서 작성해야 한다.
    if j <= i:             # 세로 방향 변수 i만큼
    	print('*', end='') # 별 출력. end에 ''를 지정하여 줄바꿈을 하지 않음​
  • 이렇게 if 조건문을 작성하여 가로 방향(j)으로 별을 출력할 때는 세로 방향(i)의 변수만큼 출력하도록 해서 i 가 증가하면 i 만큼 별이 늘어나게 된다.
  • i 가 0일 때 j 는 0부터 4까지 반복하지만 j <= i 를 만족하는 경우는 j 가 0일 때 뿐이므로 별이 한 번만 출력된다.
  • 다시 i 가 1이 때는 j <= 1 를 만족하는 경우는 j 가 0, 1일 때이므로 별이 두 번 출력된다.

 

4. 대각선으로 별 출력하기

  • 출력 부분을 수정하면 별을 대각선으로 출력할 수 있다.
    for i in range(5):        # 0부터 4까지 5번 반복. 세로 방향
        for j in range(5):    # 0부터 4까지 5번 반복. 가로 방향
            if j == i:                # 세로 방향 변수와 같을 때
                print('*', end='')    # 별 출력. end에 ''를 지정하여 줄바꿈을 하지 않음
        print()    # 가로 방향으로 별을 다 그린 뒤 다음 줄로 넘어감
                   # (print는 출력 후 기본적으로 다음 줄로 넘어감)​
                   
    # 실행결과
    *
    *
    *
    *
    *
    - 하지만 출력 결과를 보면 그냥 세로로 출력된다 ㅠㅠ?
  • IDLE나 콘솔에서는 문자 출력을 하지 않으면 다음 문자가 현재 위치에 출력되므로 별을 출력하지 않는 부분에서는 print로 공백을 출력해줘야 한다.
    for i in range(5):      # 0부터 4까지 5번 반복. 세로 방향
        for j in range(5):  # 0부터 4까지 5번 반복. 가로 방향
            if j == i:              # 세로 방향 변수와 같을 때
                print('*', end='')  # 별 출력. end에 ''를 지정하여 줄바꿈을 하지 않음
            else:                   # 세로 방향 변수와 다를 때
                print(' ', end='')  # 공백 출력. end에 ''를 지정하여 줄바꿈을 하지 않음
        print()  # 가로 방향으로 별을 다 그린 뒤 다음 줄로 넘어감
                 # (print는 출력 후 기본적으로 다음 줄로 넘어감)
                 
    # 실행 결과
    *
     *
      *
       *
        *​
    - 가로 방향과 세로 방향의 변수 값이 같을 때 별을 출력하고, 같지 않을 때는 공백을 출력했다.

※ 바깥쪽 루프가 세로 방향, 안쪽 루프가 가로 방향을 처리한다는 점을 기억하기