https://programmers.co.kr/learn/courses/30/lessons/42586?language=java
import java.util.LinkedList;
import java.util.Queue;
import java.util.Iterator;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
Queue<Integer> queue = new LinkedList<>();
//queue.clear();//초기화
//다 배열이야.. 100-진행률 / speeds를 해서 남은 기간을 구한다
// 자바 배열에서 값을 꺼내는 방법
for(int i=0; i<progresses.length; i++){
double temp_days = (double)(100-progresses[i])/speeds[i];
//System.out.println(temp_days);
int remain_days = (int)Math.ceil(temp_days);
queue.add(remain_days);
//System.out.println(remain_days);
}
Iterator iter = queue.iterator();
while(iter.hasNext()){
int result =1;
int temp = queue.peek();
int temp2 = queue.peek();
if(temp >= temp2){
result++;
}
System.out.println(result);
}
return answer;
}
}
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
List<Integer> list = new ArrayList<Integer>();
Queue<Integer> queue = new LinkedList<>();
//queue.clear();//초기화
for(int i=0; i<progresses.length; i++){
double temp_days = (double)(100-progresses[i])/speeds[i];
//System.out.println(temp_days);
int remain_days = (int)Math.ceil(temp_days);
queue.add(remain_days);
//System.out.println(remain_days);
System.out.println("queue>>>> "+queue);
}//for end
for(int i=0; i<=queue.size(); i++){
System.out.println("queue.size() "+queue.size());
System.out.println(i);
System.out.println("queue>>>> "+queue);
int result =1;
int temp = queue.poll();
int temp2 =0;
if(queue.isEmpty()){
System.out.println("다음값 없음");
}else{
temp2 = queue.peek();
}
boolean checked = false;
if(temp2!=0 && temp >= temp2){
while(temp>=temp2){
result++;
temp = queue.poll();
temp2 = queue.peek();
}
list.add(result);
}else{
checked = true;
}
System.out.println("result>>> "+result);
if(checked){
int a =1;
list.add(a);
}//checked end
System.out.println(i);
System.out.println("queue.size() "+queue.size());
}// for end
for(Integer i : list) { //for문을 통한 전체출력
System.out.println("마지막 배열 "+i);
}
// for (int i = 0; i < list.size(); i++) {
// answer[i] = list.get(i);
// }// for end
return answer;
}
}
// 인텔리제이
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class queue {
public static void main(String[] args) {
int[] progresses = {93, 30, 55};
int[] speeds = {1, 30, 5};
int[] answer = Solution.solution(progresses,speeds);
}
}
class Solution {
public static int[] solution(int[] progresses, int[] speeds) {
try {
int[] answer = {};
List<Integer> list = new ArrayList<Integer>();
Queue<Integer> queue = new LinkedList<>();
//queue.clear();//초기화
//다 배열이야.. 100-진행률 / speeds를 해서 남은 기간을 구한다
for(int i=0; i<progresses.length; i++){
double temp_days = (double)(100-progresses[i])/speeds[i];
//System.out.println(temp_days);
int remain_days = (int)Math.ceil(temp_days);
queue.add(remain_days);
//System.out.println(remain_days);
System.out.println("queue>>>> "+queue);
}//for end
for(int i=0; i<=queue.size(); i++){
System.out.println("queue.size() "+queue.size());
System.out.println(i);
System.out.println("queue>>>> "+queue);
int result =1;
int temp = queue.poll();
int temp2 =0;
if(queue.isEmpty()){
System.out.println("다음값 없음");
}else{
temp2 = queue.peek();
}
boolean checked = false;
if(temp2!=0 && temp >= temp2){
while(temp>=temp2){
result++;
temp = queue.poll();
temp2 = queue.peek();
}
list.add(result);
}else{
checked = true;
}
System.out.println("result>>> "+result);
if(checked){
int a =1;
list.add(a);
}//checked end
System.out.println(i);
System.out.println("queue.size() "+queue.size());
}// for end
for(Integer i : list) { //for문을 통한 전체출력
System.out.println("마지막 배열 "+i);
}
// for (int i = 0; i < list.size(); i++) {
// answer[i] = list.get(i);
// }// for end
return answer;
}catch (Exception e){
e.printStackTrace();
throw e;
}
}
}
아...
queue를 공부하자
package com.company;
public class Message {
public String command;
public String to;
public Message(String command, String to){//생성자??
this.command = command;
this.to = to;
}
}
package com.company;
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<Message> mq = new LinkedList<Message>();
mq.offer(new Message("인사","워니"));
mq.offer(new Message("노래","사람1"));
mq.offer(new Message("놀기","사람2"));
mq.offer(new Message("공부","사람3"));
while(!mq.isEmpty()){
Message ms = mq.poll();//꺼냄
switch (ms.command){
case "인사":
System.out.println(ms.to+"는 사람들에게 인사합니다");
break;
case "노래":
System.out.println(ms.to+"는 락 노래를 부릅니다");
break;
case "놀기":
System.out.println(ms.to+"는 먹고 놀고 먹고 놀고");
break;
case "공부":
System.out.println(ms.to+"은 자바 공부합니다");
break;
}
}
}
}
queue에 객체를 담을 수 있구나..
while(!mq.isEmpty())로 반복하는구나..
이 두가지를 사용하면 짧게 만들 수 있겠다.
LinkedList는 뭐지???
ArrayList | LinkedList |
인덱스를 가진다. | 인덱스 없다. 노드의 연결(링크)로 연결됨 |
중간에 데이터를 추가, 삭제 하면 전체 인덱스가 변한다. |
중간에 데이터를 추가, 삭제 해도 전체 인덱스가 변하지 않는다. |
인덱스로 값을 빨리 찾는다 | 처음부터 끝까지.. 순차 탐색을 사용. 탐색 속도가 떨어진다. |
탐색, 정렬 --> 배열 사용해! | 데이터 추가/삭제 많은 경우 --> 연결 리스트 사용해!! |
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
public class linkedList {
public static void main(String[] args) {
//선언 : LinkedList 초기 크기를 미리 생성할 수 없다.
LinkedList list = new LinkedList(); // 타입 미설정 객체로 선언된다 : 비추천
LinkedList<queue> members = new LinkedList<queue>();//타입 설정, queue 객체만 가능
LinkedList<Integer> num = new LinkedList<Integer>();//타입설정, int만 가능
LinkedList<Integer> num2 = new LinkedList<>(); //오른쪽 타입 파라미터 생략
LinkedList<Integer> list2 = new LinkedList<Integer>(Arrays.asList(1, 2, 3)); //생성 시 값 넣음
//값 넣기
list2.addFirst(0);//맨 앞에 데이터 추가
list2.addLast(4);//맨 뒤에 데이터 추가
list2.add(7);//01234
list2.add(0, 5);// index 4에
//값 넣기2
queue q = new queue(0, "wonny");
members.add(q);
members.add(q);
members.add(new queue(1, "hoy"));
members.add(new queue(2, "hoy"));
members.add(new queue(3, "hoy"));
members.add(new queue(4, "hoy"));
members.add(new queue(5, "hoy"));
//값 출력 : for
for (Integer i : list2) {
System.out.println("list2: " + i);
}
//값 출력 : while
Iterator<queue> iter = members.iterator();//iterator 선언
while (iter.hasNext()) {
System.out.println("members: " + iter.next().toString());
}//while end
//값 삭제
members.removeFirst();//맨 앞 제거
members.removeLast();//맨 뒤 제거
members.remove(3);
members.remove();
System.out.println("삭제 후");
//값 출력 : for - get
for(int i=0; i<members.size(); i++){
System.out.println("members>> "+members.get(i));//array보다 느리다
}//for end
System.out.println("검색");
//검색
System.out.println("list2.contains(1)>> "+ list2.contains(1));
System.out.println("list2.indexOf(1)>> "+ list2.indexOf(1));
System.out.println("members.contains(1)>> "+ members.contains(1));//false
System.out.println("members.indexOf(1)>> "+ members.indexOf(1));//-1
System.out.println("members.contains(q)>> "+ members.contains(q));//false
}
}
좋아 LinkedList까지 공부했어
그다음 다시 문제로 돌아가자.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
List<Integer> list = new ArrayList<Integer>();
Queue<Integer> queue = new LinkedList<>();
for(int i=0; i<progresses.length; i++){
double temp_days = (double)(100-progresses[i])/speeds[i];
int remain_days = (int)Math.ceil(temp_days);
queue.add(remain_days);
}//for end
System.out.println("queue>>>> "+queue);
int temp = queue.poll();
int result =1;
while(!queue.isEmpty()){
int temp2 = queue.poll();
if(temp >= temp2){
result++;
}else{
list.add(result);// 달라지는 순간 list에 넣는다
result =1;
temp = temp2;
}
}// while end
list.add(result);//마지막 result=1을 처리한다
System.out.println("list>>>> "+list);
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}// for end
return answer;
}
}
'알고리즘 > 알고리즘' 카테고리의 다른 글
[프로그래머스] 없는 숫자 더하기 (0) | 2021.12.15 |
---|---|
[프로그래머스] 나머지가 1이 되는 수 찾기 (0) | 2021.12.10 |
[백준] 팩토리얼 (0) | 2021.10.14 |
[알고리즘] 시간이 없을 때 (0) | 2021.09.29 |
[프로그래머스][정렬]가장 큰 수 (0) | 2021.09.28 |