본문 바로가기
코딩테스트

[프로그래머스] 컨트롤 제트

by liz_devel 2025. 12. 23.

🗒 문제

 

 


📝 나의 문제풀이

class Solution {
    fun solution(s: String): Int {
        val list = s.split(" ")
        var answer = 0
        list.mapIndexed{ idx, v ->
             when(v){
                "Z" -> answer -= list[idx - 1].toInt()
                else -> answer += v.toInt()
            }
            
        }
        return answer
    }
}

 

when (v) {
    "Z" -> answer -= list[idx - 1].toInt()
    else -> answer += v.toInt()
}

문제점 1

  • "Z"가 나오면 항상 바로 앞 값을 빼고 있음
  • 그런데 앞 값이 이미 취소된 값일 수도 있음
  • 구조적으로 안전하지 않음

📝 다른 사람의 문제 풀이

다른 사람의 문제 풀이는 좋아요 수가 높거나 많은 사람들이 푼 방법 기준으로 첨부하였습니다.

import java.util.*

class Solution {
    fun solution(s: String): Int {
        var answer = 0
        val stack = Stack<Int>()

        for (w in s.split(" ".toRegex())) {
            if (w == "Z") {
                stack.pop()
            } else {
                stack.push(w.toInt())
            }
        }
        for (i in stack) {
            answer += i
        }
        return answer
    }
}

🖊 문제 풀이 시 알면 좋을 것

split

  • 문자열을 공백 기준으로 나눠서 List<String> 반환
"1 2 Z 3".split(" ") 
// ["1", "2", "Z", "3"]

 

mapIndexed

  • 리스트를 순회하면서
  • 인덱스(idx)값(v) 을 동시에 받음
  • ❗ 원래는 새 리스트를 만들기 위한 함수

👉 그런데 여기서는 리턴값을 안 쓰고 있음

list.mapIndexed { ... } // 결과 리스트 버려짐

이건 map의 용도와 맞지 않음
→ 이런 경우는 forEachIndexed가 더 맞음

 


Stack<Int>

Stack = 쌓아 올리는 구조

  • 접시 쌓기 생각하면 됨
  • 마지막에 넣은 것부터 먼저 꺼냄

👉 LIFO (Last In, First Out)
👉 후입선출

 

tack<Int>를 언제 쓰냐면?

가장 최근에 한 작업을 취소해야 할 때
이전 상태로 되돌아가야 할 때
괄호 검사, 실행 취소(Undo), Z 문제

 

이번 문제에서:

  • 숫자 → 스택에 push
  • "Z" → 직전에 더한 숫자 취소 → pop

Stack<Int> 기본 동작

 

동작 의미
push(x) 값 넣기
pop() 마지막 값 꺼내기
peek() 마지막 값 보기
isEmpty() 비었는지

예시

"1 2 Z 3"

 

단계별 처리

입력 스택 상태 설명
"1" [1] 숫자 → push
"2" [1, 2] 숫자 → push
"Z" [1] pop (2 취소)
"3" [1, 3] 숫자 → push

 

최종 합

1 + 3 = 4

 


Kotlin에서 Stack<Int> 쓰는 법

가장 쉬운 방식 (MutableList 사용)

 
val stack = mutableListOf<Int>()

👉 Kotlin에서는 Stack 클래스보다
👉 MutableList를 스택처럼 쓰는 게 일반적


스택 연산 대응

스택 개념 Kotlin 코드
push stack.add(x)
pop stack.removeLast()
peek stack.last()

 문제에 Stack<Int> 적용한 정답 코드

 
class Solution {
    fun solution(s: String): Int {
        val stack = mutableListOf<Int>()

        for (token in s.split(" ")) {
            if (token == "Z") {
                stack.removeLast()
            } else {
                stack.add(token.toInt())
            }
        }

        return stack.sum()
    }
}

sum()

  • Stack<Int> → Iterable<Int>
  • 모든 값 합산
반응형