새소식

Programmers Coding Test/Java

[프로그래머스 120853] Java - 코딩테스트 입문 / 컨트롤 제트

  • -

 

 

컨트롤 제트

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

 

1)  문제

숫자와 "Z"가 공백으로 구분되어 담긴 문자열이 주어집니다. 
문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 "Z"가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 
숫자와 "Z"로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.
제한사항
1 ≤ s의 길이 ≤ 200
-1,000 < s의 원소 중 숫자 < 1,000
s는 숫자, "Z", 공백으로 이루어져 있습니다.
s에 있는 숫자와 "Z"는 서로 공백으로 구분됩니다.
연속된 공백은 주어지지 않습니다.
0을 제외하고는 0으로 시작하는 숫자는 없습니다.
s는 "Z"로 시작하지 않습니다.
s의 시작과 끝에는 공백이 없습니다.
"Z"가 연속해서 나오는 경우는 없습니다.

 

 

2)  예시

 

 

Result Table
s result
"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

 

 

 

입출력 예 #1
본문과 동일합니다.


입출력 예 #2
10 + 20 + 30 + 40 = 100을 return 합니다.


입출력 예 #3
"10 Z 20 Z 1"에서 10 다음 Z, 20 다음 Z로 10, 20이 지워지고 1만 더하여 1을 return 합니다.


입출력 예 #4, #5
설명 생략

 

 

 

 

 

 

3)  풀이

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 문자열 s를 매개변수로 하는 solution 메소드를 선언합니다.

solution은 정수를 반환하므로 데이터타입을 int로 합니다.

● public int solution(String s) {

 

 

 

 

3. 제한사항을 확인하고, 만족하지 않을 경우 예외처리합니다.

●     if(1 > s.length() || s.length() > 200){
            throw new IllegalArgumentException("제한사항을 확인하세요");
        }
    

 

 

 

4. 정답이 될 변수 answer를 생성하고 초기화합니다.

문자열 s를 공백마다 나눠서 문자배열 forAdding의 원소로 추가해줍니다.

split메소드를 통해 기준은 " " 공백으로하게됩니다.

●      int answer = 0;
        String[] forAdding = s.split(" ");

 

 

 

 

5. for 반복문을 통해 forAdding 문자배열의 인덱스마다 원소를 확인하여 Z와 동일한지 확인합니다.

Z와 같고 0보다 크다면(i -1이 음수가 되는 것  방지) 이전 인덱스에 해당하는 값을 빼주고,

Z가 아니라면 answer에 그 인덱스에 해당하는 값을 더해줍니다.

 

이 때, forAdding의 각 원소는 문자열이기때문에 정수로 형변환해주어야합니다.

Integer 클래스의 parseInt 메소드를 이용해서 형변환해줍니다.

●    for (int i = 0; i < forAdding.length; i++) {
            if (forAdding[i].equals("Z")) {
                if (i > 0) {
                    answer -= Integer.parseInt(forAdding[i - 1]);
                }
            } else {
                answer += Integer.parseInt(forAdding[i]);
            }
        }
        return answer;
    }
}

 

 

 

 

 

 

 

 

4)  코드

 

class Solution {
    public int solution(String s) {
        if(1 > s.length() || s.length() > 200){
            throw new IllegalArgumentException("제한사항을 확인하세요");
        }
        
        int answer = 0;

        String[] forAdding = s.split(" ");
        
        for (int i = 0; i < forAdding.length; i++) {
            if (forAdding[i].equals("Z")) {
                if (i > 0) {
                    answer -= Integer.parseInt(forAdding[i - 1]);
                }
            } else {
                answer += Integer.parseInt(forAdding[i]);
            }
        }
        return answer;
    }
}

 

 

 

 

 

 

 

5)  느낀점

Integer.parseInt로 형변환해주는 부분이 중요했다고 생각합니다.

 

그리고 다른 사람의 코드를 살펴보다보니 이 문제가 stack을 연습하기에 아주 적절하다고하여

코드를 분석해보았습니다.

 

* stack을 사용한 코드

import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = 0;
        Stack<Integer> stack = new Stack<>();


        String[] words = s.split(" ");
        for (int j = 0; j < words.length; j++) {
            String w = words[j];

            if (w.equals("Z")) {
                stack.pop();
            } else {
                stack.push(Integer.parseInt(w));
            }
        }
        

        Iterator<Integer> iterator = stack.iterator();
        while (iterator.hasNext()) {
            int i = iterator.next();
            answer += i;
        }
        

        return answer;
    }
}

 

stack은 LIFO구조 (Last -in, First -out)로, Z일 경우 pop메소드로 가장 최근에 들어온 값을 제거하고,

Z가 아닐 경우, push 메소드로 값을 가장 최근의 것으로 집어넣습니다.

 

그리고 Iterator 인터페이스를 이용하여 stack 값에 접근할 수 있게하고,

hasNext로 다음 값 여부를 확인하고 있다면 그 값을 answer에 더해주는 식으로 합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.