우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/바킹독

[JAVA] λ°±μ€€ 20366번 【G3.같이 λˆˆμ‚¬λžŒ λ§Œλ“€λž˜?】

2023. 8. 29. 10:51

문제

 

20366번: 같이 λˆˆμ‚¬λžŒ λ§Œλ“€λž˜?

높이가 (2, 5), (3, 5)둜 κ΅¬μ„±λœ λˆˆμ‚¬λžŒ λ‘˜μ„ λ§Œλ“œλŠ” 것이 졜적의 경우 쀑 ν•˜λ‚˜μ΄λ‹€. |7-8| = 1 λ‹€λ₯Έ κ²½μš°λ‘œλŠ” (2, 9), (5, 5)둜 두 λˆˆμ‚¬λžŒμ„ λ§Œλ“œλŠ” κ²½μš°κ°€ μžˆλ‹€. |11-10| = 1

www.acmicpc.net


풀이

 

1️⃣ 쑰합을 μ΄μš©ν•œ 풀이

μ£Όμ–΄μ§„ 눈덩이 쀑 2개둜 λ§Œλ“€ 수 μžˆλŠ” λˆˆμ‚¬λžŒμ˜ 높이λ₯Ό λͺ¨λ‘ κ΅¬ν•œλ‹€.

 

단, 두 μ‚¬λžŒμ΄ 같은 눈덩이λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. μ„œλ‘œ λ‹€λ₯Έ 눈덩이 4κ°œκ°€ μ‚¬μš©λ˜μ–΄μ•Ό ν•œλ‹€.

 

λ”°λΌμ„œ, κ·Έλƒ₯ ν•©μ˜ μ‘°ν•©λ§Œ κ΅¬ν•˜λ©΄ μ΄λŸ¬ν•œ 뢀뢄을 체크할 수 μ—†κΈ° λ•Œλ¬Έμ— μ–΄λ–€ 인덱슀의 눈덩이둜 λˆˆμ‚¬λžŒμ„ λ§Œλ“ κ±΄μ§€ 정보가 ν•„μš”ν•˜λ‹€.

 

λ”°λΌμ„œ, 클래슀λ₯Ό μƒˆλ‘­κ²Œ ν•˜λ‚˜ μ •μ˜ν•΄μ•Όν•œλ‹€.

 

    static class SnowMan{
        int idx1;
        int idx2;
        int height;
        public SnowMan(int idx1, int idx2, int height) {
            this.idx1 = idx1;
            this.idx2 = idx2;
            this.height = height;
        }
    }

 

μœ„μ™€ 같은 SnowMan 클래슀λ₯Ό μ •μ˜ν•œλ‹€.

 

μ–΄λ–€ 인덱슀의 눈덩이λ₯Ό μ‚¬μš©ν•΄μ„œ λ§Œλ“€μ—ˆλŠ”μ§€, 총 λ†’μ΄λŠ” μ–Όλ§ˆμΈμ§€λ₯Ό 보관할 수 μžˆλ‹€.

 

이제, λˆˆμ‚¬λžŒ 쑰합을 List 에 λ„£κ³  λˆˆμ‚¬λžŒ 높이λ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•œλ‹€.

 

κ·Έ μ΄μœ λŠ”, λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” 건 두 λˆˆμ‚¬λžŒμ˜ λ†’μ΄μ˜ μ΅œμ†Œ 차이이기 λ•Œλ¬Έμ—

 

λˆˆμ‚¬λžŒ 높이 순으둜 μ •λ ¬ν•œ λ’€, κ°€μž₯ κ·Όμ²˜μ— μžˆμœΌλ©΄μ„œ λˆˆμ‚¬λžŒμ„ κ΅¬μ„±ν•˜λŠ” λˆˆλ©μ΄κ°€ κ²ΉμΉ˜μ§€ μ•ŠλŠ” λˆˆμ‚¬λžŒλ§Œ 찾으면 되기 λ•Œλ¬Έμ΄λ‹€.

 

λˆˆλ©μ΄κ°€ 겹치치 μ•ŠλŠ” λˆˆμ‚¬λžŒμ„ 찾은 λ’€, λ°œκ²¬ν•˜λ©΄ λ°”λ‘œ break ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ‹œκ°„μ œν•œμ„ 톡과할 수 μžˆμ—ˆλ‹€.

 

μœ„μ™€ 같은 아이디어λ₯Ό λ°”νƒ•μœΌλ‘œ κ΅¬ν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

 

import java.io.*;
import java.util.*;

public class Main {
    int N;
    int [] arr;
    List<SnowMan> list = new ArrayList<>();
    int ans = Integer.MAX_VALUE;
    
    public static void main(String[] args) throws IOException {
        new Main().sol();
    }

    private void sol() throws IOException {
        setUp();
        getCombinations();
        Collections.sort(list, (a, b) -> a.height - b.height);
        getAns();
        System.out.println(ans);

    }

    private void getAns() {
        for (int i = 0; i < list.size()-1; i++) {
            for (int j = i+1; j < list.size(); j++) {
                SnowMan snowMan1 = list.get(i);
                SnowMan snowMan2 = list.get(j);
                if (snowMan1.idx1 != snowMan2.idx1 && snowMan1.idx1 != snowMan2.idx2 && snowMan1.idx2 != snowMan2.idx1 && snowMan1.idx2 != snowMan2.idx2) {
                    ans = Math.min(Math.abs(snowMan1.height - snowMan2.height), ans);
                    break;
                }
            }
        }
    }

    private void getCombinations() {
        for (int i = 0; i < N-1; i++) {
            for (int j = i+1; j < N; j++) {
                list.add(new SnowMan(i, j, arr[i] + arr[j]));
            }
        }
    }

    private void setUp() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        String[] input = br.readLine().split(" ");
        arr = new int[N];

        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(input[i]);
        }
    }

    static class SnowMan{
        int idx1;
        int idx2;
        int height;
        public SnowMan(int idx1, int idx2, int height) {
            this.idx1 = idx1;
            this.idx2 = idx2;
            this.height = height;
        }
    }
}

 

κ²°κ³Ό

 

 

2️⃣ 투 포인터 μ΄μš©ν•œ 풀이

이뢄 탐색을 μ΄μš©ν•΄μ„œ 문제λ₯Ό ν•΄κ²°ν•  μˆ˜λ„ μžˆλ‹€.

 

λ¨Όμ €, 이뢄탐색을 μœ„ν•΄ 눈덩이λ₯Ό μ •λ ¬ν•΄μ€€λ‹€.

 

μ•„μ΄λ””μ–΄λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

 

ν•œ λˆˆμ‚¬λžŒμ€ i번째 λˆˆλ©μ΄μ™€ j번째 눈덩이둜 κ³ μ •ν•œλ‹€. (i와 j 사이에 μ΅œμ†Œ 2개 μ΄μƒμ˜ λˆˆλ©μ΄κ°€ μ‘΄μž¬ν•΄μ•Όν•œλ‹€.)

 

그리고, κ·Έ μ‚¬μ΄μ˜ λˆˆλ©μ΄λ“€λ‘œ 또 ν•˜λ‚˜μ˜ λ‹€λ₯Έ λˆˆμ‚¬λžŒμ„ κ΅¬μ„±ν•œλ‹€.

 

λˆˆμ‚¬λžŒμ„ κ΅¬μ„±ν• λ•Œλ§ˆλ‹€ 두 λˆˆμ‚¬λžŒμ˜ 차이의 값을 κ΅¬ν•˜κ³  값을 κ°±μ‹ ν•΄μ€€λ‹€.

 

λ§Œμ•½ νˆ¬ν¬μΈν„°λ‘œ κ΅¬μ„±ν•œ λˆˆμ‚¬λžŒμ˜ 크기가 κ³ μ •λœ λˆˆμ‚¬λžŒλ³΄λ‹€ 큰 경우 였λ₯Έμͺ½ 포인터λ₯Ό κ°μ†Œν•˜κ³ 

 

μž‘μ€ 경우 μ™Όμͺ½ 포인터λ₯Ό μ¦κ°€ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰μ‹œμΌœ 두 눈 μ‚¬λžŒμ˜ 높이 차이가 μ΅œμ†Œκ°€ 될 수 μžˆλ„λ‘ ν•œλ‹€.

 

λ‹€μŒμ€ μœ„μ™€ 같이 j λ₯Ό μ΄λ™μ‹œμΌœ κ³ μ •λœ λˆˆμ‚¬λžŒμ„ λ‹€λ₯Έ 눈덩이둜 쑰합해보고, κ·Έ μ‚¬μ΄μ˜ λˆˆλ©μ΄λ“€λ‘œ 투 포인터λ₯Ό μˆ˜ν–‰ν•˜λ©΄ λœλ‹€.

 

import java.io.*;
import java.util.*;

public class Main {
    int N;
    int[] arr;
    int ans = Integer.MAX_VALUE;

    public static void main(String[] args) throws IOException {
        new Main().sol();
    }

    private void sol() throws IOException {
        setUp();
        Arrays.sort(arr);
        getAns();
        System.out.println(ans);
    }

    private void getAns() {
        for (int i = 0; i <= N - 4; i++) {
            for (int j = N - 1; j >= i + 3; j--) {
                int snowman1 = arr[i] + arr[j];
                int left = i + 1, right = j - 1;
                while (left < right) {
                    int snowman2 = arr[left] + arr[right];
                    if (snowman2 < snowman1) {
                        left++;
                    } else if (snowman2 > snowman1) {
                        right--;
                    } else {
                        System.out.println(0);
                        System.exit(0);
                    }
                    ans = Math.min(ans, Math.abs(snowman1 - snowman2));
                }
            }
        }
    }

    private void setUp() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        String[] input = br.readLine().split(" ");
        arr = new int[N];

        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(input[i]);
        }
    }

}

 

κ²°κ³Ό

    'πŸ‘¨πŸ»‍πŸ’» PS/바킹독' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [JAVA] λ°±μ€€ 23326번 【G3.홍읡 νˆ¬μ–΄λ¦¬μŠ€νŠΈγ€‘
    • [JAVA] λ°±μ€€ 22939번 【G4.문제 μΆ”μ²œ μ‹œμŠ€ν…œ Version 1】
    • [JAVA] λ°±μ€€ 20166번 【G4.λ¬Έμžμ—΄ μ§€μ˜₯에 λΉ μ§„ ν˜Έμ„γ€‘
    • [JAVA] λ°±μ€€ 13414번 【S3.μˆ˜κ°•μ‹ μ²­γ€‘
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”