어느날 백준문제를 풀다가 풀이 과정에서 for-else문을 사용하는 사람을 사람을 보았다.
오타인 줄 알았으나 엥? 실제로 있는 문법이잖아❗라고 깨달은 뒤 유용하다고 생각하여 이렇게 정리해보고자 한다.
조건문만 else를 사용할 수 있는 것은 아니다.
파이썬에서는 반복문에서도 else를 사용할 수 있다.
매우 유용하다 .... Python is best...♥️
다음 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문이 실행되는 방식이다.
그럼, 백준 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))
break를 하기 때문에, 아래의 else 구문이 실행되지 않는다.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