Notice
Recent Posts
Recent Comments
Link
복's
[ 백준 - 1253 ] 좋다 (Python) 본문
728x90
https://www.acmicpc.net/problem/1253
1253번: 좋다
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
www.acmicpc.net
문제를 보고 고민하다가 결국 다 범위를 좁혀가면서 확인을 해봐야 할 것 같다는 생각이 들었다.
투 포인터 방식으로 문제를 풀어 봤는데, 계속해서 반례에 걸려서 반례들을 찾느라고 시간을 썼다.
[ 📌 고려사항 ]
- 음수가 있을 수 있음 |A| <= 1,000,000,000 이기 때문에 음수도 포함한다.
- 동일한 수가 있을 수 있음 ex) 0 0 0 0
- 0 + 0 = 0 이다.
- 본인(0) + 0 = 0
- 본인(0) + 0 = 본인(0)
- 위 이유로 본인(선택한 리스트의 요소)는 제외 시켜줘야 한다.
[ 📌 코드 흐름 ]
1. 현재 선택한 요소를제외한 리스트를 만든다.
⚙︎ 본인을 제외한 리스트에서 선택한 두 요소의 합이 '좋다'를 만족하는 수인지 찾을 수 있게 해주는 작업
temp = num_list[:num] + num_list[num + 1:]
2. 투 포인터 알고리즘 수행
2 - 1. '좋다'의 수를 찾는다면 종료한다.
2 - 2. 합이 현재 선택한 요소보다 작다면 합의 크기를 키우기 위해서 left를 + 1
2 - 3. 합이 현재 선택한 요소보다 크다면 합의 크기를 줄이기 위해서 right를 - 1
[ 📌 코드 - Python ]
지금 보니까 num -> index로 바꿔야 코드를 읽는데 더 편할 것 같은데 변수 이름을 잘못 준 것 같다.
import sys
input = sys.stdin.readline
N = int(input())
num_list = list(map(int, input().strip().split()))
ans = 0
num_list.sort()
for num in range(N):
temp = num_list[:num] + num_list[num + 1:]
left, right = 0, len(temp) - 1
while left < right:
lr_sum = temp[left] + temp[right]
if lr_sum == num_list[num]:
ans += 1
break
elif lr_sum < num_list[num]:
left += 1
else:
right -= 1
print(ans)
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[ 백준 - 2559 ] 수열 (0) | 2023.11.03 |
---|---|
[ 백준 - 12891 ] DNA 비밀번호 (2) | 2023.10.29 |
[ 백준 - 1005 ] ACM Craft (Python) (0) | 2023.09.23 |
[ 백준 - 2293 ] 동전 1 (Python) (1) | 2023.09.16 |
[ 백준 - 2018 ] 수들의 합5 (Python) (1) | 2023.09.15 |