programmers.co.kr/learn/courses/30/lessons/42587
스택/큐의 두번째 문제 프린터!
이번 문제는 생각보다 금방 풀기는 했다.
점점 익숙해져가는 내 자신에 뿌듯하기도 하지만 자만하지 말아야지.
내가 약간 고민했던 부분은 매개변수로 주어지는 우선순위의 배열이 int이기 때문에 내가 찾고자 하는 위치의 숫자와 중복된 값이 있을 경우 해당 숫자의 실제 프린트 순서를 찾기 어렵다는 것이었다.
그리하여 아래와 같은 순서대로 알고리즘의 흐름을 만들었다.
1. Character Stack과 List를 별도로 만들어서 우선순위의 배열의 길이만큼 아스키코드를 이용하여 저장해준다.
(이해하기 쉽게 char temp = 65; 부터 시작하여 A부터 저장되게 하였다.)
1-1. 현재 Character Stack에서 location의 위치에 있는 값을 char res변수에 담아준다.
2. 우선순위 배열을 Stack으로 옮기고 스택이 비어있을 때까지 반복한다.
3. 맨 밑에 스택의 숫자를 비교한 후에 작으면 해당 숫자를 push하고 맨 밑에 스택을 삭제하는 식으로 반복한다. (이때 Character Stack도 동일하게 push, remove 해준다.)
4. 만약 숫자가 크다면 해당 숫자를 remove하고 Character Stack의 해당 위치의 값을 list에 add해준다. (이미 add 하면 숫자는 필요없기 때문에 그냥 지워버린다.)
5. 인쇄 대기목록이 완성 되면 해당 리스트의 길이 만큼 반복하여 res와 같은 값을 찾으면 해당 위치의 번지+1을 리턴해준다.
나의 코드:
public class printer {
public static void main(String[] args) {
int[] priorities = {2,1,3,2};
int location = 2;
solution(priorities, location);
}
public static int solution(int[] priorities, int location) {
int answer = 0;
Stack<Integer> print = new Stack<Integer>();
// 우선순위 스택
Stack<Character> printName = new Stack<Character>();
// 우선순위의 문자열 스택 (숫자로는 비교가 어려우니??...)
List<Character> list = new ArrayList<Character>();
// 우선순위의 최종 문자열 리스트
for (int i = 0; i < priorities.length; i++) {
// 우선순위들을 스택에 push해준다.
print.push(priorities[i]);
char name = 0;
name += 65+i;
// 이해하기 쉽게 A부터 순차적으로 넣었다.
printName.push(name);
}
char res = printName.get(location);
// 찾으려는 로케이션의 캐릭터 값
System.out.println(printName);
System.out.println("우선 순위 대기열 : " + print);
while(!print.isEmpty()) {
// 스택이 비어있을 때까지 반복한다.
int temp = print.get(0);
char tempName = printName.get(0);
// 맨 앞의 숫자를 temp와 tempName변수로 선언
if (priorityChk(print, temp)) {
print.push(temp);
printName.push(tempName);
// 현재 temp값을 가장 뒤로 넣는다.
// 현재 tempName값을 가장 뒤로 넣는다.
print.remove(0);
printName.remove(0);
// 그리고 가장 앞에 있는 숫자와 char를 지운다.
} else {
list.add(tempName);
// 현재 temp를 list에 옮겨 담는다.
// 현재 tempName를 list에 옮겨 담는다.
print.remove(0);
printName.remove(0);
// 가장 앞의 숫자를 지운다.
// 그리고 가장 앞에 있는 숫자와 char를 지운다.
}
}
answer = resReturn(list, res);
return answer;
}
public static boolean priorityChk(Stack<Integer> print, int temp) {
// 우선순위인지 아닌지를 판별해주는 메소드
for (int i = 0; i < print.size(); i++) {
if (temp < print.get(i)) {
// 꺼낸 문서의 우선 순위가 뒤의 우선순위 보다 작으면
return true;
}
}
return false;
}
public static int resReturn(List<Character> list, char res) {
// 요청한 문서가 어느 위치에 있는지 찾아주는 메소드
for (int i = 0; i < list.size(); i++) {
if (res == list.get(i)) {
return i+1;
}
}
return 0;
}
}
처리속도는 형편없지만...ㅠ 일단은 내가 빠르게 코드를 작성할 수 있다는 것에 만족하고 있다.
큐를 통해서 간단하게 구현하신 분도 보았는데, 아직 큐를 내가 완벽하게 이해하지 못하고 있다.
오늘도 더 열심히 하자!
[깃허브]
https://github.com/RUCKUSJERRY/practiceOfJava/blob/main/Prs_Pratice/src/com/level02/printer.java
'문제풀이 > 프로그래머스' 카테고리의 다른 글
가장 큰 수 / 프로그래머스 연습문제 / programmers / level2 / 정렬 / JavsScript (0) | 2021.05.10 |
---|---|
다리를 지나는 트럭 / 프로그래머스 연습문제 / programmers / level2 / 스택,큐 / javascript (0) | 2021.05.09 |
기능개발 / 프로그래머스 연습문제 / programmers / level2 / java / 스택,큐 (0) | 2021.05.07 |
위장 / 프로그래머스 연습문제 / programmers / level2 / java (0) | 2021.05.06 |
전화번호 목록 / 프로그래머스 연습문제 / programmers / level2 / java (0) | 2021.05.05 |