처음부터 차근차근

좋은 수 구하기 본문

알고리즘

좋은 수 구하기

_soyoung 2022. 10. 9. 23:10
반응형

문제(제한 시간 : 2초)

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

 

1253번: 좋다

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

www.acmicpc.net

문제를 해석해보자면

여기서 말하는 좋은 수란 두 번째 줄에 주어진 수 중 5로 예를 들어보자.

5는 두 번째 줄에 있는 수 중에 2 + 3이라는 조합으로 만들 수 있는 수이다.

그래서 5를 좋은 수라고 한다.

두 번째 줄에 있는 수 중 좋은 수의 개수를 구하는 것이 이 문제의 목표이다.

 

문제 풀이

이 문제는 투포인터 알고리즘을 사용해야한다.

투포인터 알고리즘을 사용해서 양 쪽 끝에서부터 가운데로 오면서 만나는 숫자를 합하여 좋은 수인지 판별한다.

여기서 주의해야할 점이 좋은 수를 찾는 계산을 할 때 자기 자신이 포함되지 않아야 한다는 점이다.

문제에 

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

라고 쓰여져 있는 걸 보면 두 번 째 줄에 들어가는 수들이 0이어도 된다는 소리이다.

즉, 계산할 때 자기 자신을 포함하는 경우가 생긴다는 것인데 그래서 이 경우를 제외시켜줘야한다.

그래서 if 문을 통해 좋은 수를 골라도 자기 자신이 합으로 들어간 조합이 아닌지 다시 한 번 더 확인해야한다.

 

내 풀이

import java.io.*;
import java.util.*;

public class Main
{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int num = Integer.parseInt(br.readLine());
		int[] arr = new int[num];
		int result = 0;
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < num; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(arr); // 배열 오름차순 정렬

		for (int i = 0; i < num; i++) {
		    int find = arr[i];
		    int start_index = 0;
		    int end_index = num - 1;
		    
		    while (start_index < end_index) {
		        if (find < arr[start_index] + arr[end_index]) {    
		            end_index--;
		        }
		        else if (find == arr[start_index] + arr[end_index]) {
		            if (i != start_index && i != end_index) { // 자기자신을 포함하지 않은 경우
		                result++;
		                break;
		            }
		            else if (i == start_index) { // 자기자신을 포함한 경우
		                start_index++;
		            }
		            else if (i == end_index) { // 자기자신을 포함한 경우
		                end_index--;
		            }
		        }
		        else if (find > arr[start_index] + arr[end_index]) { 
		            start_index++;
		        }
		    }
		}
		
		bw.write(String.valueOf(result));
	    bw.flush();
	    br.close();
	    bw.close();
	}
}


참고 : do it 알고리즘 코딩테스트 자바편

반응형

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

그리디 알고리즘  (0) 2022.10.13
DFS, BFS 알고리즘  (0) 2022.10.10
구간 합 구하기  (0) 2022.10.07
평균 구하기  (0) 2022.09.27
평균 넘는 사람 비율 구하기  (0) 2022.09.24
Comments