세 수의 합

2025. 4. 15. 21:58·Algorithm/백준

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

 

유형

  • 해시
  • 이분 탐색

 

풀이방법

int 배열에서 x + y + z = k가 존재할 때, k의 최대값을 찾는 문제다. (단, 인덱스는 중복 가능)

 

  1. 배열을 이중 탐색하며 x + y합을 HashSet에 저장한다. 이 때 배열의 마지막 값은 저장하지 않아도 된다. (정렬이 된 경우에)
  2. x + y를 이제 알았으니 k - z를 배열을 순회하며 확인한다. 배열을 이중으로 순회하며 arr[i] - arr[j]를 하게되면 모든 k - z의 순서쌍을 구할 수 있다. 이 때, 해당 값이 set에 존재한다면 k의 최댓값을 갱신해준다. (arr[i]를 통해)

 

이분 탐색을 통해서도 값을 탐색할 수 있는데 HashSet이 더 로직을 구현하기 편했던것 같다. 

 

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class boj2295 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int [] arr = new int[n];

        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }

        // A + B + C = K일 때 K의 최댓값을 구하는 문제

        // 1. 모든 A+B 경우의 수를 HashSet에 저장 (이 때 인덱스는 같아도 된다.

        Set<Integer> set = new HashSet<>();
        Arrays.sort(arr);

        for(int i = 0; i < n - 1; i++) { // 마지막 값까진 구할 필요 없음
            for(int j = 0; j < n - 1; j++) {
                set.add(arr[i] + arr[j]);
            }
        }

        // 2. A+B = K-C를 구해야 한다. 배열을 다시 순회하며 뺀 모든 경우의 수를 찾는다.

        int max = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                int diff = arr[i] - arr[j];
                if (set.contains(diff)) { //
                    // 3. 이 때 값이 존재한다면 K값의 최댓값을 갱신해주면 됨
                    max = Math.max(max, arr[i]);
                }
            }
        }
        System.out.println(max);
    }
}

'Algorithm > 백준' 카테고리의 다른 글

boj13904: 과제  (2) 2025.05.15
Upperbound , Lowerbound  (1) 2025.04.18
멀티버스 Ⅱ  (0) 2025.04.15
진우의 달 여행 (Large)  (0) 2025.03.20
11/2 풀이  (1) 2024.11.02
'Algorithm/백준' 카테고리의 다른 글
  • boj13904: 과제
  • Upperbound , Lowerbound
  • 멀티버스 Ⅱ
  • 진우의 달 여행 (Large)
미네구스
미네구스
  • 미네구스
    망구스 blog
    미네구스
  • 전체
    오늘
    어제
    • 분류 전체보기 (174)
      • Kotlin (0)
      • 시큐리티 (0)
        • 개발자 유미 (0)
      • 배포 (4)
      • 회고 (0)
      • Algorithm (143)
        • 프로그래머스 코딩테스트 문제풀이전략 (37)
        • 백준 (66)
        • 프로그래머스 (18)
        • Leetcode (22)
        • 코테 팁 (0)
      • 프로젝트 (8)
        • WEPIK (3)
        • PICK-O (5)
      • CS (1)
        • 운영체제 (5)
        • 네트워크 (1)
        • 면접스터디 (2)
      • 면접 (0)
        • 코테후기 (0)
        • 면접후기 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    N과 M
    `
    백트래킹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
미네구스
세 수의 합
상단으로

티스토리툴바