반응형
백준 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 |