제육's 휘발성 코딩
article thumbnail
반응형

뒤에 있는 큰 수 찾기 (LV2)

 

프로그래머스

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

programmers.co.kr

 

성능 요약

메모리: 195 MB, 시간: 60.27 ms

문제 설명

정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.

제한사항
  • 4 ≤ numbers의 길이 ≤ 1,000,000
  • 1 ≤ numbers[i] ≤ 1,000,000
입출력 예
numbers result
[2, 3, 3, 5] [3, 5, 5, -1]
[9, 1, 5, 3, 6, 2] [-1, 5, 6, 6, -1, -1]

 

입출력 예 설명

입출력 예 #1
2의 뒷 큰수는 3입니다. 첫 번째 3의 뒷 큰수는 5입니다. 두 번째 3 또한 마찬가지입니다. 5는 뒷 큰수가 없으므로 -1입니다. 위 수들을 차례대로 배열에 담으면 [3, 5, 5, -1]이 됩니다.

입출력 예 #2
9는 뒷 큰수가 없으므로 -1입니다. 1의 뒷 큰수는 5이며, 5와 3의 뒷 큰수는 6입니다. 6과 2는 뒷 큰수가 없으므로 -1입니다. 위 수들을 차례대로 배열에 담으면 [-1, 5, 6, 6, -1, -1]이 됩니다.

 

문제 풀이 

numbers의 길이가 최대 1,000,000만이기 때문에 완전탐색 O(N^2)은 불가능하다고 판단했습니다.

이 문제랑 비슷한 유형의 백준 문제를 풀어본 적이 있어서 스택으로 구현하였습니다. 

 

2304번: 창고 다각형

첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의

www.acmicpc.net

 

스택 인덱스 동작 과정 (인덱스 : 실제값)

스택에 인덱스를 넣어 관리하는 방식으로 (인덱스: 실제 값)을 기준으로 두었습니다. 

순회하면서 현재 값 (numbers[i])이 스택에 최상단 (stack.peek()) 값보다 크면 뒤에 있는 큰 수에 해당합니다.  해당 경우에 하위 스택 원소들도 탐색해 보면서 추가로 해당하는 원소가 있는지 판별 후 있다면 pop 해주면서 인덱스에 정답 값을 넣어줍니다. 

마지막으로 뒤에 있는 큰 수가 없는 케이스를 위해 스택이 남아있는 경우 -1로 채워줍니다.

 

소스 코드

public int[] solution(int[] numbers) {
    // number index 정보를 담을 Stack 생성
    Stack<Integer> stack = new Stack<>();

    // 정답 배열 생성
    int[] answer = new int[numbers.length];

    // 첫 번째 number 인덱스 stack에 push
    stack.push(0);

    // 두 번째 원소부터 numbers 탐색
    for (int i = 1; i < numbers.length; i++) {
        // 스택이 비어있지 않으면서 현재 스택이 바라보고 있는 값보다 number의 값이 크면 뒤에 있는 큰 수 해당
        while (!stack.isEmpty() && numbers[stack.peek()] < numbers[i]) {
            // 뒤에 있는 큰 수에 해당하는 모든 값 pop
            answer[stack.pop()] = numbers[i];
        }
        // 현재 인덱스 push
        stack.push(i);
    }
    // 모든 index를 탐색 후 뒤에 있는 큰 수가 없는 경우 -1 
    while (!stack.isEmpty()) {
        answer[stack.pop()] = -1;
    }

    return answer;
}
반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^