suheang

[백준] | JAVA, 자바 | 1940번 - 주몽 본문

알고리즘

[백준] | JAVA, 자바 | 1940번 - 주몽

suheang 2024. 4. 17. 21:42

https://www.acmicpc.net/problem/1940

 

1940번: 주몽

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고

www.acmicpc.net


문제 요약 :

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

 

( 첫째 줄에 갑옷을 만들 수 있는 개수를 출력 )


문제 풀이 :

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));
        int n = Integer.parseInt(br.readLine());
        int m = Integer.parseInt(br.readLine());
        int[] material = new int[n];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            material[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(material);

        int count = 0;
        int left = 0, right = n - 1;

        while (left < right) {
            int sum = material[left] + material[right];

            if (sum == m) {
                count++;
                left++;
            } else if (sum < m) {
                left++;
            } else {
                right--;
            }
        }

        System.out.println(count);
    }
}

 

1. n, m 입력받기

2. n 만큼 재료들이 가진 번호 입력받기

3. 입력받은 번호들 정렬

4. 변수 count, left. right 생성

5. while문을 통해 갑옷을 만들 수 있는 개수 확인

5 - 1. 정렬한 material를 왼쪽 끝 인덱스와 오른쪽 끝 인덱스를 계산하여 m 과 비교

5 - 2. 계산한 값과 m이 같다면 count 증가, left 증가

5 - 3. 계산한 값이 m보다 작다면 left 증가

5 - 4. 그렇지 않다면 right 1 감소

6. count 출력