https://www.acmicpc.net/problem/1253
백준 1253번: 좋다
풀었던 방법
→ 두 숫자를 더해서 하나의 숫자를 찾는거니까 투포인터를 썼습니다.
숫자를 크기 순서대로 정렬하고
3번째 숫자부터 마지막 숫자까지 하나씩 확인을 합니다
- 포인터를 배열의 가장 처음에 하나, 마지막에 하나를 두고 각 합이 확인중인 숫자랑 같은지를 확인합니다
- 확인중인 숫자 > 합이라면 처음 포인터를 뒤로 밀고,
- 확인중인 숫자 < 합이라면 마지막 포인터를 앞으로 땡기면서 찾았습니다.
생겼던 문제
- 처음에는 숫자들이 모두 자연수인줄알고 투포인터를 이용해서 찾을때 탐색하는 범위를 탐색중인 숫자의 앞 배열만을 사용했습니다.
1, 2, 3, 4, 5, 6, 7
예를 들어, 이 방법일 때 5를 확인중이라면
p1 = 1로 두고, p2 = 4로 둬서 확인을 했습니다.
하지만 배열이 모두 자연수가 아니므로 음수의 경우도 고려해야했습니다.
-2, 0, 2, 4
이런 경우에는 2를 탐색할때 앞에 있는 배열만 사용한다면
p1 = -2, p2 = 0이 되므로 찾을 수가 없는 문제가 발생했습니다..
→ 그래서 초기 포인터 설정을 매번 전체 배열의 처음, 끝으로 둬서 개선했습니다.
제출 코드
# 백준 1253 좋다
# 투포인터
N = int(input())
nums = list(map(int, input().split()))
nums.sort()
result = 0
for i in range(N):
target = nums[i]
left, right = 0, N - 1
while left < right:
# 지금 확인중인 숫자는 넘어가게
if left == i:
left += 1
continue
if right == i:
right -= 1
continue
sum_of_left_right = nums[left] + nums[right]
if sum_of_left_right == target:
result += 1
break
elif sum_of_left_right < target:
left += 1
else:
right -= 1
print(result)
'알고리즘 > 문제풀이' 카테고리의 다른 글
[백준] 어드벤처 게임 (0) | 2025.03.24 |
---|---|
[백준] 14658번 하늘에서 별똥별이 빗발친다 (0) | 2024.02.20 |
[백준] 4485번, 녹색 옷 입은 애가 젤다지? (0) | 2023.10.13 |
[백준] 1326번, 폴짝폴짝 (0) | 2023.10.06 |
[SWEA] 창용 마을 무리의 개수 (0) | 2023.09.23 |