본문 바로가기
Algorithm/Baekjoon For.Java

3273 : 두 수의 합

by Jinny zinny 2023. 3. 6.

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

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net

이번에 개인적인 알고리즘 공부를 하면서 두수의 합을 구할 때 공간 복잡도를 포기하고 시간복잡도를 끌어올리는 방식으로 O(N)까지 끌어올릴 수 있는 방식을 배웠다

 

 

<코드 설명>

해당 알고리즘은 두 수의 합에서 지나간 배열의 원소를 기록해놓는 방식이다

우리가 일반적으로 생각하는 방식은 O(n^2)의 방식이다.

이중 for문을 사용하여 하나하나 원하는 값을 대조해보는 것이다

물론 N^2의 알고리즘은 효율적이지 않다

(사실 N^2으로 풀고 싶었지만..... 코딩테스트 준비해야지??)

그게 다이긴 하지만, 합이 음수가 될 경우, 지나간 수를 기록하는 순서를 count연산 앞에 해서 자꾸 틀렸다

 

import java.util.*;
import java.io.*;
public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		
		int n=Integer.parseInt(br.readLine());
		
		String input=br.readLine();
		String[] split= input.split(" ");
		
		int x=Integer.parseInt(br.readLine());
		//입력 끝
		boolean[] exist=new boolean[2000001];
		
		int count=0;
		//짝홀 나눠라
		
		for(int i=0;i<split.length;i++)
		{
			int num=Integer.parseInt(split[i]);
			
			if(x-num>0)
			{
				if(exist[x-num]==true)
					count++;
			}
					
			exist[num]=true;
		}
		System.out.println(count);
		
	}
}

 

반응형

'Algorithm > Baekjoon For.Java' 카테고리의 다른 글

15312 : 이름 궁합  (0) 2023.03.06
15829 : Hashing  (0) 2023.03.06
2941 : 크로아티아 알파벳  (0) 2023.03.05
1181 : 단어 정렬  (0) 2023.03.05
1003 : 피보나치  (0) 2023.03.05