본문 바로가기
개발일지/코테 정복기

[Softeer/JAVA] 나무 심기(LV.1)

by 리콩알 2024. 6. 7.
반응형

 

문제 설명

https://softeer.ai/practice/7353
(저작권으로 인해 링크로 대체합니다!)
 
 
주의 사항
두 수를 곱해서 최대 값을 구하는 것이기 때문에 음수*음수의 경우에 주의!!!
ex) 땅의 비옥함이  -1, 2, 3, -10 와 같다면 음수*음수의 경우(-1*-10)가 최대값이기 때문에 해당 경우를 주의 해야한다.


문제 풀이
제일 먼저 알고리즘 정렬 방식에서 떠올라 비옥함을 각 배열에 담고 서로서로 비교하여 최대값을 비교하면 되지 않을까??
라는 생각을 가지고 코드를 작성하였다.

1. arr배열을 선언하여 땅의 비옥함을 배열에 담는다.
2. 비옥함을 담아둔 배열의 첫번째 값을 max값으로 초기선언 한다.
   ( max값을 0으로 초기 선언을 하게 되면 추후 max값을 비교할 때 초기 값이 음수라면 0보다 작기 때문에 max값을 0으로 담기 때문 )
3. 2중 for문을 선언하는데 위의 그림과 같이 계산 하려면 두번째 for문 실행 시 계산한 배열 index는 제외 시켜주어야 한다.

 

코드 풀이

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); //사용자가 입력한 값 받아오기
        int n = sc.nextInt(); //나무를 심어야하는 위치 개수
        int[] arr = new int[n];
        
        //arr배열을 선언하여 차례로 비옥함을 담는다
        for(int i=0; i<n; i++){
            arr[i] = sc.nextInt(); 
        }
        
        //음수인 값을 대비하여 0으로 선언하지 않고 max값을 처음 배열 곱한 값으로 선언
        int max = arr[0]*arr[1];
        
        for(int j=0; j<arr.length-1; j++){
            for(int k=1; k<arr.length; k++){  
            //앞서 계산한 배열 index는 제외 시킨다
                if(j != k){
                    if(max < arr[j]*arr[k]){ //곱한 값이 기존에 저장한 max값 보다 크다면 해당 값을 max값을 변경
                       max = arr[j]*arr[k];
                    }
                }               
            }
        }
        System.out.println(max); //최대값 출력
    }
}

 

단순하게 이중 for문으로 구현을 했는데 다른 사람들의 풀이를 찾아보니 비옥함에 대한 배열을 선언 후 해당 배열을 sort()한 후 맨 앞 두 배열 값과 맨 뒤 두 배열 값을 비교하여 max값을 찾는 풀이가 있어 같이 정리 해본다!
생각해보니 정말 간단한 방법이쟈나..?? 
 
해당 해결 방법으로 정렬하게 되면 음수는 절대값이 큰 숫자 일수록 작은 수가 되기 때문에 앞의 두 개의 값이 음수 중에서 제일 큰 값이 될 것이고,
양수는 절대값이 큰 숫자일수록 큰 수가 되기 때문에 뒤의 두 개의 값이 양수 중에서 제일 큰 값이 될 것이다. 코드도 해당 방식으로 변경하면 정말 간단하게 풀이가 될 것 같아 해당 방식으로 코드를 수정해 보았다.

 

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        int max = 0;
        
        for(int i=0; i<n; i++){
            arr[i] = sc.nextInt();
            
        }
        //비옥함을 담은 배열 sort()로 정렬
        Arrays.sort(arr);
        //Math.max()로 큰 값 비교
        max = Math.max(arr[0]*arr[1],arr[n-1]*arr[n-2]);
        System.out.println(max);
    }
}

 

너무 간단하게 끝나 버렸잖아...???? 소스가 너무 깔끔하게 정리 되었다....ㅎㅎㅎ혼자 어렵게 풀었군🤪
얼른 다른 문제도 많이 풀어서 이렇게 뚝딱 뚝딱 풀 수 있도록 연습 많이 해야지..!!!

 

 

 

실행 결과

 

반응형