자바 초급문제로 맨땅에 해딩하기

자바 Level 2 문제, 3. 기능개발 진행 완성

Jungsoomin :) 2020. 4. 24. 23:30

프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/42586)

자바 Level 2 문제의 기능개발 이다.

 

/*문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한 사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.

  • 작업 진도는 100 미만의 자연수입니다.

  • 작업 속도는 100 이하의 자연수입니다.

  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.*/

Stack으로 로직을 구상하다가 자꾸만 List와 겹치게 되었다. 개인적인 사용능력의 부족이라는 생각이 많이드는 순간이 많이 들어서 아예 List를 쓸거면 List만 쓰기로 마음을 먹게되었다. 그대로 짜내려가다가는 전에 쓰던 그대로 로직이 만들어 질 것 같아서 점수가 아니라 날짜로 계산을 해보면 어떨지 한번 구상하며 시작되었던 것 같다.

 

두가지 경우가 존재했다. (100 - progresses[i])%speeds[i]) 값이 딱 맞아 떨어질때와 소수점으로 떨어질 경우였다. 

(100- progresses[i])/speeds[i];이냐 (100- progresses[i])/speeds[i]+1; 이냐의 차이를 결정하게 만들었고, 그렇게 프로젝트 완성날짜의 값을 가진 List를 확보하게 되었다.

 

그다음은 첫수를 대입하고 다시 옮겨가는 for문인데 이 로직을 짜는 과정에서 많이 어려워했다. remove()메서드 없이 사용할 수 있는 방법은 무엇인가, for문으로 돌리면 안되나..하면서 생각을 하는데

 

친구가 문제관련해서 이런 문제가 있는데 자바로 코드를 짜서 보내줬으면 좋겠다. 라고 하기에  "이렇게짜면 되지않을까" 하는 과정에서 for문이 가장 난이도가 어렵다는 이야기를 해준게 기억나서 for문을 보다 더 유려하게 사용할 수 있는 방법을 배우고 싶었다. 문제를 접할때마다 for문은 늘 사용하고, for문의 사용 방법이 정말 다양하다는 것을 많이 느껴왔어서 "for문으로 끝내겠다." 하고서는 for문을 가지고 공책에 계속 적어내려가기만 했다. 그렇게 시간을 보내고서야 타이핑을 시작한 것 같다.

 

일단 dayCount 라는 변수에 첫값을 넣고 1부터 돌아가는 for문에 같은 수가 있다면 check를 증가시키나 다른 수를 발견하게 된다면 흐름을 끊고 dayCount에 list.get(i)값을 집어넣게 만들었다. 이렇게 해야 for문이 돌아가는 한정적인 흐름에서 계속 이어나갈 수 있겠다라는 생각이 들었기 때문이었다. 그러다보니 마지막 수까지 포함되어 끝나는 경우를 계산하지 못했다. 그럼 for문을 탈출해도 check는 초기화되지 않을테니까 answerList에 추가하면 되는게 아닐까...하면서 출력 값을 받아본 것 같다.

 

속도, 로직, for문을 가지고 이렇게 저렇게 고려하니 생각할 바가 늘어났는지 여러 상황들이 머릿 속에서 떠돌았던게 문득 스쳐지나가는데..다행히 방법을 찾아낸 것에 정말 감사할따름이다. 정말 ..이건 고마운 문제라고 해야 말이 맞아떨어질 듯 하다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package programmers_기능개발;
 
import java.util.ArrayList;
import java.util.List;
 
public class subClass01 {
    public int[] solution(int[] progresses, int[] speeds) {
        int  days =0;//날짜 순번을 무시하지말자
        //뺀 값이 맞으면 day, 안맞으면 소수점 넘기고 +1해야함
        int dayCount =0;
        int check=1;//완료된 프로젝트
        
        
        List<Integer> list = new ArrayList<Integer>();
        List<Integer> answerList = new ArrayList<Integer>();
        for(int i=0; i<progresses.length;i++) {
            if( (100 - progresses[i])%speeds[i] == 0 ) {
                days = (100- progresses[i])/speeds[i];//대입 
            }else {
                days = (100-progresses[i])/speeds[i] + 1;//소수점 넘기고 하루 추가
            }
            list.add(days);
        }//프로젝트 완료 날짜 리스트 완성
        
        dayCount = list.get(0);
        for(int i=1;i<list.size();i++) {
            if(list.get(i) <= dayCount) {//첫수보다 작거나 같다면 같이 나가야하는 프로젝트
                check++;
                //2
                }else {//끊기면 집어넣고 첫 수를 다시 끊긴 값으로 대입하고 check는 초기화시킴
                    answerList.add(check); dayCount = list.get(i); check=1;}
        }answerList.add(check);//마지막 수를 포함해서 한꺼번에 끝날 수의 대한 고려
        
            
            int[] answer = new int[answerList.size()];
            for(int i=0; i<answerList.size();i++) {
                answer[i] = answerList.get(i);
                //System.out.println(answer[i]);
            }
            
        return answer;
    }
}
 
cs