import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
Queue<Pair> queue = new LinkedList<>();
int answer = 0;
for(int i = 0; i < priorities.length; i++) {
queue.add(new Pair(i, priorities[i]));
}
while(!queue.isEmpty()) {
int current = queue.peek().value;
boolean flag = false;
for(Pair pair : queue) {
if(pair.value > current) {
flag = true;
break;
}
}
if (flag) { //우선순위가 높은게 있으면 뒤로 보낸다.
Pair temp = queue.poll();
queue.add(temp);
} else {
answer++;
Pair pair = queue.poll();
if(pair.index == location) {
return answer;
}
}
}
return answer;
}
class Pair {
int index;
int value;
public Pair(int index, int value) {
this.index = index;
this.value = value;
}
}
}
import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
// 1. 큰 수가 우선순위를 갖는 우선순위 큐
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
int answer = 0;
//2. 우선순위 큐에 배열값 넣어주기
for (int i = 0; i < priorities.length; i++) {
pq.add(priorities[i]);
}
// 3. 큐의 값이 없어지기 전까지 반복
while (!pq.isEmpty()) {
for (int i = 0; i < priorities.length; i++) {
// 4.만약 큐의 가장 높은 숫자가 배열의 i번째 index값과 같다면
if (priorities[i] == pq.peek()) {
// 5.값과 위치가 모두 같다면 answer 리턴
if (i == location) {
answer++;
return answer;
}
// 6.값만 일치하는 경우 해당 문서 출력
pq.poll();
answer++;
}
}
}
return -1;
}
}
import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
int answer = 0;
Queue<Pair> queue = new LinkedList<>();
for(int i = 0; i < priorities.length; i++) {
queue.add(new Pair(i, priorities[i]));
}
while(!queue.isEmpty()) {
int currnet = queue.peek().value;
boolean flag = false;
for(Pair pair : queue) {
if(pair.value > currnet) { // 현재 값보다 나머지 값이 우선순위가 더 높다면
flag = true;
break;
}
}
if(flag) {
Pair temp = queue.poll();
queue.add(temp);
} else {
// 현재 값이 나머지 값보다 우선순위가 더 높다면 answer++
answer++;
Pair pair = queue.poll();
if(pair.index == location) { // 현재 찾고자 하는 위치이면 출력
return answer;
}
}
}
return answer;
}
class Pair {
int index;
int value;
public Pair(int index, int value) {
this.index = index;
this.value = value;
}
}
}
1번은 그냥 큐로 구현한 것이고, 2번은 우선순위 큐로 구현한 것이다.
문제에 대한 설명을 읽고 직관적으로 큐를 사용해서 구현해야 했다.
큐에 남아있는 값들 중 방금 뽑은 값보다 더 높은 우선순위가 있으면 다시 큐에 넣는 식으로 했다.
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> q = new LinkedList<>();
List<Integer> answerList = new ArrayList<>();
for(int i = 0; i < speeds.length; i++) {
double remain = (100 - progresses[i]) / (double) speeds[i];
int date = (int) Math.ceil(remain); //Math.ceil: 올림
if(!q.isEmpty() && q.peek() < date) { //3 < 5
answerList.add(q.size());
q.clear();
}
q.offer(date);
}
answerList.add(q.size());
int[] answer = new int[answerList.size()];
for(int i = 0; i < answer.length; i++) {
answer[i] = answerList.get(i);
}
return answer;
}
}
import java.util.*;
class Solution {
public String[] solution(String[] record) {
Map<String, String> idMap = new HashMap<>(); // (아이디 - 닉네임) Map
int count = 0; // Change할 때마다 +1 증가
for(int i = 0; i < record.length; i++) {
String [] info = record[i].split(" ");
if(info[0].equals("Leave")) {
continue;
} else if(info[0].equals("Enter")) {
idMap.put(info[1], info[2]);
} else {
idMap.put(info[1], info[2]);
count++;
}
}
String[] answer = new String[record.length - count];
int idx = 0;
for(int i = 0; i < record.length; i++) {
String [] info = record[i].split(" ");
String nickname = idMap.get(info[1]);
if(info[0].equals("Enter")) {
answer[idx++] = nickname + "님이 들어왔습니다.";
} else if(info[0].equals("Leave")) {
answer[idx++] = nickname + "님이 나갔습니다.";
}
}
return answer;
}
}
idMap
이라는 변수에 저장하고, 닉네임을 변경할 때마다 메시지에서 제외할 count를 증가하는 메서드를 구현한다.Map<String, String> idMap = new HashMap<>(); // (아이디 - 닉네임) Map
int count = 0; // Change할 때마다 +1 증가
for(int i = 0; i < record.length; i++) {
String [] info = record[i].split(" ");
if(info[0].equals("Leave")) {
continue;
} else if(info[0].equals("Enter")) {
idMap.put(info[1], info[2]);
} else {
idMap.put(info[1], info[2]);
count++;
}
}
닉네임에 대한 탐색을 마치고 나서 return하기 위해 메시지에 담을 배열인 answer
선언한다.
여기서 닉네임 변경한 것에 대해 채팅방 메시지에 표시되지 않으므로 메시지에서 제외할 count 만큼의 크기로 초기화한다.
배열의 인덱스를 지정할 변수 idx
도 선언한다.
String[] answer = new String[record.length - count];
int idx = 0;
각 값을 공백을 기준으로 split하고, 들어오고 나가는 경우에 대해서만 메시지를 작성하여 저장한다.
닉네임은 아이디를 key를 이용하여 idMap
에서 value를 가져와서 사용한다.
for(int i = 0; i < record.length; i++) {
String [] info = record[i].split(" ");
String nickname = idMap.get(info[1]);
if(info[0].equals("Enter")) {
answer[idx++] = nickname + "님이 들어왔습니다.";
} else if(info[0].equals("Leave")) {
answer[idx++] = nickname + "님이 나갔습니다.";
}
}
HashMap의 개념과 문제를 제대로 이해한다면 충분히 풀 수 있는 문제였다.
해당 문제를 풀면서, HashMap의 개념을 제대로 깊이 이해할 필요가 생겼다는 계기가 되었다.
```java class Solution { public String solution(int n, int t, int m, int p) { StringBuilder convert = new StringBuilder(); StringBuilder answer = new StringBuilder();