th42500의 TIL

[Java] 연습문제 - 제일 작은 수 제거하기 (Lv 1) 본문

Algorithm/Programmers

[Java] 연습문제 - 제일 작은 수 제거하기 (Lv 1)

th42500 2022. 12. 16. 12:38

https://school.programmers.co.kr/learn/courses/30/lessons/12935?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

✔ 입출력 예시

제일 작은 수 제거하기 입출력 예시

 

 

❓ 풀이과정

사실 이번 문제는 Lv1인만큼 풀이과정도 엄청 간단하다.

1️⃣ 가장 작은 수 찾기

2️⃣ 가장 작은 수를 제외한 나머지 수를 int 배열 타입으로 반환

 

 

✔ 소스 코드1

package lv1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Solution {  // 제일 작은 수 제거하기
	
	public int[] solution(int[] arr) {
		List<Integer> answer = new ArrayList<Integer>();
		
		int min = Integer.MAX_VALUE;
		int minIdx = 0;
		for (int i = 0; i < arr.length; i++) {
			answer.add(arr[i]);
			if(min > arr[i]) {
				minIdx = i;
				min = arr[i];
			}
		}
//		System.out.println(min);
		answer.remove(minIdx);
		if(answer.isEmpty()) answer.add(-1);
		return answer.stream().mapToInt(Integer::intValue).toArray();
	}

	public static void main(String[] args) {
		Solution main = new Solution();
		
		int[] arr = {4, 3, 2, 1};
//		int[] arr = {10};
		
		System.out.println(Arrays.toString(main.solution(arr)));
	}

}

 

💡 실행 결과

List와 반복문을 이용한 코드 실행 결과

속도가 나쁘지는 않지만 코드 가독성면에서 마음에 들지 않아 다른 사람들이 푼 방법을 보았다.

 

다른 사람 풀이 - 첫번째 풀이

❓❓❓❓❓❓❓

아니 내가 최소 10줄 이상 써야만 풀 수 있었던 문제를 이렇게 단 3줄만으로 끝낸다고...?

🤦‍♀️ 충격...

코드의 가독성은 너무 좋았지만 해당 풀이에 대한 댓글들 중에 속도가 for문에 비해 느리다는 말이 있어 직접 작성하고 실행해보았다.

 

 

✔ 소스 코드 2

package lv1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Solution {  // 제일 작은 수 제거하기
	
	public int[] solution(int[] arr) {
		int min = Arrays.stream(arr).min().getAsInt();
		
		return (arr.length == 1)?new int[] {-1}:Arrays.stream(arr).filter(i -> i != min).toArray();
	}

	public static void main(String[] args) {
		Solution main = new Solution();
		
		int[] arr = {4, 3, 2, 1};
//		int[] arr = {10};
		
		System.out.println(Arrays.toString(main.solution(arr)));
	}

}

 

💡 실행 결과

Stream의 min() 을 사용한 코드 실행 결과

실행 결과를 보면 확실히 소스코드1보다는 소스코드2에서 시간이 오래 걸리는 것을 확인할 수 있었다.

Stream()을 사용하면 코드의 가독성은 가져갈 수 있지만 속도는 조금 포기해야 한다는 단점을 직접 깨닫게 되는 좋은 문제였다.

 

레벨 1 다시 되돌아보며, 배울점을 기록하는 시간을 가질 수 있어서 뿌듯하다.

 

Comments