[코테] 기초편 2-3 반복문

Bpius·2023년 4월 9일
0

알고리즘 입문

목록 보기
5/17
post-thumbnail

1. 거기 잠깐!

continue, break는 실행되고 있는 반복문을 '거기 잠깐!'하고 중지시키는 구문으로 작동된다. continue는 해당 구문을 만났을 때 '안돼! 돌아가!' 라고 이야기하고 다시 반복문으로 되돌린다. lsit=[1, 2, 3, 4, 5]가 있다고 가정해보면, 변수에 3이 할당되어 반복문을 진행하다 continue를 만나면 현재 진행되는 반복문의 순서를 중지시키고 변수에 4가 할당되어 다시 반복문이 시작된다. continue 아래의 실행문으로 내려가지 못하도록 막는 역할인 동시에 다시 반복문을 다음 순서로 되돌리는 역할을 지닌다. 하지만 break는 해당 구문을 만나면 '이럴거면 때려치워!'라고 이야기하고 반복문 자체를 중지시킨다. 변수에 3이 할당되어 break 구문을 만나면 변수에 4가 할당되어 실행되는 것이 아니라 반복문 자체를 중지하여 변수에 4가 담길 여력도 주지 않는 것이다.
두 구문은 알고리즘에서 많이 사용되는데 특히 들여쓰기(indent)에 주의를 기울여야 한다.

2. continue

continue는 '다시 반복문의 시작 시행지점으로 되돌리는 역할'이란 논리와 '아래의 구문을 실행하지 못하게 막는 역할'이란 논리는 어쩌면 같은 이야기 아니냐라고 할 수 있다. '되돌린다'는 역할에만 초점을 맞추게 되면 '지속된다'라는 의미와 맞물려서 '중지'를 해야하는 문제풀이 과정에서 continue를 잘 사용하지 못하게 되는 경우도 종종 있다. 문제풀이 과정 중에서 시작 시점으로 되돌리는 역할도 중요하지만, 특히 if 조건문이 여러개 나열되고 중간에 어떤 if문을 만났을 때 아래의 if문은 실행이 되어서는 안되는 경우가 더 빈번하게 사용된다.

예시문제
용배는 숫자 7을 좋아하고 4는 싫어한다. 그래서 좋아하는 숫자가 나온다면 기분이 3만큼 좋아지고 싫어하는 숫자가 나오면 기분이 1만큼 나빠진다. 숫자 n(1 < n <= 1,000)이 주어졌을 때 1부터 주어진 n까지 순차적으로 정수를 센다. 끝이 난 후 용배의 기분의 숫자를 출력하라. 단, 4와 7의 공배수가 나온다면 어쩔 줄 몰라하며 용배는 기분이 좋아지지도 나빠지지도 않는다.
지금 용배의 기분은 5만큼 좋다. n이 50이 주어졌을 때, 모든 정수를 순차적으로 센 후 용배의 기분은 몇인가?

n = 50
condition = 5
for i in range(1, n + 1):
    if i % 4 == 0 and i % 7 == 0:# 4와 7로 동시에 나눠 0이 되는 공배수는 28로, i에 28이 할당되면 밑의 if문은 실행되면 4부분에서 -1 7부분에서 +3이 되어 기분이 +2만큼 좋아지게 됨으로 아래의 if문이 실행되어선 안된다.
        continue# 28에서 멈추면 안 되고 30까지 숫자를 끄집어 내야해서 다시 반복문으로 되돌려야 한다.
    if i % 4 == 0:
        condition -= 1
    if i % 7 == 0:
        condition += 3
print(condition)
입력: 50
출력: 12

3. break

알고리즘 문제풀이에서 continue와 비교해서 쓰이는 빈도수는 통계적으로 살펴보진 못했지만, 경험에 의하면 10:1 정도라고 할 수 있을만큼 break문의 활용이 훨씬 잦다. 특히 중첩 반복문에서 안쪽 반복문을 멈추고 다시 제일 밖의 반복문으로 돌아가야 하거나, while문의 무한 루프를 정지시키거나 재귀의 무한 루프를 중지시키는 등 break의 역할은 막중하다.

예시문제
용배는 숫자 7을 좋아하고 4는 싫어한다. 그래서 좋아하는 숫자가 나온다면 기분이 3만큼 좋아지고 싫어하는 숫자가 나오면 기분이 1만큼 나빠진다. 숫자 n(1 < n <= 1,000)이 주어졌을 때 1부터 주어진 n까지 순차적으로 정수를 센다. 끝이 난 후 용배의 기분의 숫자를 출력하라. 단, 4와 7의 공배수가 나온다면 어쩔 줄 몰라하며 용배는 숫자를 세는 것을 중단한다.
지금 용배의 기분은 5만큼 좋다. n이 50이 주어졌을 때, 모든 정수를 순차적으로 센 후 용배의 기분은 몇인가?

n = 50
condition = 5
for i in range(1, n + 1):
    if i % 4 == 0 and i % 7 == 0:
        break
    if i % 4 == 0:
        condition -= 1
    if i % 7 == 0:
        condition += 3
print(condition)
입력: 50
출력: 8

4. 들여쓰기

continue의 경우도 마찬가지겠지만 중첩 반복문 중에서 어느 반복문을 중지시킬 것인지 생각해서 들여쓰기에도 신경을 써야한다. 알고리즘 문제풀이에서는 플로이드 워셜은 기본적으로 3중 for문이고 보드게임 문제풀이 중에서 스도쿠(9 * 9) 형태의 문제에는 4중 for문이 필요하다. 그래서 반복문의 형태도 for문 안에 while을 다시 쓴다든지 while문 안에 다시 중첩 반복문을 쓴다든지의 경우는 매우 다양하다. 이런 문제들 속에서 반복문의 중단이 필요할 때 2, 3중 반복문 중 어느 반복문을 중지 시켜야 하는지 잘 살피는 것이 중요하다.

for i in range(n):
    for j in range(m):
        if a == b:
            while True:
                for k in range(start, end + 1):
                    if b == c:
                        break # <-- 어느 반복문을 중지시킬까?                        

break, continue는 쓰이고 있는 구문 '바로 위'의 반복문으로 돌아가거나 중지시킨다. continue라면 'for k in range(start, end + 1)'로 돌아간다. break라면 'for k in range(start, end + 1)'문을 빠져나온다. 그리고 'while True'에서 다시 반복문이 시작된다.

문제

#아무런 근거 논리없이 형식만 가져왔다. 순차적으로 진행이 된다면, continue와 break가 어디로 다시 돌아가고 어느 구문을 중지시킨 후 다음 실행문을 진행시킬 지 생각해보자.
for i in range(n):
    for j in range(m):
        if a == b:
            while True:
                for k in range(start, end + 1):
                    if b == c:
                        break# <-- 1. 어느 반복문을 중지키는가? 그리고 다음 실행문은 어디인가?
                for x, y in board:
                    count = x + y
                    if b != c:
                        continue# <-- 2. 어느 반복문으로 돌아가는가?
                        if count == 10:
                            z = 1
                        else:
                            z = 2
                    else:
                        break# <-- 3. 어느 반복문을 중지키는가? 그리고 다음 실행문은 어디인가?

풀이

  1. 'for k in range(start, end + 1)'이 구문을 중지시키고 빠져나온 후 다음 실행구문인 다음 for문인 'for x, y in board'이 시작된다.
  2. 아래의 실행문으로 내려가지 않고 다시 for x, y in board실행문으로 돌아간다.
  3. break가 바로 위로 속해있는 'for x, y in board'을 실행을 중지시킨다. 그리고 while문으로 참이라면 while문이 실행된다. break가 for문을 중지시키고 while을 작동시키는 것이 '아니다'. 순서가 while문이 작동될 순서라는 것이다.
  4. continue와 break는 일단 실행문을 잡아둔 뒤, 되돌리거나 종료 시킨 후 자신의 역할은 끝난다. 다음은 코드의 순서에 따라 다시 실행될 뿐이다.
  5. continue 아래 실행문if count == 10는 절대 실행될 수 없다.
  6. 위의 코드는 while 반복문을 중단시켜줄 실행문이 없어 무한루프에 빠지게 된다.
profile
데이터 굽는 타자기

0개의 댓글