일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 아스키코드
- 프로그래머스
- 백트래킹
- 시뮬레이션
- Java
- 구현
- DP
- BFS
- Queue
- 빅데이터
- dfs
- oracle
- HashMap
- SQL
- LIS
- BufferedReader
- 배열
- 새벽코딩
- 그리디
- 완전탐색
- 다이나믹프로그래밍
- Python
- 브루트포스
- 탐색
- Stack
- 스택
- 알고리즘
- 백준
- 다리 만들기
- 문자열
- Today
- Total
새벽코딩
[프로그래머스] 최소직사각형 (완전탐색) (JAVA) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/86491
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
명함 번호가로 길이세로 길이1 | 60 | 50 |
2 | 30 | 70 |
3 | 60 | 30 |
4 | 80 | 40 |
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.
모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
제한사항
- sizes의 길이는 1 이상 10,000 이하입니다.
- sizes의 원소는 [w, h] 형식입니다.
- w는 명함의 가로 길이를 나타냅니다.
- h는 명함의 세로 길이를 나타냅니다.
- w와 h는 1 이상 1,000 이하인 자연수입니다.
※ JAVA 코드 (최소 직사각형)
import java.io.*;
import java.util.*;
class Solution {
public int solution(int[][] sizes) {
int answer = 0;
int max = 0;
ArrayList<Integer> minSide = new ArrayList<>();
// 가장 긴 변의 길이를 찾는다.
for(int i = 0; i < sizes.length; i++){
minSide.add(Math.min(sizes[i][0], sizes[i][1]));
for(int j = 0; j < 2; j++){
if(max < sizes[i][j]) {
max = sizes[i][j];
}
}
}
// 가로세로중 짧은변 리스트중 가장 큰값을 위해 정렬한다.
minSide.sort(Comparator.reverseOrder());
int min = minSide.get(0);
answer = max * min;
return answer;
}
}
※ 생각정리 (최소 직사각형)
여러 명함들이 있다고 할때 동시에 여러 명함을 넣을 수 있는 가장 최소의 지갑 크기를 구하는 문제이다.
이처럼 가로 세로 회전이 가능한 사각형이 있을 때 해당 사각형을 지갑에 넣으려면 어떻게 해야할까?
바로 사각형을 돌리는 것이다. 이와 같이 사각형을 돌리려면 먼저 모든 사각형의 가로 세로 변 길이중에서 가장 긴 한 변의 길이를 구한다. 이때 모든 사각형의 긴 변의 길이는 해당 변의 길이보다 무조건 짧을 것이다. (가장 긴변이기 때문에)
반복문을 돌때 긴변이 아닌 짧은 변은 미리 리스트에 담으면서 진행한다. (후에 해당 변들 중 가장 긴변이 지갑의 나머지 한 변이 될 것이다)
이렇게 최소 직사각형을 구할 수 있다.
-새벽코딩-
'알고리즘' 카테고리의 다른 글
[프로그래머스] 게임 맵 최단거리 (BFS) (너비우선탐색) (JAVA) (0) | 2023.05.18 |
---|---|
[프로그래머스] 공원산책 (시뮬레이션) (JAVA) (0) | 2023.05.17 |
[백준] [9372] 상근이의 여행 (MST, BFS) (JAVA) (1) | 2023.05.12 |
[백준] [1389] 케빈 베이컨의 6단계 법칙 (그래프, 플로이드-워셜) (JAVA) (2) | 2023.05.09 |
[백준] [1149] RGB거리 (JAVA) (DP) (0) | 2023.05.04 |