1. 문제
2. 문제 분석
3. 슈도코드 작성
4. 코드 작성
참고)
CPU 연산은 1초에 1억번 (시간복잡도 계산하며 풀기)
문제
주몽의 명령 갑옷만들기
- 갑옷을 만드는데 필요한 재료 2가지
- 재료의 합 M ( 1 <= M <= 10,000,000 )
- 재료의 개수 N ( 1 <= N <= 15,000)
문제 분석
- 투포인터 사용 (start point , end point)
투포인터 이동 원칙
- A[i] + A[j] > M : j--; #번호의 합이 M보다 크면 끝 번호 인덱스(j)를 한칸 아래로 이동
- A[i] + A[j] < M : i++; #번호의 합이 M보다 작으면 시작 번호 인덱스(i)를 한칸 위로 이동
- A[i] + A[j] == M : i++, j--; #양쪽 포인터를 모두 이동시키고 count를 증가
- 두가지 포인터를 이용하여, 값을 계산하며 추정
- 정렬 필요 : 투포인터를 사용하기 위해서는 정렬을 해야함 (2초내 연산이므로 사용해도 괜찮다)
중요) 정렬의 시간복잡도 : O(NlogN)
ex) 재료의 개수 : 15,000
15000 * (3 + log15)
슈도코드 작성
N(재료의 개수) , M(갑옷이 되는 번호) 저장하기
for (N만큼 반복)
{
재료 배열 저장하기
}
재료 배열 정렬하기
while( i <j )
{
if (재료 합 < M) 시작 포인터 위치를 한칸 위로 이동
else if (재료 합 > M) 끝 포인터 위치를 한칸 아래로 이동
else 카운트값 증가, 양쪽 포인터 각각 이동
}
count 출력하기
코드 작성
- 입력값 (bufferedReader)
- 공백 파싱 (StringTokenizer)
- 타입 변환 (parse[타입])
- 배열 정렬(java.util.Arrays)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Arrays;
public class App {
public static void main(String[] args) throws Exception {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(buf.readLine());
int M = Integer.parseInt(buf.readLine());
int[] array = new int[N];
StringTokenizer st = new StringTokenizer(buf.readLine());
for (int i = 0; i < N; i++){
array[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(array);
int count = 0;
int i = 0;
int j = N-1;
while( i < j){
if (array[i] + array[j] < M){
i++;
}
else if (array[i] + array[j] > M){
j--;
}
else{
count++;
i++;
j--;
}
}
System.out.printf("count = %d", count);
buf.close();
}
}