https://school.programmers.co.kr/learn/courses/30/lessons/86491
[문제 접근]
회전이 가능하기 때문에 가로와 세로는 의미가 없음.
1. 전체 길이 중 가장 긴 길이의 값 저장. -> 80, 가로라고 가정
2. 반대(세로)의 길이만 고려해주면 됨.
3. 세로의 길이가 모든 명함 가로, 세로 값 중 적어도 하나의 수보다 크면 됨.
[풀이과정]
1. 입력되는 배열을 탐색
2. 명함의 가로, 세로 중 더 작은 값을 비교하며 그 중 가장 긴 값을 저장한다.
3. 모든 길이 중 가장 긴 길이의 값을 저장한다.
-> N(n)
[코드]
방식 1
class Solution {
public int solution(int[][] sizes) {
int answer = 0;
//가장 긴 길이
int max = Integer.MIN_VALUE;
//작은 수 중 가장 긴 길이
int maxOfmin = Integer.MIN_VALUE;
for(int i = 0; i < sizes.length; i++){
int first;//더 큰 수
int second;//더 작은 수
if(sizes[i][0] >= sizes[i][1]){
first = sizes[i][0];
second = sizes[i][1];
}else{
first = sizes[i][1];
second = sizes[i][0];
}
max = first > max ? first : max;
maxOfmin = second > maxOfmin ? second : maxOfmin;
}
return max*maxOfmin;
}
}
방식 2 (더 좋은 코드)
class Solution {
public int solution(int[][] sizes) {
int answer = 0;
//가장 긴 길이
int max = Integer.MIN_VALUE;
//작은 수 중 가장 긴 길이
int maxOfmin = Integer.MIN_VALUE;
for(int i = 0; i < sizes.length; i++){
int first = sizes[i][0] >= sizes[i][1] ? sizes[i][0] : sizes[i][1];
int second = sizes[i][0] < sizes[i][1] ? sizes[i][0] : sizes[i][1];
max = first > max ? first : max;
maxOfmin = second > maxOfmin ? second : maxOfmin;
}
return max*maxOfmin;
}
}
[고민한 부분]
방식 1은 if문으로 비교를 한 번만 하고
방식 2는 람다식으로 비교를 두 번 해야 해서 미묘하긴 해도 방식 2가 더 느릴 거라고 생각했는데 수행시간은 큰 차이가 없었다.
이유는
1. 컴파일러가 최적화를 수행하여 동일한 최적화된 바이트코드로 변환일 수 있음.
2. 현대의 하드웨어에서는 조건 분기 수행 시간이 매우 짧기 때문에 실제 수행시간에 큰 영향을 미치지 않음.
따라서 코드의 가독성과 유지보수성을 고려하여 보다 간결하고 이해하기 쉬운 방식으로 코드를 작성하는 것이 좋다.
'프로그래머스 > 완전탐색' 카테고리의 다른 글
[프로그래머스] Level 2. 카펫 (0) | 2024.04.11 |
---|---|
[프로그래머스] Level 2. 소수 찾기 (0) | 2024.04.08 |
[프로그래머스] Level 1. 모의고사 (0) | 2024.04.05 |