Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 조합
- 표 편집
- 백준
- 도둑질
- 메뉴 리뉴얼
- Comparable
- 토마토
- 순열
- 요세푸스
- 구현
- 자바
- 괄호 회전하기
- 오블완
- 컴퓨터 구조
- 기능 개발
- 고정소수점
- 베스트 앨범
- swea
- 프로그래머스
- 운영 체제
- java
- 티스토리챌린지
- 코테
- 데이터
- 컴퓨터구조
- 부동소수점
- sw expert academy
- 다단계 칫솔 판매
- Comparator
- Call-by-Value
Archives
- Today
- Total
감자는 아직 꿈을 꾼다.
[프로그래머스] Lv.2 괄호 회전하기 본문
알고리즘 : 스택
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/76502
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
s의 길이는 1 이상 1,000 이하입니다.
스택을 사용하는 전형적인 문제다.
처음에 인자로 전달 받는 문자열에 관해 Deque로 저장하였지만,
문자열을 2배 늘려서 인덱스로 인한 접근으로 하는 풀이도 보았다.
문자열을 그대로 두고 모듈러 연산으로 인덱스에 접근한 풀이가 제일 좋다고 생각한다.
나의 풀이
- ArrayDeque로 인자로 전달 받는 스트링을 저장한다.
- 회전을 구현 시 용이하게 하기 위함
- 매 회전 회차마다 stack으로 확인 수행
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
// 문자열 저장 Deque
ArrayDeque<Character> list = new ArrayDeque<>();
for (char c : s.toCharArray()){
list.addLast(c);
}
// 짝 맞춰놓기
Map<Character,Character> map = new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}','{');
int strSize = s.length();
for (int i = 0;i < strSize;i++){
ArrayDeque<Character> stack = new ArrayDeque<>();
boolean isVaild = true;
for (char target : list){
if (!map.containsKey(target)) stack.push(target);
else {
if (stack.isEmpty()){
isVaild = false;
break;
}
else if (!map.get(target).equals(stack.pop())){
isVaild =false ;
break;
}
}
}
if (isVaild && stack.isEmpty()) answer++;
char temp = list.poll();
list.addLast(temp);
}
return answer;
}
}
좋은 풀이
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
Map<Character, Character> map = new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}','{');
int strSize = s.length();
for (int startIdx = 0; startIdx < strSize;startIdx++){
ArrayDeque<Character> stack = new ArrayDeque<>();
boolean flag = true;
for (int i = startIdx; i < startIdx + strSize; i++ ){
int accessIdx = i % strSize;
char target = s.charAt(accessIdx);
if (!map.containsKey(target)) stack.push(target);
else {
if (stack.isEmpty()){
flag = false;
break;
}
else if (!map.get(target).equals(stack.pop())){
flag = false;
break;
}
}
}
if (flag && stack.isEmpty()) answer++;
}
return answer;
}
}
'코테적 감자 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.3 베스트 앨범 (0) | 2024.11.04 |
---|---|
[프로그래머스] Lv.2 기능 개발 (0) | 2024.11.03 |
[프로그래머스] Lv.3 표 편집 (0) | 2024.11.02 |
[프로그래머스] Lv.2 주식 가격 (1) | 2024.11.02 |
[프로그래머스] Lv.2 방문 길이 (0) | 2024.10.31 |