반응형
문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/120853
문제 설명
문자열 s는 공백으로 구분된 숫자와 명령어 "Z"로 구성되어 있습니다.
- 숫자는 점수로 더해지며, "Z"는 바로 이전에 더했던 점수를 취소합니다.
- 모든 점수의 합을 구하세요.
예제 입력/출력
Input: "1 2 Z 3"
Output: 4 (1 + 3)
나의 코드
1. 기본 접근 방법
문제를 푸는 가장 직관적인 방법은 최근 숫자를 기억하여 "Z"가 등장했을 때 이를 취소하는 방식입니다.
class Solution {
public int solution(String s) {
int answer = 0; // 점수 합
int lastNum = 0; // 최근 숫자 기억
// 공백으로 문자열 분리
for (String str : s.split(" ")) {
if (str.equals("Z")) {
// "Z"가 나오면 최근 숫자 취소
answer -= lastNum;
} else {
// 숫자면 더하고 최근 숫자 갱신
int num = Integer.parseInt(str);
answer += num;
lastNum = num;
}
}
return answer;
}
}
2. Stack 활용
import java.util.*;
class Solution {
public int solution(String s) {
Stack<Integer> stack = new Stack<>(); // 숫자를 저장할 스택
// 공백으로 문자열 분리
for (String str : s.split(" ")) {
if (str.equals("Z")) {
// "Z"가 나오면 최근 숫자 제거
if (!stack.isEmpty()) {
stack.pop();
}
} else {
// 숫자면 스택에 추가
stack.push(Integer.parseInt(str));
}
}
// 스택에 남은 숫자의 합 계산
int answer = 0;
for (int num : stack) {
answer += num;
}
return answer;
}
}
두 가지 접근 방식 비교
방식 | 장점 | 단점 |
기본 접근 방식 | 간단하고 추가 메모리 사용이 적음 | 논리를 데이터 구조로 표현하기 어려움 |
Stack 활용 방식 | 문제의 "최근에 추가한 숫자 제거" 동작이 직관적으로 표현 가능 | 추가 메모리 사용(Stack) |
시간 복잡도
두 풀이 모두 공백 기준으로 문자열을 순회하므로 시간 복잡도는 동일하게 O(n)입니다. 스택 사용 방식은 추가 메모리를 사용하므로 공간 복잡도가 약간 더 높아질 수 있습니다.
결론
- 간결하고 빠른 구현이 목표라면 기본 접근 방식을 사용하는 것이 적합합니다.
- 문제를 자료구조적으로 풀어내거나 확장 가능성을 염두에 둔다면 Stack 활용 방식을 추천합니다.
문제의 조건과 요구사항에 따라 적절한 방식을 선택해 사용하면 좋을 것 같습니다! 😊
반응형
'알고리즘 > Java' 카테고리의 다른 글
[프로그래머스] 기능 개발 - 42586 (Java) (0) | 2024.12.24 |
---|---|
[백준] 1158. 요세푸스 문제 (Java8) - ArrayDeque 활용 (0) | 2024.12.20 |
[프로그래머스] 같은 숫자는 싫어 - 12906 (Java) (0) | 2024.12.17 |
[프로그래머스] 표 편집 - 81303 (Java) (0) | 2024.12.13 |
[프로그래머스] 크레인 인형 뽑기 게임 - 64061 (Java) (0) | 2024.11.29 |