Uknow's Lab.
article thumbnail

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

 

1253번: 좋다

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

www.acmicpc.net

 

난이도 : 골드 4
태그 : 자료구조, 해시를 통한 집합과 맵, 두 포인터, 이분 탐색

 

 

1. 설명

N개의 수 중 어떤 수가 다른 두 수의 합일때, 그 수를 좋다고 합니다.

좋은 수의 개수를 찾는 문제입니다.

 

이 분제는 두 포인터 혹은 이분 탐색으로 풀 수 있을 것 같은데,

저는 두 포인터를 사용해 풀이하도록 하겠습니다.

 

left, right 두 개의 포인터를 선언하고,

left + right의 값이 타 값보다 작으면 left를 +1,

left + right의 값이 타겟 값보다 크면 right를 -1

left + right의 값이 타겟 값과 같으면 결과 cnt를 +1 합니다.

주의하실 점은, 다른 두 수의 합으로 표현이라 했으니, left, right에 타겟값이 포함되어 있으면 안됩니다.

 

 

2. 소스코드

<kotlin />
import java.util.StringTokenizer fun main() = with(System.`in`.bufferedReader()) { val n = readLine().toInt() val st = StringTokenizer(readLine()) val arr = Array(n) { 0L } repeat(n) { arr[it] = st.nextToken().toLong() } arr.sort() var cnt = 0 repeat(n) { ptr -> var left = 0 var right = n - 1 while (left < right) { val sum = arr[left] + arr[right] if (sum == arr[ptr]) { // 투 포인터가 자기 자신을 포함하면 안됨 if (left == ptr || right == ptr) { if (left == ptr) left++ if (right == ptr) right-- } else { cnt++ break } } else if (sum < arr[ptr]) { left++ } else { right-- } } } println(cnt) }

 

 

3. 후기

모닝 커피를 마시면서 하루를 시작하듯이,

모닝 코테로 하루를 시작해보는 건 어떨까요.

해보는 중인데 실력 향상엔 이로우나, 정신 건강엔 해로운 것 같습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.