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
- 기능 개발
- 프로그래머스
- 코테
- 다단계 칫솔 판매
- 토마토
- sw expert academy
- 백준
- Comparator
- java
- 구현
- 오블완
- 메뉴 리뉴얼
- 베스트 앨범
- Call-by-Value
- 도둑질
- 조합
- 운영 체제
- 컴퓨터구조
- 표 편집
- 자바
- 컴퓨터 구조
- 데이터
- swea
- 부동소수점
- Comparable
- 고정소수점
- 순열
- 요세푸스
- 티스토리챌린지
- 괄호 회전하기
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 |