Devtraces
개발자취
Devtraces
전체 방문자
오늘
어제
  • 분류 전체보기
    • Baekjoon
    • Programmers

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 그리디 알고리즘
  • programmers
  • Trie
  • stack
  • DP
  • GCD
  • map
  • level3
  • floyd-warshall
  • math
  • java
  • BFS
  • Tree
  • Dijkstra
  • binary search
  • sort
  • prime number
  • Set
  • two pointer
  • recursive
  • greedy
  • Queue
  • Matrix
  • level2
  • PriorityQueue
  • level4
  • dfs
  • union-find
  • Kakao
  • 백준

최근 댓글

최근 글

티스토리

Devtraces
[프로그래머스 Level.2] 뒤에 있는 큰 수 찾기 (연습문제) (Java)
Programmers

[프로그래머스 Level.2] 뒤에 있는 큰 수 찾기 (연습문제) (Java)

2023. 2. 1. 14:14

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/154539

 

프로그래머스

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

programmers.co.kr

 

 

 

코딩테스트 > 연습 연습문제 > 뒤에 있는 큰 수 찾기

 

 

 

문제 설명

 

 

정수로 이루어진 배열 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]이 됩니다.

 

 

 

 

 

나의 코드

import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = new int[numbers.length];
        
        Stack<Integer> stack = new Stack<>();
        
        for(int i=numbers.length-1; i>=0; i--) {
            while(!stack.isEmpty() && numbers[i] >= stack.peek()) {
                stack.pop();
            }
            
            if(stack.isEmpty()) 
                answer[i] = -1;
            else
                answer[i] = stack.peek();
            
            stack.push(numbers[i]);
        }
        
        return answer;
    }
}

 

풀이

  1. numbers에서 자기보다 큰 값을 가진 가장 근처에 있는 인덱스를 구하는 것이므로 거꾸로 뒤에서부터 Stack에 담겨있는 값과 비교하여 numbers[i]보다 큰 값이 나올때까지 찾으면 numbers[i]보다 큰 값이 없다면 Stack은 비어있게 되고 numbers[i]보다 큰 값이 있다면 numbers[i]보다 큰 값 중 가장 가까운 인덱스의 값이 제일 앞에 나오게 된다.
  2. 따라서 Stack에는 현재 numbers[i]보다 작으면 사라지고 현재 numbers[i]보다 크면 살아남은 후에 현재 numbers[i]가 추가되며 비교하게 된다.
  3. 우선 numbers를 담기 위해 Integer를 선언타입으로 Stack을 생성한다.
  4. 그리고 numbers의 인덱스 끝에서 부터 반대로 for문을 돌린다.
  5. for문 내부에서 while문을 생성하여 Stack이 비어있지 않고 numbers[i]가 Stack의 가장 최근 값보다 같거나 크다면 반복해서 pop()을 이용해 Stack의 값을 꺼낸다.
  6. 그러다 while문을 나왔을 때 Stack이 비어있다면 numbers[i]보다 큰 값이 없는 것이므로 answer[i]에는 -1을 저장하고 Stack이 비어있지 않다면 numbers[i]보다 큰 값이 Stack에 있는 것이므로 peek()을 이용하여 Stack의 가장 최근 값을 answer[i]에 저장한다.
  7. 그리고나서 numbers[i]를 Stack에 push()를 이용하여 담는다.

 

 

 

'Programmers' 카테고리의 다른 글

[프로그래머스 Level.2] 무인도 여행 (연습문제) (Java)  (0) 2023.02.03
[프로그래머스 Level.2] 숫자 변환하기 (연습문제) (Java)  (0) 2023.02.02
[프로그래머스 Level.2] 시소 짝꿍 (연습문제) (Java)  (0) 2023.01.31
[프로그래머스 Level.4] [3차] 자동완성 (2018 KAKAO BLIND RECRUITMENT) (Java)  (0) 2023.01.30
[프로그래머스 Level.2] 배달 (Summer/Winter Coding(~2018)) (Java)  (0) 2023.01.27
    'Programmers' 카테고리의 다른 글
    • [프로그래머스 Level.2] 무인도 여행 (연습문제) (Java)
    • [프로그래머스 Level.2] 숫자 변환하기 (연습문제) (Java)
    • [프로그래머스 Level.2] 시소 짝꿍 (연습문제) (Java)
    • [프로그래머스 Level.4] [3차] 자동완성 (2018 KAKAO BLIND RECRUITMENT) (Java)
    Devtraces
    Devtraces

    티스토리툴바