-
[Algorithm] 프로그래머스 Lv2 프린터 (42587)Etc./Algorithm 2021. 2. 17. 17:37
안녕하세요 rosepurple입니다 :)
오늘 푼 알고리즘 문제 풀이를 작성해보도록 하겠습니다!
문제
오늘은 아래 문제를 풀어봤습니다. (약 40분 소요)
https://programmers.co.kr/learn/courses/30/lessons/42587?language=java
풀이
문제에 나와있는 아래 순서대로 알고리즘을 작성했습니다.
1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.입력값인 priorities는 우선순위만 적혀있어서 큐 역할을 할 ArrayList를 선언해서 사용했습니다.
// 초기화 ArrayList<Integer> locationArray = new ArrayList<>(); for (int i = 0; i < priorities.length; i++) { locationArray.add(i); }
priorities의 길이만큼 ArrayList에 인덱스 넘버를 저장해서 초기화해줬습니다.
ArrayList 사용 이유?
- 배열을 사용하려면 맨 앞의 문서가 가장 뒤로 이동하기 위해 나머지 문서들을 한 칸씩 이동시켜야 했습니다.
- 삭제와 추가가 용이한 ArrayList를 사용했습니다.
locationArray를 선언해준 이후에 while문으로 반복해가며 answer을 1씩 추가해줬습니다.
int max = Arrays.stream(priorities).max().getAsInt(); int first = locationArray.get(0);
우선 가장 높은 우선순위를 max로 선언하고, 맨 앞의 문서 인덱스를 first로 선언해주었습니다.
if (priorities[first] == max) { answer++; if (first == location) { break; } priorities[first] = -1; locationArray.remove(locationArray.get(0)); }
해당 인덱스에 있는 우선순위가 가장 큰 우선순위라면, 출력 순서인 answer 프로퍼티를 1씩 증가시킵니다.
만약 출력하는 인덱스가 인자로 주어진 location과 동일하다면 while문을 탈출합니다.
위의 경우가 아니라면 해당 인덱스의 우선순위를 -1로 변경하고, 인덱스 배열에서 첫 번째 문서를 삭제합니다.
else { locationArray.remove(locationArray.get(0)); locationArray.add(first); }
맨 처음 문서 인덱스의 우선순위가 가장 큰 우선순위가 아니라면 인덱스 배열에서 삭제한 후에 제일 마지막에 다시 추가합니다.
전체 코드
class Solution { public int solution(int[] priorities, int location) { int answer = 0; // 초기화 ArrayList<Integer> locationArray = new ArrayList<>(); for (int i = 0; i < priorities.length; i++) { locationArray.add(i); } while (true) { int max = Arrays.stream(priorities).max().getAsInt(); int first = locationArray.get(0); if (priorities[first] == max) { answer++; if (first == location) { break; } priorities[first] = -1; locationArray.remove(locationArray.get(0)); } else { locationArray.remove(locationArray.get(0)); locationArray.add(first); } } return answer; } }
마무리
일주일에 6일 정도를 꾸준하게 알고리즘을 풀어보려고 합니다.
Lv3 문제들만 풀다 보니까 너무 어려워서 시간도 오래 걸리고 스트레스도 받더라고요.
그래서 월화수목은 Lv2 문제를 풀고, 금토는 Lv3 문제를 푸는 방식으로 해나가려고 합니다.
이번 포스팅도 읽어주셔서 감사합니다. :)
'Etc. > Algorithm' 카테고리의 다른 글
[Algorithm] 프로그래머스 Lv2 주식가격 (42584) (0) 2021.02.23 [Algorithm] 프로그래머스 Lv2 기능개발 (42586) (0) 2021.02.19 [Algorithm] 프로그래머스 Lv2 조이스틱 (42860) (0) 2021.02.19 [Algorithm] 알고리즘 풀이 작성 시작! (2) 2021.02.17 [Algorithm] BFS 연습하기 (0) 2020.09.11