clamp
Clamp
clamp
글쓰기 관리
전체 방문자
오늘
어제
  • 분류 전체보기 (509)
    • IOS (85)
    • SwiftUI+TCA+Combine (9)
    • RxSwift + MVVM (56)
    • Clean Architecture (12)
    • SWIFT (56)
    • iOS - TDD (2)
    • 디자인패턴 (4)
    • CS (56)
      • 알고리즘 (29)
      • 운영체제 (15)
      • 자료구조 (2)
      • 네트워킹 (4)
      • 기타 (6)
    • 회고 (0)
    • Firebase (18)
    • SwiftUI (10)
    • iOS - UIKit (11)
    • iOS - 오픈소스 (6)
    • 코딩테스트 (166)
      • 프로그래머스 (164)
    • 정보처리기사 (14)
    • GitHub (2)
글쓰기 / 관리자

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅅ
  • Swift
  • uikit
  • Q

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
clamp

Clamp

코딩테스트/프로그래머스

프로그래머스 - 뒤에 있는 큰 수 찾기[Swift](Stack)

2023. 2. 3. 13:58

뒤에 있는 큰 수 찾기

문제 설명

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


제한사항
  • 4 ≤ numbers의 길이 ≤ 1,000,000
    • 1 ≤ numbers[i] ≤ 1,000,000

입출력 예numbersresult
[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]이 됩니다.


풀이 및 소스코드

실패한 코드 (시간초과)

func solution(_ numbers:[Int]) -> [Int] {
    var result = [Int]()
    let cnt = numbers.count
    
    //타겟에서
    for target in 0..<cnt{
        var check = false
        //끝까지 순회하며
        for big in target+1..<cnt{
            //큰 수면 추가하고 멈춤
            if numbers[target] < numbers[big]{
                check = true
                result.append(numbers[big])
                break
            }
        }
        if check == false{
            result.append(-1)
        }
        
    }
    return result
}

레벨 2답게 단순 반복은..

 

성공한 코드

import Foundation

func solution(_ numbers:[Int]) -> [Int] {
    let cnt = numbers.count
    var result = [Int](repeating: -1, count: cnt)
    var stack = [Int]()
    
    for i in 0..<cnt{
        //스택이 비어있지 않고 && 스택의 마지막이 현재의 숫자보다 크다면
        //[2, 3, 3, 5]일 경우 3은 2보다 크므로 작동, 3, 3,은 스택에 추가만 하고 5가되면 3, 3을 5, 5로 바꾼다
        while !stack.isEmpty && numbers[stack.last!] < numbers[i]{
            result[stack.popLast()!] = numbers[i]
        }
        stack.append(i)
    }

    return result
}
저작자표시 비영리 동일조건 (새창열림)
    '코딩테스트/프로그래머스' 카테고리의 다른 글
    • 프로그래머스 - 최댓값과 최솟값[Swift]
    • 프로그래머스 - 숫자 변환하기 [Swift]
    • 프로그래머스 - 무인도 여행[Swift](DFS)
    • 프로그래머스 - 문자열 내 마음대로 정렬하기[Swift]
    clamp
    clamp
    주니어 iOS개발자의 발악!!!!!!!

    티스토리툴바