해결된 질문
작성
·
253
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이 어떻게 쓰인 것인지 조금 자세히 설명해주실 수 있으실까요
답변 1
0
일단 처음에는 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
문에서 반복문을 종료하도록 위와 같이 변경하시면 됩니다.
혹시 보고 나서도 이해가 어려우시다면 답글 남겨주세요! ( 반례도 만들어드리겠습니다! )