오늘의 학습 키워드
- 스택
- 괄호 문자열
- 구현
- 쇠막대
공부한 내용 정리
오늘은 백준 4963번 쇠막대기 문제를 풀었다.
쇠막대기 문제는 괄호 문자열을 해석해 몇 개의 쇠막대기가 잘리는지를 계산하는 문제였다.
()는 레이저를 의미하고, (로 시작해서 )로 끝나는 경우는 쇠막대기의 끝을 나타낸다.
스택을 활용해서 여는 괄호는 무조건 push하고, 닫는 괄호를 만나면 pop하면서 이전 문자가 (였는지 )였는지를 보고 레이저인지 쇠막대기의 끝인지 판단했다.
레이저일 경우 현재 스택에 쌓인 개수만큼 잘리니까 stack.size()를 더하고, 쇠막대기의 끝이면 +1을 해줬다.
소스코드
/*
* 쇠 막대기
* 입력 : 쇠막대기와 레이저의 배치를 나타내는 괄호 표현 (공백 X)
* 출력 : 잘려진 쇠막대기의 총 개수
*/
import java.util.Stack;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력 받기
String input = br.readLine();
// 스택 생성
Stack<Character> stack = new Stack<>();
// 결과 변수 생성
int result = 0;
// 입력 받은 문자열을 하나씩 확인
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
// 여는 괄호일 경우 스택에 추가
if (c == '(') {
stack.push(c);
} else {
// 닫는 괄호일 경우 스택에서 하나 제거
stack.pop();
// 이전 문자가 여는 괄호일 경우 스택의 크기만큼 결과 변수에 더함
if (input.charAt(i - 1) == '(') {
result += stack.size();
} else {
// 이전 문자가 닫는 괄호일 경우 결과 변수에 1 더함
result++;
}
}
}
System.out.println(result);
}
}
오늘의 회고
• 어떤 문제가 있었고, 나는 어떤 시도를 했는지
레이저와 막대기의 끝을 구분하는 게 처음엔 좀 헷갈렸었다. 그냥 괄호쌍만 보고 처리하면 될 줄 알았는데, 이전 문자가 뭔지를 봐야 하는 게 핵심이었던 것 같다.
• 어떻게 해결했는지
input.charAt(i - 1)을 이용해서 직전 문자가 (인지 )인지를 구분해서 로직을 나눴.
• 무엇을 새롭게 알았는지
스택을 단순히 자료 저장 용도로만 쓰는 게 아니라 현재 상태를 판단하는 용도로도 활용할 수 있다는 걸 다시 느꼈다.
특히 괄호 문제에서 자주 등장하는 패턴인 것 같다.
• 내일 학습할 것은 무엇인지
내일은 Queue나 Deque를 활용한 문제를 풀어보려고 한다. 특히 BFS 문제를 연습해봐야겠다.
'99클럽 > 6기' 카테고리의 다른 글
제목: 99클럽 코테 스터디 9일차 TIL - 저울(백준 2437번) (0) | 2025.04.10 |
---|---|
99클럽 코테 스터디 8일차 TIL - 한국이 그리울 땐 서버에 접속하지 (백준 9996번) (0) | 2025.04.09 |
99클럽 코테 스터디 6일차 TIL - 섬의 개수 (백준 4963번) (0) | 2025.04.07 |
99클럽 코테 스터디 5일차 TIL - 수열 (백준 2559번) (0) | 2025.04.04 |
99클럽 코테 스터디 4일차 TIL - 안전영역 (백준 2468번) (0) | 2025.04.03 |