[백준] 1239 - 차트(Java)

2025. 4. 16. 18:47·Algorithm

문제 파악

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

풀이

주어진 N이 [1,8]로 작은 편에 속한다.
따라서 재귀로 풀이해도 문제가 없을 것으로 판단했다.

핵심 구현 사항은 다음과 같다

  • 순열 배열 생성 (재귀)
  • 누적 퍼센트 저장
    • 10%, 40%, 50%의 경우, [10, 50, 100] 이 저장될 것
  • 누적 퍼센트를 순환하며 반대 방향의 누적 퍼센트가 있는지 탐색
    • ex. 30% -> 80%가 있는지 검사 (즉 50%를 더한 값이 존재하는지 확인)

참고) 퍼센트를 각도로 변환하게 될 시 소수점 문제가 있어서, 자연수인 퍼센트를 활용해야 한다 😅

조금 더 코드를 보완하기 위해서는 50%를 초과하는 값들은 탐색에서 제외하는 방법을 추가할 수도 있겠다.
(그 값들은 (0, 50) 구간에서 이미 판별했을 것이기 때문)

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static int[][] status;
    private static int N;
    private static int answer;

    public static void main(String[] args) throws IOException {
        N = Integer.parseInt(br.readLine());
        Map<Integer, Integer> frequencyMap = Arrays.stream(br.readLine().split(" ")).map(Integer::parseInt)
                .collect(Collectors.toMap(k -> k, k -> 1, Integer::sum));
        status = frequencyMap.entrySet().stream().map(e -> new int[]{e.getKey(), e.getValue()}).toArray(int[][]::new);
        permute(0, new int[N]);
        System.out.println(answer);
    }

    private static void permute(int count, int[] arr) {
        if (count == N) {
            answer = Math.max(answer, countLines(arr));
            return;
        }
        for (int i = 0; i < status.length; i++) {
            if (status[i][1] == 0) {
                continue;
            }
            status[i][1]--;
            arr[count] = status[i][0];
            permute(count + 1, arr);
            status[i][1]++;
        }
    }

    private static int countLines(int[] percentageArr) {
        HashSet<Integer> cumulativePercentageSet = new HashSet<>();
        int cumulatePercentage = 0;
        for (int percentage : percentageArr) {
            cumulatePercentage += percentage;
            cumulativePercentageSet.add(cumulatePercentage);
        }
        int count = 0;
        for (int cp : cumulativePercentageSet) {
            if (cumulativePercentageSet.contains(cp + 50)) {
                count++;
            }
        }
        return count;
    }
}

 

저작자표시 비영리 변경금지 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 1039 - 교환(Java)  (1) 2025.04.18
[백준] 2132 - 나무 위의 벌레(Java)  (1) 2025.04.17
[백준] 1563 - 개근상(Java)  (1) 2025.04.14
[백준] 1379 - 강의실 2 (Java)  (0) 2025.04.09
[백준] 1717 - 집합의 표현 (Java)  (0) 2025.04.08
'Algorithm' 카테고리의 다른 글
  • [백준] 1039 - 교환(Java)
  • [백준] 2132 - 나무 위의 벌레(Java)
  • [백준] 1563 - 개근상(Java)
  • [백준] 1379 - 강의실 2 (Java)
코드파고
코드파고
  • 코드파고
    Digging Code
    코드파고
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • Memorization (12)
      • Spring (18)
      • Java (1)
      • Algorithm (40)
      • Server (2)
      • DB (0)
      • CS (0)
      • CI & CD (4)
      • Architecture (0)
      • Design Patterns (0)
      • Study (1)
      • Book (9)
        • DEV (7)
        • Non-DEV (0)
      • Infra (1)
        • Kafka (6)
        • AWS (4)
      • TroubleShooting (1)
        • Etc (1)
      • Tools (0)
  • 블로그 메뉴

    • 홈
    • Github
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Spring
    clean architecture
    클린아키텍쳐
    Clean Code
    Spring독학
    Spring Boot
    알고리즘
    architecture
    헥사고날아키텍쳐
    SpringFramework
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
코드파고
[백준] 1239 - 차트(Java)
상단으로

티스토리툴바