알게 된 점
- 괄호 문제는 -> 대부분 stack을 이용한다.
- 원형 문제는 -> queue를 사용한다.
- Java queue 메소드
Queue<Integer>queue=new LinkedList<>();
queue.peek()
queue.poll()
queue.add(3)
while (!queue.isEmpty()) {
}
문제 1 (꼭 다시 풀어보기)
이슈
- 문제를 대입하여 stack을 어떻게 사용할지 모름
- 분기점을 나누어서 간단하게 생각하는 방법이 필요
- 괄호 문제는 Stack 문제라고 생각하고 접근
- 인덱스 접근할때 바로 뒤에꺼를 보려고 하는 방법은 인덱스의 사이즈를 넘기 때문에, 바로 앞에(인덱스)를 보려고 하자
해결 방법
if ‘(‘이면 stack에 push
else ‘)’이면 pop을 하고
if ) 레이저면 **[앞에 인덱스가 '('면 레이저]** -> stack 안에 ‘(‘ 개수를 count하고 answer+count 한다.
else ) 닫는 괄호이기 때문에 stack에 있는 것 1개를 빼주고 answer+1을 더해준다.
코드
public int solution(String str) {
int answer=0;
Stack<Character>stack=new Stack<>();
char arr[]=str.toCharArray();
for (int i=0;i<arr.length;i++) {
char s=arr[i];
if (s=='(') {
stack.push(s);
}
else {
char prev=arr[i-1];
if (prev=='(') {
stack.pop();
answer+=stack.size();
}
else {
stack.pop();
answer+=1;
}
}
}
System.out.println(answer);
return answer;
}
문제 2 (꼭 다시 풀어보기)
이슈
- 원형 문제 -> Queue를 사용한다.
- 이때 핵심은 원형은 뽑은 값을 다시 뒤에 이어 붙여서 원형으로 만드는 것이다! 따라서 Queue를 사용
코드
import java.util.*;
public int solution(int n, int m) {
int answer=0;
Queue<Integer>queue=new LinkedList<>();
for (int i=1;i<=n;i++) {
queue.add(i);
}
while (!queue.isEmpty()) {
for (int i=0;i<m-1;i++) {
queue.offer(queue.poll());
}
queue.poll();
if (queue.size()==1) {
answer=queue.poll();
}
}
System.out.println(answer);
return answer;
}
문제 3
이슈
- queue는 index 접근이 불가능
- 따라서 queue의 for문을 돌때는 for Each를 사용하자
- 자바의 객체지향을 활용하여 queue안에 2개 이상의 인자값을 넣고 싶을때는 class를 만들어서 사용
해결방법
- patient 클래스 만들기 (idx, value)
- Queue안에 patient 인자값 넣기
- Queue에서 뽑은 값과 for문을 돌면서 answer++ 증가하기
코드
class Patient {
int idx;
int value;
public Patient(int idx, int value) {
this.idx = idx;
this.value = value;
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
public int solution(int n, int idx, int[]arr) {
int answer=0;
Queue<Patient>queue=new LinkedList<>();
for (int i=0;i<arr.length;i++) {
Patient patient=new Patient(i,arr[i]);
queue.offer(patient);
}
while (!queue.isEmpty()) {
Patient patient=queue.poll();
int idxx=patient.getIdx();
int values=patient.getValue();
boolean check=true;
int next_idx=0;
int next_value=0;
for (Patient p1:queue) {
next_idx=p1.getIdx();
next_value=p1.getValue();
if (values<next_value) {
check=false;
queue.add(patient);
break;
}
}
if (check) {
answer++;
if (idx==idxx) {
break;
}
}
}
System.out.println(answer);
return answer;
}