본문 바로가기

CodingTEST

[백준 1940] 주몽 (JAVA)

반응형

백준 1940번 문제  -  주몽

 

1940번: 주몽

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고

www.acmicpc.net


 

문제 분석

 

  • N과 M, 그리고 N개의 수를 입력 
  • N개의 수 중 두 개의 수를 합해 M이 되는 수의 개수 출력

 


해결 키 포인트
  • 배열 정렬 - Arrays.sort() 함수 이용
  • 투 포인트 사용

생각하지 못한 문제

 

코드를 보기 쉽게 하기 위해 num[start]+num[end] 을 sum이라는 변수로 두었다.

Long sum = num[start]+num[end];

 

하지만 이게 문제가 되었다. 

→ 정확한 이유는 모르겠지만, 아마 더한 수가 Long에 담기에는 큰 수 인 것 같다.

 

그래서 이를 sum이라는 변수로 저장하지 않고,  num[start]+num[end]을 그대로 사용하였더니 문제가 해결되었다.


코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	public static void main(String [] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken()); // 재료의 개수
		Long num[] = new Long[N];
		
		st = new StringTokenizer(br.readLine());
		Long M = Long.parseLong(st.nextToken()); // 재료 두 개의 합 값
		
		st = new StringTokenizer(br.readLine());
		// 재료 입력
		for(int i=0;i<N;i++) {
			num[i] = Long.parseLong(st.nextToken());
		}
		
		int start = 0, end = N-1, count = 0;
		
		// num 정렬시키기
		Arrays.sort(num);
		
		// 정렬된 num배열을 start는 앞부터 end는 뒤부터 검사하면서 M을 충족시키는 두 수를 찾는다
		// while 문 (start가 end보다 커질 때까지)
		while(start < end) {
			if(num[start]+num[end] == M)	{// M과 동일하면 count 증가
				count++;
				start++;
				end--;
			}
			else if(num[start]+num[end] > M) // sum이 더 크면 end를 줄여 합을 작게 함
				end--;
			else
				start++; // M보다 합이 작은거니 start를 늘려 합이 커지게함	
		}
		System.out.println(count);
	}
}

 

반응형

'CodingTEST' 카테고리의 다른 글

[백준 17298번] 오큰 수 (JAVA)  (0) 2023.03.12
[백준 1874번] 스택 수열 (JAVA)  (1) 2023.03.08
[백준 11003번] 최솟값 찾기 (JAVA)  (0) 2023.03.06
[백준 12891] DNA 비밀번호 (JAVA)  (0) 2023.03.04
[백준 1253] 좋다 (JAVA)  (0) 2023.03.04