본문 바로가기

알고리즘/알고리즘

[프로그래머스] 기능개발

https://programmers.co.kr/learn/courses/30/lessons/42586?language=java 

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

 

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;
        }

    }
}

inteliJ에서는 됨

아...

 

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
인덱스를 가진다. 인덱스 없다. 노드의 연결(링크)로 연결됨
중간에 데이터를 추가, 삭제 하면
전체 인덱스가 변한다.
중간에 데이터를 추가, 삭제 해도 전체 인덱스가 변하지 않는다.
인덱스로 값을 빨리 찾는다 처음부터 끝까지.. 순차 탐색을 사용. 탐색 속도가 떨어진다.
탐색, 정렬 --> 배열 사용해! 데이터 추가/삭제 많은 경우 --> 연결 리스트 사용해!!

 

https://codingdog.tistory.com/entry/java-toString-%EB%A9%94%EC%84%9C%EB%93%9C-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EC%A0%95%EB%B3%B4%EB%A5%BC-%EC%B6%9C%EB%A0%A5%ED%95%9C%EB%8B%A4

 

java toString 메서드 : 객체의 정보를 출력한다.

 java의 toString 메서드는, 객체의 정보를 리턴하는 역할을 합니다. 사실 이 부분에 대해서 저는 별로 중요하게 생각을 하지는 않았습니다. 이걸 보면 아직도 멀었다는 생각이 듭니다. 하여튼, Objec

codingdog.tistory.com

 

 

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;
}
}

오예