거북이의 기술블로그 2024. 10. 22. 11:41
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();


    }
}