[Python] for-else와 while-else

정은·2023년 10월 14일

PYTHON

목록 보기
6/6
post-thumbnail

어느날 백준문제를 풀다가 풀이 과정에서 for-else문을 사용하는 사람을 사람을 보았다.
오타인 줄 알았으나 엥? 실제로 있는 문법이잖아❗라고 깨달은 뒤 유용하다고 생각하여 이렇게 정리해보고자 한다.

조건문만 else를 사용할 수 있는 것은 아니다.
파이썬에서는 반복문에서도 else를 사용할 수 있다.

매우 유용하다 .... Python is best...♥️

For-Else

다음 for 문에서는 리스트의 원소를 차례대로 출력하고 나서, 모두 출력했다는 메시지를 출력한다.

>>> for x in [1, 2, 3, 4]:
...     print(x)
... else:
...     print("리스트의 원소를 모두 출력했어요")
... 
1
2
3
4
리스트의 원소를 모두 출력했어요
  • 위의 코드를 보면 그냥 밖에 else 블럭의 내용을 쓰면 되는 것 아닌가?라고 생각하게 되지만, break와 같은 제어문을 같이 써주게 되면 다른 의미로 사용된다.
>>> for x in [1, 2, 3, 4]:
...     if x % 3:
...         print(x)  # x가 3의 배수가 아니면 출력
...     else:
...         break  # x가 3의 배수이면 반복문에서 빠져나감
... else:
...     print("리스트의 원소를 모두 출력했어요")
... 
1
2

여기서는 반복문을 break했는데, else 블록이 실행되지 않는다.

즉, for문과 같이 사용되는 else문은 for문이 break 등으로 중간에 빠져나오지 않고 끝까지 실행 되었을 경우 else문이 실행되는 방식이다.

For-Else 응용

그럼, 백준 14503번 로봇청소기 코드를 보자.

dx, dy = [-1, 0, 1, 0], [0, 1, 0, -1]

def solve(ci, cj, dr):
    cnt = 0 # 청소한 공간 수
    while True: # 청소기가 움직이지 못할 때까지 반복
        # [1] 현재 위치 청소
        arr[ci][cj] = 2
        cnt += 1

        # [2] 왼쪽 방향 부터 4방향 탐색
        flag = True
        while flag:
            # 왼쪽부터 네 방향 중 미청소 영역이 있는 경우 (현재 위치 + 3) % 4 => 무조건 왼 쪽으로 가야됌
            for nd in ((dr + 3) % 4, (dr + 2) % 4, (dr + 1) % 4, dr):
                ni, nj = ci + dx[nd], cj + dy[nd]
                if arr[ni][nj] == 0: # 미청소 영역
                    ci, cj, dr = ni, nj, nd
                    flag = False
                    break

            else:
                # 4방향 모두 미청소 영역 없음 => 후진
                bi, bj = ci - dx[dr], cj - dy[dr]  # 후진할 위치
                if arr[bi][bj] == 1:  # 벽
                    return cnt
                else:
                    ci, cj = bi, bj  # 후진

N, M = map(int, input().split())
r, c, d = map(int, input().split()) # 0 :북, 1: 동, 2: 남, 3: 서
arr = [list(map(int, input().split())) for _ in range(N)]

print(solve(r, c, d))
  • 위 코드를 보면 4개의 방향의 미청소 영역이 있을 경우 break를 하기 때문에, 아래의 else 구문이 실행되지 않는다.
  • 만약, 미청소 영역을 찾지 못했다면 else 구문이 진행된다.

While-Else

while문도 마찬가지이다.
while문이 break될 경우에는 else 블록이 실행되지 않는다.

>>> countdown = 5
>>> while countdown > 0:
...     print(countdown)
...     countdown -= 1
...     if input() == '중단':
...         break
... else:
...     print('발사!')
... 
5
4
3
중단

[References]
https://wikidocs.net/190098

profile
정니의 이런거 저런거 기록 일지 😛

0개의 댓글