19. 괄호 회전하기
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
List<Character> list = new ArrayList<>();
for(char c : s.toCharArray()){
list.add(c);
}
for(int i=0; i<list.size(); i++){
Collections.rotate(list, -1);
if(isTrue(list)){
answer++;
}
}
return answer;
}
private boolean isTrue(List<Character> list){
Stack<Character> stack = new Stack<>();
for(char i : list){
if(i == '(' || i == '[' || i == '{'){
stack.push(i);
} else{
if(stack.isEmpty()){
return false;
}
char j = stack.pop();
if((i == ')' && j != '(') ||
(i == ']' && j != '[') ||
(i == '}' && j != '{')){
return false;
}
}
}
return stack.isEmpty();
}
}
<작성한 코드>
메서드 두 개를 작성했다. 첫 번째 메서드에서는 String 형식의 s를 char형으로 변환해서 list에 담아줬다. 그 뒤 forEach문을 사용해 list의 길이만큼 반복시켰고 내부에서는 Collections.rotate(list, -1)을 사용해서 리스트를 왼쪽으로 한 칸씩 이동시켰다. 그 뒤 isTrue(list)를 사용해서 list를 isTrue에 넘긴 뒤 그 값이 true라면 answer에 1을 증가하도록 했다.
ifTrue 메서드에서는 list를 매개변수로 받은뒤 스택 하나를 만들어줬다. 그 뒤 forEach문을 사용해서 i가 (, [, {중 하나이면 stack에 넣었다. 만약 이 셋 중 하나가 아닌데 스택이 비어있다면 바로 false를 반환했다. 비어있지 않다면 변수 j에 stack의 제일 위의 값을 가져온다. 그 뒤 if문으로 조건을 체크했을 때 꺼내온 값이 맞는 짝이 아니라면 false를 반환했다. 마지막에는 stack에 값이 남아있는지 체크하고 남아있다면 false, 비어있다면 true를 반환해 줬다.
20. n^2 배열 자르기
import java.util.*;
class Solution {
public int[] solution(int n, long left, long right) {
int[] answer = new int[(int)(right-left)+1];
List<Integer> list = new ArrayList<>();
for(long i=left; i<=right; i++){
list.add((int)Math.max(i/n, i%n) + 1);
}
for(int i=0; i<answer.length; i++){
answer[i] = list.get(i);
}
return answer;
}
}
<작성한 코드>
answer의 길이는 right-left를 해준 뒤 1을 더해줬다. left, right가 long형이기 때문에 (int)를 사용해서 정수형으로 변환해 사용했다. 그 뒤 list하나를 만들어주고 for문을 통해서 i는 left부터 right까지 반복시켰다. 내부에서는 list에 값을 추가한다. Math.max를 사용해 i/n, i% n 중 큰 값을 찾아 +1을 해서 넣어준다. 행과 열중 큰 값을 넣어주면 되기 때문에 i/n, i% n을 사용했다. 그 뒤 list의 값을 answer에 넣어주고 반환해 줬다.
'프로그래머스 문제풀이 > 알고리즘 (JAVA)' 카테고리의 다른 글
남건욱's 공부기록