문득 알고리즘 문제를 풀다가
해당 코드가 실행돼서 찾아봤다.
answer = 0
for w in words:
for c in w:
if w.count(c) > chars.count(c):
break
else: answer += len(w)
return answer
for문 2개로 구성되어 있는 이중 for 문이다.
안쪽 for 문에서 break를 만난다면 안쪽 for문을 다 순회하지 않고 else 문 지점으로 오게 될텐데, else 문이 딸랑 나와도 되는지 의문이었다.
평소에는 저렇게 코드를 작성하지 않고 flag 변수를 따로 설정해서 아래와 같이 코드를 짜주곤 했다.
answer = 0
for w in words:
flag = True
for c in w:
if w.count(c) > chars.count(c):
break
flag = False
if !flag:
answer += len(w)
return answer
하지만, 맨 위 코드에서 'else'문을 저렇게 사용하는 것이 맞는 문법이다.
'for' 루프는 'else'블록을 가질 수 있는데, 이 'else' 블록은 'for'루프가 중간에 'break' 문으로 인해 중단되지 않고 모든 반복을 완료했을 때 실행된다.
여기서 'else' 블록은 내부 'for' 루프에 연결되어 있다. 만약 if w.count(c) > chars.count(c) 조건이 참이 되어 break가 실행되면, else 블록은 실행되지 않는다는 말이다. 반면, if 조건이 거짓이면 for 루프는 break 없이 계속 실행되고, 루프가 모든 반복을 마치면 else 블록이 실행된다. 이는 while 문에서도 마찬가지다.
정말 유용한 문법이다. 비단, 이렇게 단순 for 문이 아니라, index를 끝까지 갔을 때, 즉 따로 index가 끝 지점일 때를 나타내고 싶을 때가 있었다. 이 때, 분기쳐주는 것을 단순히 else 만 해주면 된다!
반응형
'컴퓨터 공부 > 🐍 Python' 카테고리의 다른 글
What is "self" in Python? (2) | 2024.01.08 |
---|---|
Remove Non-alphanumeric Characters in Python (0) | 2023.12.13 |
list(map(int, input().strip().split())) 와 [map(int, input().strip().split())] 의 차이 (2) | 2023.11.21 |
[PYTHON] TYPEERROR: ‘UNICODE’ OBJECT DOES NOT SUPPORT ITEM ASSIGNMENT (0) | 2023.11.14 |
n진법으로 표기된 string을 10진법 숫자로 변환하기 - int 함수 (0) | 2023.02.23 |