b2629. 양팔저울

2025. 1. 17. 16:21·Algorithm & Data Structures/BOJ

 

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

 

 

 

문제를 풀기 위해서는 dp[][] 의 규칙을 아는것이 가장 편하다.

이 문제의 규칙은 다음과 같다. 

 

1. dp[i][j] 는 boolean[N][M] 으로써 i 번째 추까지 사용했을 때 j무게를 확인할 수

있는가 없는가를 나타낸다. 또한 N은 추의갯수 M은 가능한 무게측정범위 즉 15001이 된다.

 

2. dp[i-1][j] 가 true라면 dp[i][j] 또한 true이다.

 

3. dp[i-1][ K ] 에서 true가 된다면

dp[i][K-i번째 추의 절댓값]과

dp[i][K+i번째 추의 절댓값]은 15001을 넘지않으면 true이다.

 

위의 규칙을 활용하여 나는 init method를 통해 초기화 및 입력을 받았으며

logic에서 N번째 추를 15000번 루프를 돌아 확인하고

true check를 통해서 풀이하였다.

 

 

 

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    static int N,M;
    static int[] beads,weights;
    static boolean[][] dp;

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        init(br);
        logic();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < M ; i++) {
            if (beads[i] > 15000) sb.append("N ");
            else if(dp[N-1][beads[i]]) sb.append("Y ");
            else sb.append("N ");
        }
        System.out.println(sb);
    }

    private static void logic() {
        Arrays.sort(weights);
        dp[0][weights[0]]= true;
        for (int i = 1; i < N; i++) { //구슬 종류
            dp[i][weights[i]]= true;
            for(int j = 0 ; j < 15001; j++) { // 이전 무게 위치
                if(dp[i-1][j]) {
                    dp[i][j] = true;
                    int sum = Math.abs(j + weights[i]);
                    dp[i][Math.abs(j - weights[i])] = true;
                    if (sum <= 15000)
                        dp[i][sum] = true;
                }
            }
        }
    }

    private static void init(BufferedReader br) throws IOException {
        N = Integer.parseInt(br.readLine());
        weights = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++)
            weights[i] = Integer.parseInt(st.nextToken());

        M = Integer.parseInt(br.readLine());
        beads = new int[M];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < M; i++)
            beads[i] = Integer.parseInt(st.nextToken());

        dp = new boolean[N][15001];
    }
}

'Algorithm & Data Structures > BOJ' 카테고리의 다른 글

b.17298 오큰수  (1) 2025.01.23
b.2293 동전 1  (0) 2025.01.21
b11049. 행렬 곱셈 순서  (0) 2025.01.13
b11066. 파일 합치기  (0) 2025.01.10
b1300. K번째 수  (0) 2025.01.08
'Algorithm & Data Structures/BOJ' 카테고리의 다른 글
  • b.17298 오큰수
  • b.2293 동전 1
  • b11049. 행렬 곱셈 순서
  • b11066. 파일 합치기
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (325) N
      • Algorithm & Data Structures (246) N
        • BOJ (104) N
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (26) N
        • SQL (20) N
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    구현
    BFS
    골드
    스택
    DynamicProgramming
    백트래킹
    Java
    baekjoon
    PriorityQueue
    프로그래머스
    Union-Find
    투포인터
    SQL
    이분탐색
    경로압축
    동적계획법
    전위순회
    binarySearch
    programmers
    다익스트라
    후위순회
    Dijkstra
    Stack
    dp
    dfs
    백준
    unionfind
    algorithm
    유니온파인드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
b2629. 양팔저울
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.