ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [투포인터] 백준 1940번
    책/DoIt 알고리즘 코딩테스트 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();
    
    
        }
    }

     

    ' > DoIt 알고리즘 코딩테스트' 카테고리의 다른 글

    [스택] 백준 17298  (0) 2024.10.30
    [스택] 백준 1874번  (0) 2024.10.29
    [슬라이딩 윈도우 + deque] 백준 11003번  (0) 2024.10.27
    [슬라이딩윈도우] 백준 12891번  (0) 2024.10.24
    [투포인터] 백준 1253  (0) 2024.10.23
Designed by Tistory.