본문 바로가기

알고리즘/탐색

[KOTLIN] 큰 수 만들기

728x90

- https://programmers.co.kr/learn/courses/30/lessons/42883

 

코딩테스트 연습 - 큰 수 만들기

 

programmers.co.kr

문제 설명

어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.

예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.

문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.

제한 조건

  • number는 2자리 이상, 1,000,000자리 이하인 숫자입니다.
  • k는 1 이상 number의 자릿수 미만인 자연수입니다.

입출력 예

number k return
"1924" 2 "94"
"1231234" 3 "3234"
"4177252841" 4 "775841"

풀이

1. Stack 을 이용하여 입력으로 들어오는 number 의 char 값을 확인하여 stack 에 있는 값들과 비교하여 클 경우 stack 의 이전 정보를 지우고 char 값을 저장한다.

다른 풀이

1. 3번의 예시에서 k 가 4일 경우 최종 결과가 6자리가 된다.

2. 이때 끝에서 5자리를 제외한 나머지 숫자 중 최대값을 구한다.

3. 2번에서 구한 최대값의 다음 index 를 시작으로 끝에서 4자리를 제외한 나머지 숫자 중 최대 값을 구한다.

전체 코드

import java.util.*

class Solution {
	// Greedy 알고리즘을 이용한 풀이
    fun solution(number: String, k: Int): String {
        val answer = StringBuilder()
        var idx = 0

        for (i in 0 until number.length - k) {
            var max = Int.MIN_VALUE
            for (j in idx..(i+k)) {
                val num = number[j].digitToInt()
                if (max < num) {
                    max = num
                    idx = j + 1
                }
            }

            answer.append(max)
            //println("answer $answer")
        }

        return answer.toString()
    }
    
    // Stack 을 이용한 풀이
    fun solution(number: String, k: Int): String {
        var answer = ""
        val stack = Stack<Int>()
        var count = k

        number.forEach {
            val num = it.digitToInt()

            if (count > 0) {
                if (stack.isEmpty()) {
                    stack.add(num)
                } else {
                    if (stack.isNotEmpty()) {
                        //val top = stack.peek()
                        //println("top : $top, num : $num, $count")

                        while (stack.isNotEmpty() && stack.peek() < num) {
                            if (count == 0) break

                            stack.pop()
                            count--
                        }

                        stack.add(num)
                        //println("stack: $stack")
                    }
                }
            } else if (count == 0) {
                stack.add(num)
            }
        }

        stack.reverse()

        //println("stack: $stack")
        while (stack.isNotEmpty()) {
            if (answer.length == number.length - k) break
            answer += stack.pop()
        }

        return answer
    }
}
728x90

'알고리즘 > 탐색' 카테고리의 다른 글

[KOTLIN]전력 망을 둘로 나누기  (0) 2022.05.02
[KOTLIN] 피로도  (0) 2022.04.11
[KOTIN] 카펫  (0) 2022.04.04
[KOTLIN] 순위 검색  (0) 2022.03.07
[KOTLIN] 조이스틱  (0) 2022.03.03