컨트롤 제트

Wook·2024년 9월 20일

🧩코딩테스트

목록 보기
36/46
post-thumbnail

문제

숫자와 "Z"가 공백으로 구분되어 담긴 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 "Z"가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 "Z"로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.

조건

  • 1 ≤ s의 길이 ≤ 200
  • -1,000 < s의 원소 중 숫자 < 1,000
  • s는 숫자, "Z", 공백으로 이루어져 있습니다.
  • s에 있는 숫자와 "Z"는 서로 공백으로 구분됩니다.
  • 연속된 공백은 주어지지 않습니다.
  • 0을 제외하고는 0으로 시작하는 숫자는 없습니다.
  • s는 "Z"로 시작하지 않습니다.
  • s의 시작과 끝에는 공백이 없습니다.
  • "Z"가 연속해서 나오는 경우는 없습니다.

예시

sresult
"1 2 Z 3"4
"10 20 30 40"100
"10 Z 20 Z 1"1
"10 Z 20 Z"0
"-1 -2 -3 Z"-3

풀이

  • 먼저, 문자열에 담긴 각각의 숫자를 int형으로 변환하려면 공백을 기준으로 잘라서 배열에 보관해야 한다 -> split(regex) 사용
  • 연산값을 저장하기 위해 int형 변수를 선언한다
  • for문을 통해 배열의 각 요소를 돌면서 "Z"가 있다면 Z기준 왼쪽 인덱스의 값을 빼주고, 그 외의 경우 int 타입으로 변환해 더한다 -> Integer.parseInt(String)
  • 문제의 제목에서 힌트가 있듯이, 컨트롤 Z는 되돌리기를 의미한다.
  • Z 이전의 값을 뺀다고 생각하면 Stack구조를 떠올릴 수 있다!
  • Queue와 Stack의 기능을 모두 포함하는 유연한 자료구조로 Deque를 사용했다.

코드

class Solution {
    public int solution(String s) {
        int answer = 0;
        String[] array = s.split(" ");
        
        for(int i = 0; i < array.length; i++){
            if(array[i].equals("Z")){
                answer -= Integer.parseInt(array[i-1]);
            } else {
                answer += Integer.parseInt(array[i]);
            }
        }
        
        return answer;
    }
    
    public int solution2(String s) {
        Deque<Integer> deque = new ArrayDeque<>();
        int answer = 0;

        for (String str : s.split(" ")) {
            if (str.equals("Z")) {
                deque.pop();
            } else {
                deque.push(Integer.parseInt(str));
            }
        }

        for (Integer i : deque) {
            answer += i;
        }

        return answer;
    }
}
profile
Keep going

0개의 댓글