[백준][Java]주몽 - 1940

·2025년 10월 13일
0

코딩테스트

목록 보기
14/16

[Silver IV] 주몽 - 1940

문제 링크

문제 설명

주몽은 철기군을 양성하기 위한 프로젝트에 나섰다. 그래서 야철대장을 통해 철기군이 입을 갑옷을 만들게 하였다. 야철대장은 주몽의 명에 따르기 위하여 연구에 착수하던 중 아래와 같은 사실을 발견하게 되었다.

갑옷을 만드는 재료들은 각각 고유한 번호를 가지고 있다. 갑옷은 두 개의 재료로 만드는데 두 재료의 고유한 번호를 합쳐서 M(1 ≤ M ≤ 10,000,000)이 되면 갑옷이 만들어 지게 된다. 야철대장은 자신이 만들고 있는 재료를 가지고 갑옷을 몇 개나 만들 수 있는지 궁금해졌다. 이러한 궁금증을 풀어 주기 위하여 N(1 ≤ N ≤ 15,000) 개의 재료와 M이 주어졌을 때 몇 개의 갑옷을 만들 수 있는지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고유한 번호들이 공백을 사이에 두고 주어진다. 고유한 번호는 100,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 갑옷을 만들 수 있는 개수를 출력한다.

예제


나의 문제 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //N : 재료의 갯수
        int N = Integer.parseInt(br.readLine());

        //M : 갑옷이 완성되는 번호의 합
        int M = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());

        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i]= Integer.parseInt(st.nextToken());
        }
        //배열 정렬
        Arrays.sort(arr);

        int count = 0;
        int start = 0;
        //배열 인덱스는 0부터 시작이므로 끝 값은 N-1
        int end = N-1;
        
        //start가 end보다 작을때까지
        while(start<end){
            if(arr[start]+arr[end] < M){
                start++;
            }else if(arr[start]+arr[end] > M){
                end--;
            }else{
                count++;
                start++;
                end--;
            }
        }
        System.out.println(count);
    }
}
  • 투포인터 + 배열 정렬을 쓰는 문제이다.
  • 각각의 재료는 한번쓰면 없어진다고 생각해야한다.

문제 풀어보기

1. 재료 데이터를 배열에 저장한 후 오름차순으로 정렬한다.

2. 투포인터를 각각 양쪽 끝에 위치 시킨 후, 조건에 따라 포인터를 이동시키고, 포인터가 만날때 까지 반복한다.

(1) 더한 값이 M보다 작을 때

  • i의 값을 1 증가시킨다. -> 더 큰 값을 찾아야하므로!

(2) 더한 값이 M과 같을 때

  • count값을 1 증가시키고, i는 1증가, j는 1 감소 시킨다.

(3) 더한 값이 M보다 클 때

  • j의 값을 1 감소시킨다. -> 더 작은 값을 찾아야 하므로
profile
배우고 기록하며 성장하는 백엔드 개발자입니다!

0개의 댓글