inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

투포인터 22988번 문제에서 continue와 break이 들어가는 이유

해결된 질문

336

녜힁

작성한 질문수 6

1

N, X = map(int,input().split())

arr = sorted(list(map(int,input().split())))


s = 0

e = N-1

remain = 0
cnt = 0
while s <= e : # s와 e가 교차되면 멈춘다!

    if arr[e] == X:
        cnt += 1
        e -= 1
        continue

    if s == e :
        remain += 1 
        break
        # 짜투리를 하나 추가한다!

    if arr[e] + arr[s] >= X/2:
        cnt +=1
        s += 1
        e -= 1

    else:
        s += 1 # 수가 커지겠죠!
        remain += 1


print(cnt + remain//3 )

여기에서 while문 안에 첫 번째 if 다음에 continue가 들어가는 이유와

두 번째 if 문에서 break을 사용하는 이유를 모르겠습니다.
두 개 다 없어도 가능하다고 생각하는데 테스트 케이스의 경우 continue는 없어도 예제 출력을 출력했고,

break은 없으면 예제출력과 결과가 다르네요!!
continue와 break이 어떻게 쓰인 것인지 조금 자세히 설명해주실 수 있으실까요

python 코딩-테스트 알고리즘

답변 1

0

코딩 센세

image

일단 처음에는 3번 조건문만 존재한다고 생각하겠습니다.

 

그렇다면 해당 코드는 s포인터가 점점 커지면서 e포인터와 비교하면서 cnt를 추가하거나 remain을 추가할 겁니다.

 

반례 1 : s와 e포인터가 만났을 때

하지만, 3번 조건문만 존재한다면 s포인터와 e포인터가 만났을 때의 확인이 불가능해서 2번 조건문을 추가해줬습니다.

 

break문을 사용한 이유는 2번 조건문이 끝난 뒤에 다시 3번 조건문을 계산하지 않도록 막고, 반복문을 종료 시키기 위해서 입니다.

[ 여기에서 포인터를 옮겨주는 코드를 같이 적어주면, break가 아닌 continue를 사용해도 괜찮습니다! ]

 

2번 조건문을 계산하고 3번 조건문도 계산해버리면 하나의 병으로 2번 계산하기 때문에 잘못된 정답이 나오기 때문입니다.

 

반례 2: 이미 가득찬 병이 있을 때

여기에 추가로, 1번 조건문을 넣어서 병이 가득 차 있는 상태라면 e포인터만 옮겨주는 코드를 추가했습니다.

 

continue문을 사용한 이유는 1번 조건문이 끝난 뒤에, 2번 조건문3번 조건문을 계산하지 않도록 막고, 계속해서 반복문을 진행 시키기 위해서 입니다.

 

가득찬 병을 이용해서 cnt+1을 해줬는데도, 또 3번 조건문이나 2번 조건문에서 중복해서 계산을 하면 잘못된 정답이 나오기 때문에, 1번 조건문 에 걸린 병은 재사용하지 못하도록 막아야 합니다.

 


N, X = map(int,input().split())

arr = sorted(list(map(int,input().split())))


s = 0

e = N-1

remain = 0
cnt = 0
while s <= e : # s와 e가 교차되면 멈춘다!

    if arr[e] == X:
        cnt += 1
        e -= 1
        continue

    if s == e :
        remain += 1 
        s += 1
        e -= 1
        continue
        # 짜투리를 하나 추가한다!

    if arr[e] + arr[s] >= X/2:
        cnt +=1
        s += 1
        e -= 1

    else:
        s += 1 # 수가 커지겠죠!
        remain += 1


print(cnt + remain//3 )

만약 break를 쓰기 싫다면, while문에서 반복문을 종료하도록 위와 같이 변경하시면 됩니다.

 

혹시 보고 나서도 이해가 어려우시다면 답글 남겨주세요! ( 반례도 만들어드리겠습니다! )

dp[x]가 최대값이라고 확신할수 있는 이유

0

44

1

1090번 문제 질문

0

150

1

유니온파인드

0

112

1

투포인터 25:15 질문

1

128

1

#1090번 문제 반례가 궁금합니다.

0

148

1

예제코드 자바입니다

1

186

1

정수론 파트 #2247 문제에 대한 질문입니다!

0

102

0

코드 오류

0

185

1

2강 정수론 문제3 #1407 질문

0

126

0

이차원 배열 (int형)dp로 0 혹은 -1로 체크하는 방법 말고 boolean형 배열로 체크해서 바로 리턴해줄 수 없나요?

0

154

0

1717번 최적화

0

112

0

백준 22988 문제 질문

1

193

2

[Python] 백준 1090번 문제

1

226

3

강의자료에서

1

162

2

2503 문제 제한 조건 질문!

1

249

2

백준 22988 번 문제

1

193

1

추가 강의 순서

1

180

2

(*문제 풀이)1090 테스트케이스 1번 C++

1

221

2

7강 RGB 색칠하기 질문 있습니다.

1

160

2

정수론 약수 빠르게 구하기 질문

1

257

1

1090 문제의 2, 3번째 아이디어는 결국 같은거 아닌가요?

1

373

2

1090 문제 관련하여 맨해튼 거리 최솟값에 대해 질문 있습니다.

1

223

2

누적합 문제 3번 질문

1

216

2

기억 ( 누적합 ) 강의 11660 문제

1

163

2