developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 삼성코테파이썬
  • 시계열분석
  • 통계분석
  • c++디자인패턴
  • ARIMA모형
  • 삼성코테자바풀이
  • Arima
  • 데이터분석
  • SW역량테스트파이썬
  • AR모형
  • 카카오코테
  • 백준파이썬풀이
  • MA모형
  • 카카오코테java풀이
  • 시계열
  • 코테파이썬
  • SW역량테스트파이썬풀이
  • 삼성코테파이썬준비
  • 삼성코테기출
  • 삼성코테자바꿀팁
  • 삼성코테구현문제추천
  • c++ 빌더 패턴
  • 운영체제인터럽트
  • 통계학
  • 삼성코테구현풀이
  • 삼성코테기출자바풀이
  • 삼성코테준비
  • 삼성코테자바준비
  • 삼성코테파이썬풀이
  • BOJ파이썬풀이

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

BOJ - 정육면체 9029번 (JAVA)
알고리즘/알고리즘문풀

BOJ - 정육면체 9029번 (JAVA)

2022. 8. 28. 15:58

❓ 문제 - 백준 정육면체 9029번 - JAVA 풀이법

 

출처 

(https://www.acmicpc.net/problem/9029)

 

9029번: 정육면체

입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 20) 가 주어진다. 각 테스트 케이스에 대해 원목의 크기를 나타내는 W,L,H (1 ≤ W, L, H ≤ 200)

www.acmicpc.net

 

 

 

📝 문제해결법

1. 문제

  • 원목의 가로, 세로, 높이의 길이가 W, L, H일 때 원목을 가로, 세로, 높이 방향으로 자르는 작업을 정육면체가 될 때까지 반복적으로 자르는데 걸리는 최소 횟수를 출력한다.

 

2. 해결 방법

  • 우선 DP를 통해 문제를 해결해야 한다. 소스코드에서 box 3차원 배열을 선언하여 특정 w, l, h일때 모든 나무조각을 정육면체로 될 때까지의 최소 절단 회수를 저장한다.
  • 만약 h를 기준으로 절단 할 때 i만큼 자르면 w, l, i 와 w, l, h-i로 나누어진다. 이 때, w, l, h를 w, l, i의 최소 절단 횟수와 w, l, h-i 절단 횟수의 합으로 구해질 수 있으며, 이것은 w, h, l 방향 모두 시도한다.
  • 그리고 w, l, h의 길이중 하나가 1일 경우에는 다른 두 변을 곱한 값을 배열에 저장한다.
  • 또한 w, l, h의 길이 중 두 길이가 나머지 하나의 배수인 경우 또한 나눈 형태의 값으로 값을 배열에 저장한다.
  • 나머지는 경우는 이제 자르는 모든 경우를 dp를 활용해서 최소 절단 횟수를 구한다.

 

 

3. 느낀점

  • DP 문제를 풀려고 할 때 쫄지말자.. 생각보다 풀이가 간단할 수도 있다...!!!!!!!!!!!!!!!!!!!

 

 

 

💻 소스코드 (JAVA)

// BOJ - 정육면체(9029번)
// DP
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_9029 {
    public static int[][][] box;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        int TC = Integer.parseInt(br.readLine());
        box = new int[201][201][201];

        for(int w=1;w<=200;w++){
            for(int l=1;l<=200;l++){
                for(int h=1;h<=200;h++){
                    if(box[w][l][h] == 0){
                        if(w == 1){
                            box[w][l][h] = l*h;
                        } else if(l == 1){
                            box[w][l][h] = w*h;
                        } else if(h == 1){
                            box[w][l][h] = w*l;
                        } else if((l % w == 0) && (h % w == 0)){
                            box[w][l][h] = (l / w) * (h / w);
                        } else if((w % l == 0) && (h % l == 0)){
                            box[w][l][h] = (w / l) * (h / l);
                        } else if((w % h == 0) && (l % h ==0)){
                            box[w][l][h] = (w / h) * (l / h);
                        } else {
                            box[w][l][h] = Integer.MAX_VALUE;
                            for(int i=1;i<=w/2;i++){
                                box[w][l][h] = Math.min(box[w][l][h], box[i][l][h] + box[w-i][l][h]);
                            }

                            for(int i=1;i<=l/2;i++){
                                box[w][l][h] = Math.min(box[w][l][h], box[w][i][h] + box[w][l-i][h]);
                            }

                            for(int i=1;i<=h/2;i++){
                                box[w][l][h] = Math.min(box[w][l][h], box[w][l][i] + box[w][l][h-i]);
                            }
                        }

                        box[w][h][l] = box[w][l][h];
                        box[h][l][w] = box[w][l][h];
                        box[h][w][l] = box[w][l][h];
                        box[h][l][w] = box[w][l][h];
                        box[w][l][h] = box[w][l][h];
                        box[w][h][l] = box[w][l][h];
                    }
                }
            }
        }


        for(int test_case=1;test_case<=TC;test_case++){
            st = new StringTokenizer(br.readLine(), " ");
            int w = Integer.parseInt(st.nextToken());
            int l = Integer.parseInt(st.nextToken());
            int h = Integer.parseInt(st.nextToken());

            System.out.println(box[w][l][h]);
        }
    }

 

 

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 다리 만들기 2146번 (JAVA)  (0) 2022.09.09
BOJ - 벽 부수고 이동하기4 16946번 (JAVA)  (0) 2022.09.04
BOJ - 친구 네트워크 4195번 (JAVA)  (0) 2022.08.25
BOJ - 소풍 2026번 (JAVA)  (0) 2022.08.23
BOJ - 악덕 영주 혜유 20010번 (JAVA)  (0) 2022.08.16
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 다리 만들기 2146번 (JAVA)
    • BOJ - 벽 부수고 이동하기4 16946번 (JAVA)
    • BOJ - 친구 네트워크 4195번 (JAVA)
    • BOJ - 소풍 2026번 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바