[프로그래머스/JAVA] Lv.0 컨트롤 제트

또치·2023년 1월 27일
0

프로그래머스 JAVA

목록 보기
18/20
post-thumbnail

컨트롤 제트

스택 처음 써봤다

Stack<Integer> stack=new Stack<>();
stack.push(); -> 스택에 값 추가 [아래에서부터 쌓인다]
stack.pop(); -> 스택에 값 제거[맨 상단에 값이 제거 된다.]
stack.clear(); -> 스택의 모든 값 제거
stack.peek(); -> 스택의 가장 상단 값 출력
stack.contains(값); -> 스택에 해당 값이 있는지 확인
stack.empty(); -> 해당 스택이 비어있는지 확인
stack.size(); -> 스택의 크기 출력

🎯 문제

숫자와 "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 answer=0;
String[] array=s.split(" ");
List<String> list = Arrays.asList(array);

for(int i=0; i<array.length; i++) {
	if(array[i].equals("Z")) {
		array[i]="0"; array[i-1]="0";
	}
}
for(String str : array) {
	if(!str.equals("0")) {answer+=Integer.valueOf(str);}
}
return answer;

🧵 과정

공백기준으로 split해서 배열로 바꿔주고 Z랑 Z앞에 있는 값을 없애고 남은 값들을 더 해주자고 생각했는데 넣고빼기 쉽게 list에 넣어서 할까했는데 remove 해버리면 인덱스 값이 계속 바껴버려서 안됐다
그래서 그냥 배열 값을 0으로 바꿔주는거로 해서 더해주는거로 답안 내고 끝냈는데...사람들이...스택이란걸 쓰셨어...
그리고 그거 쓰면 내가 고민하던거 다 해결돼...
그래서 다른사람들거 참고해서 한번 다시 풀어봤다.

import java.util.Stack;

class Solution {
    public int solution(String s) {
        int answer=0;
        String[] array=s.split(" ");
        Stack<Integer> stack=new Stack<>();

		for(String str : array) {
        // Z면 제일 마지막에 들어온값 ,즉 Z에 앞에 있던 값을 삭제
			if(str.equals("Z")) {
				stack.pop();
			}else {
            // Z가 아니면 스택에 넣어주기
            // 이렇게 하면 Z랑 Z 앞에 있는 값을 제외하고 나머지값들이 스택에 쌓이게 된다.
				stack.push(Integer.parseInt(str));
			}
		}
		
		for(int i : stack) {
			answer+=i;
		}
        return answer;
    }
}

내가 배열로 하지말고 list에 넣으려고 했던게 인덱스 값 지정해주는게 까다로우니까 였는데 스택에 넣어서 풀면 다 해결이었어
스택은 pop으로 삭제하면 무조건 최근에 들어온 값이 삭제되니까 반복문 돌려서 확인했을때 값이 Z면 그 앞에 들어온 값을 pop 사용해서 삭제시키면 되는거다.

스택
먼저 들어온게 제일 밑에 쌓이고 나중에 들어온게 제일 위로 올라감!
나갈때는 위에서부터 나간다 - LIFO(Last In First Out)

0개의 댓글