개발자는 기록이 답이다

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Array_큰 수 출력하기) 본문

알고리즘/인프런 - Java알고리즘 입문

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Array_큰 수 출력하기)

slow-walker 2023. 9. 4. 09:54

 

https://cote.inflearn.com/contest/10/problem/02-01

 

 

OnlineJudge

 

cote.inflearn.com

(위의 링크는 인프런 로그인 후, 해당 강의를 사지 않으면 접속이 되지 않습니다)

1. 큰 수 출력하기

예시 입력 1 

6
7 3 9 5 6 12

예시 출력 1

7 9 6 12

 

내가 푼 풀이(Time: 165ms Memory: 27MB)

 

처음에 문제를 잘 못 읽어서 첫 줄 입력값보다 2번째 줄 입력배열중에 큰 수를 찾는 것 인 줄 알았다.

그게 아니라 첫 줄은 2번째 줄의 길이를 말하는 것이었다.

입출력에 대한 타입이 정해지지 않으니까 어떤걸로 정의해야할지 헷갈렸다.

문제를 제대로 읽어야겠다.

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public ArrayList<Integer> solution(int num, int[] array) {
        ArrayList<Integer> list = new ArrayList<>();
        // 첫 번째수 무조건 출력
        list.add(array[0]);
        for (int i = 1; i < num; i++) {
            if (array[i] >= array[i-1]) {
                list.add(array[i]);
            }
        }
        return list;
    }


    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int[] array = new int[num];
        for (int i = 0; i < num; i++) {
            array[i] = sc.nextInt();
        }
        for (int ans : T.solution(num, array)) {
            System.out.print(ans + " ");
        }
    }
}

 

궁금증 : ArrayList<Integer> list = new ArrayList<>();   VS    List<Integer> list = new ArrayList<>();

  1. 타입 선언:
    • 첫 번째 예제에서는 ArrayList<Integer>을 사용하여 변수 list를 선언하고 초기화합니다. 이는 변수 list가 ArrayList 클래스의 인스턴스임을 명시적으로 나타냅니다. 이것은 구체적인 클래스 타입에 의존하는 것이며, 나중에 코드를 변경할 때 다른 리스트 구현으로 전환하기 어렵게 만들 수 있습니다.
    • 두 번째 예제에서는 List<Integer>을 사용하여 변수 list를 선언하고 초기화합니다. 이것은 변수 list가 리스트 인터페이스 (List)의 인스턴스임을 나타냅니다. 이것은 코드를 더 유연하게 만들어주며, 나중에 필요한 경우 다른 리스트 구현체 (예: LinkedList)로 쉽게 변경할 수 있습니다. 이것은 자바의 다형성 원칙을 따르는 것이며, 인터페이스를 사용하여 프로그램을 더 추상화하고 유지보수를 용이하게 합니다.
  2. 사용 가능한 메서드:
    • 첫 번째 예제의 경우 list 변수에는 ArrayList 클래스의 모든 메서드가 직접적으로 사용 가능합니다. 이것은 ArrayList의 특별한 기능을 활용할 수 있게 해줍니다.
    • 두 번째 예제의 경우 list 변수에는 List 인터페이스에서 정의된 메서드만 사용 가능합니다. 이는 List 인터페이스에서 정의된 메서드만 사용할 수 있으며, ArrayList의 특별한 메서드는 직접 사용할 수 없습니다. 이것은 코드가 인터페이스에 의존하고, 다른 리스트 구현으로 교체하기 쉬워지는 장점을 제공합니다.

일반적으로 가능하면 변수를 인터페이스 타입으로 선언하는 것이 좋습니다. 이렇게 하면 코드가 더 유연해지며, 나중에 변경 및 확장이 쉬워집니다. 따라서 List<Integer> list = new ArrayList<>();와 같이 선언하는 것이 권장됩니다.