[프로그래머스] Java 코딩테스트 - 최댓값 만들기 (2)

yihyun·2025년 4월 18일

코딩테스트

목록 보기
54/105

최댓값 만들기 (2)

✅ 문제 설명

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

✅ 제한사항

-10,000 ≤ numbers의 원소 ≤ 10,000
2 ≤ numbers 의 길이 ≤ 100

🔽 소스코드 1 (이중 for문 사용)

💻 풀이

  • 비교할 수는 문제에서 나올 수 있는 최소의 수로 설정해준 후 (최댓값이 음수일 수 있기 때문에)
  • for문을 사용해 배열을 순차적으로 순회하면서 최댓값을 찾아준다.
  • 이때 자기 자신과 곱하지 않기 위해 i != j를 비교해 준다.

📌 역시나.. 이중for문은 시간복잡도가 크다 ㅠㅠ

시간 8.70ms ~ 10.78ms

	public int solution(int[] numbers) {
		
		// 기존에 최소값을 문제에서 나올 수 있는 가장 최소의 수로 설정
		int max = -10000 * 10000;
		
		
		for(int i = 0; i < numbers.length -1; i++) {
			int n = 0;
			for(int j = 1; j < numbers.length; j++) {
				if(i != j) {
					n = numbers[i] * numbers[j];
				}
				if(n > max) {
					max = n;
				}
			}
		}
		return max;
	}

🔽 소스코드 2 (Math.max 사용_수학적 접근)

💻 풀이

  • 음수가 포함되어 있기 때문에 정렬할 경우 가장 앞 2개 또는 가장 뒤 2개를 곱해서 나오는 수가 최댓값이다.
  • Arrays.sort() 로 오름차순 정렬을 해준다.
  • 이후 가장 앞 2개를 곱해준 값과 가장 뒤 2개를 곱해 준 값중 큰 값을 반환한다.
  • 더 큰 값을 찾기 위해 Math.max(a, b) 를 사용해준다.

시간 0.33ms ~ 0.47ms

전체코드

	public int solution1(int[] numbers) {
		
		Arrays.sort(numbers);
		int index = numbers.length - 1;
		return Math.max(numbers[0] * numbers[1], numbers[index] * numbers[index -1]);
		
	}
profile
개발자가 되어보자

0개의 댓글