티스토리 뷰

알고리즘

[Python] 백준 1253 좋다

실전압축코딩 2023. 7. 10. 15:25

https://www.acmicpc.net/problem/1253

 

1253번: 좋다

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

www.acmicpc.net

 

투 포인터 문제이다.

해당 문제의 핵심은

 

1. 수의 범위는 정수다. 즉, 음의 정수와 0이 포함된다.

2. for loop을 통해 검사하고자 하는 배열에 현재 index가 포함되면 안된다.

 

위의 두가지 핵심을 놓쳐 조금 헤맸다...

일단 문제 풀이는 

 

1. 수를 정렬한다.

2. 정렬된 배열의 for loop을 돌면서 투 포인터 알고리즘으로 수의 합을 계산한다. 

3. left index는 항상 0번으로, right Index는 배열의 마지막 인덱스로 정한다. (핵심 1)

4. 수의 합이 작을 경우 left를 올려줘 값을 키우고, 클 경우 right을 내려줘 값을 내려 준다.

5. 배열에 현재 index를 빼준다. 현재 index를 제외한 새 배열을 만들거나, if 조건문을 사용하자.(핵심 2)

 

import sys
input = sys.stdin.readline

n = int(input())
a = [0 for _ in range(n)]

a = [int(value) for value in input().split()]
a.sort()

answer = 0
for i in range(0, len(a)):
    leftIndex = 0
    rightIndex = len(a) -1
    while leftIndex < rightIndex:  
        if leftIndex == i:
            leftIndex +=1
            continue
        elif rightIndex == i:
            rightIndex -=1
            continue   
            
        result = a[leftIndex] + a[rightIndex] 
        if result == a[i]:
            answer +=1
            break
        elif result < a[i]:
            leftIndex +=1
        elif result > a[i]:
            rightIndex -=1
               
    
print(answer)

 

'알고리즘' 카테고리의 다른 글

[python] 백준 욕심쟁이 판다  (1) 2023.10.21
[백준 1162] python 도로포장  (0) 2023.07.23
python 비트 마스킹  (0) 2023.06.19
[백준] 5214 환승 -JAVA  (0) 2022.03.07
[백준] 5719 거의 최단 경로 - JAVA  (0) 2022.03.03