반응형
문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/76502
나의 코드
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
// 괄호 쌍을 매핑하는 HashMap 생성
HashMap<Character, Character> map = new HashMap<>();
map.put(']', '[');
map.put('}', '{');
map.put(')', '(');
// 문자열을 회전하며 유효한 괄호인지 확인
A: for (int i = 0; i < s.length(); i++) {
s = s.substring(1) + s.charAt(0); // 문자열 회전
Stack<Character> stack = new Stack<>();
for (char chr : s.toCharArray()) {
if (chr == '[' || chr == '{' || chr == '(') {
stack.push(chr); // 여는 괄호는 스택에 추가
} else {
// 닫는 괄호에 대해 스택 확인
if (stack.isEmpty() || stack.pop() != map.get(chr)) {
continue A; // 유효하지 않으면 다음 회전으로 이동
}
}
}
// 스택이 비어 있으면 유효한 괄호
if (stack.isEmpty()) answer++;
}
return answer;
}
}
핵심 포인트
- "([{)}]"와 같은 경우, 괄호 쌍이 맞지 않음을 고려해야 합니다.
- 문자열을 회전한 후에도 유효성을 확인할 수 있도록 스택 자료구조와 HashMap을 활용했습니다.
- 레이블(label)을 사용하여 반복문 제어를 효율적으로 구현했습니다.
알게 된 점
1. 레이블(Label) 사용법
Java에서 레이블은 반복문 앞에 이름을 붙여 특정 반복문을 제어할 수 있게 해주는 기능입니다. 중첩된 반복문에서 특정 반복문을 건너뛰거나 종료할 때 유용합니다.
레이블명: 반복문 {
...
continue 레이블명; // 지정된 반복문으로 이동
}
2. continue의 동작 방식
기본 continue
- continue만 사용하면, 현재 반복문의 나머지 부분을 건너뛰고 다음 반복으로 이동합니다.
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) continue; // 내부 반복문만 건너뜀
System.out.println("i = " + i + ", j = " + j);
}
}
출력 결과:
i = 0, j = 0
i = 0, j = 2
i = 1, j = 0
i = 1, j = 2
i = 2, j = 0
i = 2, j = 2
레이블과 함께 사용하는 continue
레이블을 지정한 경우, 지정된 반복문의 다음 반복으로 이동합니다.
A: for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) continue A; // 외부 반복문으로 이동
System.out.println("i = " + i + ", j = " + j);
}
}
출력 결과:
i = 0, j = 0
i = 1, j = 0
i = 2, j = 0
j == 1일 때 내부 반복문이 종료되고, 외부 반복문(A 레이블이 붙은 반복문)의 다음 반복으로 이동합니다.
반응형
'알고리즘 > Java' 카테고리의 다른 글
[프로그래머스] 크레인 인형 뽑기 게임 - 64061 (Java) (0) | 2024.11.29 |
---|---|
[프로그래머스] 주식가격 - 42584(Java) (0) | 2024.11.29 |
[프로그래머스] 짝지어 제거하기 - 12973 (Java) (0) | 2024.11.26 |
[프로그래머스] 실패율 - 42889 (Java) (0) | 2024.10.29 |
[백준] 9093. 단어 뒤집기(Java8) (0) | 2023.01.10 |