쥬로그
Programmers 코딩테스트 고득점 Kit - 스택/큐 본문
반응형
기능개발
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
List<Integer> list = new ArrayList<>();
int[] day = new int[progresses.length];
for(int i = 0; i < progresses.length; i++){
day[i] = (100 - progresses[i]) / speeds[i];
if((100 - progresses[i]) % speeds[i] != 0){
day[i] += 1;
}
}
int prev = day[0];
int count = 1;
for(int i = 1; i < day.length; i++){
if(prev < day[i]){
list.add(count);
count = 1;
prev = day[i];
} else {
count++;
}
}
list.add(count);
int[] answer = new int[list.size()];
for(int i = 0; i < list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
}
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++) {
// System.out.println("for문 index "+i);
double remain = (100 - progresses[i]) / (double) speeds[i];
// 나머지가 있을 경우 + 1 day 해야하므로 double로 형변환, Math 올림 함수 사용하여 date 계산
int date = (int) Math.ceil(remain);
if (!q.isEmpty() && q.peek() < date) {
// System.out.println("if문 1 "+q.peek());
// queue에 date가 들어있을 경우 값 비교 후 계산한 date보다 작으면
// list에 개수 추가, 큐 비우기
answerList.add(q.size());
q.clear();
// System.out.println("if문 2 "+q.peek());
}
// 큐가 비워져 있는 경우 큐에 date 추가하기
q.offer(date);
// Iterator iter = q.iterator();
// while(iter.hasNext()) {
// System.out.println(i + "번째 que 전체" + iter.next());
// }
}
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;
}
}
더보기
Reference )
프린터
import java.util.*;
class Solution {
class Task{
int location;
int priority;
public Task(int location, int priority){
this.location = location;
this.priority = priority;
}
}
public int solution(int[] priorities, int location) {
int answer = 0;
Queue<Task> task = new LinkedList<>();
for(int i = 0; i < priorities.length; i++){
task.add(new Task(i, priorities[i]));
}
int now = 0;
while(!task.isEmpty()){
// 큐 맨 앞에 있는 task 꺼내서 cur에 저장
Task cur = task.poll();
boolean flag = false;
for(Task t : task){
// cur의 priority와 큐의 priority 비교
if(t.priority > cur.priority){
flag = true;
}
}
if(flag){ // 현재 priority보다 큐 맨 앞에 있는 priority가 클 때 cur를 task 뒤에 추가하기
task.add(cur);
} else { // 현재 priority가 큐 맨 앞에 있는 priority보다 클 때 now++
now++;
// cur의 location이 location가 동일하면 now 출력하기
if(cur.location == location){
answer = now;
break;
}
}
}
return answer;
}
}
public int solution(int[] priorities, int location) {
int answer = 0;
int l = location;
Queue<Integer> que = new LinkedList<Integer>();
for(int i : priorities){
// que에 priorities 값 넣기
que.add(i);
}
Arrays.sort(priorities); // priorities 오름차순 정렬
int size = priorities.length-1; // 가장 우선순위 높은 index
while(!que.isEmpty()){
Integer i = que.poll(); // 처음 값 꺼내기
if(i == priorities[size - answer]){ // i와 우선순위 높은 값 비교
answer++;
l--;
if(l <0)
break;
}else{
que.add(i);
l--;
if(l<0)
l=que.size()-1;
}
}
return answer;
}
다리를 지나는 트럭
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Integer> que = new LinkedList<>();
int tol = 0;
int time = 0;
for(Integer truck : truck_weights){
while(true){
if(que.isEmpty()){
// 다리에 트럭이 한 대도 없을 때
que.add(truck);
tol += truck;
time++;
break; // 여기서 끊어줘야 next index로 for문 돌릴 수 있음
} else if(que.size() == bridge_length){
tol -= que.poll();
} else {
if(tol + truck <= weight){
que.add(truck);
tol += truck;
time++;
break;
} else {
que.add(0);
time++;
}
}
}
}
return time + bridge_length;
}
}
import java.util.*;
class Solution {
class Truck {
int weight;
int move;
public Truck(int weight) {
this.weight = weight;
this.move = 1;
}
public void moving() {
move++;
}
}
public int solution(int bridgeLength, int weight, int[] truckWeights) {
Queue<Truck> waitQ = new LinkedList<>();
Queue<Truck> moveQ = new LinkedList<>();
for (int t : truckWeights) {
waitQ.offer(new Truck(t));
}
int answer = 0;
int curWeight = 0;
while (!waitQ.isEmpty() || !moveQ.isEmpty()) {
answer++;
if (moveQ.isEmpty()) {
Truck t = waitQ.poll();
curWeight += t.weight;
moveQ.offer(t);
continue;
}
for (Truck t : moveQ) {
t.moving();
}
if (moveQ.peek().move > bridgeLength) {
Truck t = moveQ.poll();
curWeight -= t.weight;
}
if (!waitQ.isEmpty() && curWeight + waitQ.peek().weight <= weight) {
Truck t = waitQ.poll();
curWeight += t.weight;
moveQ.offer(t);
}
}
return answer;
}
}
주식가격
import java.util.*;
class Solution {
public int[] solution(int[] prices) {
int[] ans = new int[prices.length];
Stack<Integer> stack = new Stack();
for (int i = 0; i < prices.length; i++) {
while (!stack.isEmpty() && prices[i] < prices[stack.peek()]) {
// System.out.println("stack.peek "+stack.peek() + " prices[i] " + prices[i]);
ans[stack.peek()] = i - stack.peek();
stack.pop(); // 답을 구했기 때문에 stack에서 제거한다
}
stack.push(i);
}
while (!stack.isEmpty()) { // 값을 구하지 못한 index == 끝까지 가격이 떨어지지 않은 주식
ans[stack.peek()] = prices.length - stack.peek() - 1;
stack.pop();
}
return ans;
}
}
class Solution{
public int[] solution(int[] prices){
int[] answer = new int[prices.length];
for(int i = 0; i < prices.length; i++){
for(int j = i; j < prices.length; j++){
answer[i]++;
if(prices[i] > prices[j]){
break;
}
} // end j for문
} //end i for문
}
}
반응형
'Algorithm > Programmers' 카테고리의 다른 글
Programmers 코딩테스트 고득점 Kit - 힙 (0) | 2022.06.02 |
---|---|
Programmers 코딩테스트 고득점 Kit - 정렬 (0) | 2022.06.01 |
Programmers 코딩테스트 고득점 Kit - 해시 (0) | 2022.06.01 |
Programmers SQL 고득점 Kit - String, Date (MySQL) (0) | 2022.05.31 |
Programmers SQL 고득점 Kit - JOIN (MySQL) (0) | 2022.05.31 |