본문 바로가기

알고리즘/백준

[백준] 1253번 : 좋다

728x90

1253번: 좋다

 

1253번: 좋다

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

www.acmicpc.net

🤔 문제분석

N이 2000보다 작거나 같기때문에 시간복잡도는 O(n^2)으로 생각 할 수 있고 정렬 + 투포인터로 문제를 해결 할 수 있다. 입력받은 배열을 정렬한뒤 배열을 오름차순으로 순회하면서 해당수가 좋은 수인지 아닌지 판단한다.

좋은 수 인지 아닌지 판단하는 방법을 투포인터를 활용하여 해결한다. left = 0, right = len(arr)- 1로 둔다. arr[left]와 arr[right]를 더하여 현재 값과 비교를하고, 만약 값이 더 크다면 right값을 감소시켜보고, 크다면 left값을 증가시켜가며 찾아간다. 만약 해당 값을 찾았을때, 자기자신이 아닌경우만 예외처리를 하여 좋은 수를 찾아낼 수 있다.

💻 코드

import sys
input = sys.stdin.readline

N = int(input())
arr = list(map(int, input().split()))
arr.sort()

def find(i):
    start = 0
    end = len(arr)-1
    while end > start:
        cost = arr[start] + arr[end]
        if cost == arr[i]:
            if start == i:
                start += 1
            elif end == i:
                end -= 1
            else:
                return True
        elif cost > arr[i]:
            end -= 1
        else:
            start += 1
            
    return False

ans = 0
for i in range(len(arr)):
    if find(i):
        ans += 1
                
print(ans)

🎯 피드백 및 개선사항

이번주 정렬문제를 풀면서 느낀건 정렬된 데이터를 응용하여 투포인터, 그리디 등등 여러 방식으로 해결해 보았습니다. 중요한건 정렬된 데이터를 분석해서 어떤식으로 응용하여 문제를 풀지 생각해보는것이 중요하다고 느꼈습니다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 8980번 : 택배  (1) 2024.02.10
[백준] 7453번 : 합이 0인 네 정수  (1) 2024.02.10
[백준] 2109번 : 순회강연  (1) 2024.02.05
[백준] 1377번 : 버블소트  (1) 2024.02.05
[백준] 17140번 : 이차원 배열과 연산  (1) 2024.02.04