티스토리 뷰

그렇게 높은 난이도라고 생각하지 않았다. 배포가 가능해지는 날까지의 기간들을 Queue에 넣고 다음 작업의 기간과 비교하며 해당 작업을 빼내고 day에 배포한 기능의 수를 더해주는 방식으로 코드를 짰다. 

Code:

package com.choonham;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

class Solution {
	public ArrayList<Integer> solution(int[] progresses, int[] speeds) {
		ArrayList<Integer> answer = new ArrayList<>();
		ArrayList<Integer> list = new ArrayList<>();
		int n = 0;
		int days = 0;
		int adds = 1;
		boolean toggle = true;
		for (int i = 0; i < progresses.length; i++) {
			if ((100 - progresses[i]) % speeds[i] == 0) {
				n = (100 - progresses[i]) / speeds[i];

			} else {
				n = (100 - progresses[i]) / speeds[i] + 1;
			}
			list.add(n);
		}
		
		while (toggle) {
			for (int i = 1; i <= list.size()-1; i++) {
				if (list.get(0) >= list.get(i)) {
					adds++;
				} else {
					answer.add(adds);
					adds = 1;
					if(i == 1) list.remove(0);
					else {
						for(int j = i; j >0;j--) list.remove(j);
						if(list.size() == 1) {
							toggle = false;
							answer.add(adds);
						}
					}
					break;
				}
				if(i == list.size()-1) {
					toggle = false;
					answer.add(adds);
				}
			}
		}

		return answer;
	}
}

3개의 테스트 케이스를 만들어 테스트를 했고 당연히 통과할 줄 알았으나..

결과는 처참했다.

정확도가 박살이 났다... 근데 문제는 더 이상의 테스트 케이스를 얻을 수가 없어서 원인을 모르겠다는 것....

 

다시 코드를 지우고 이번엔 linkedList를 사용하여 getLast 함수로 마지막 값을 저장받고, 마지막 값보다 작은 작업을 만났을 때는 앞의 작업과 함께 묶어 결과 리스트에 +1을 해주는 방식으로 작성했다. 

 

Code:

package com.choonham;


import java.util.LinkedList;

class Solution {
	public int[] solution(int[] progresses, int[] speeds) {
		LinkedList<int[]> list = new LinkedList<>();
		int n = 0;
		int max = 0;
		int adds = 1;
		
		for (int i = 0; i < progresses.length; i++) {
			if((100-progresses[i])/speeds[i] % speeds[i] == 0)  n = (100-progresses[i])/speeds[i] ;
			else n = (100-progresses[i])/speeds[i]++;
			if(n > max) {
				max = n;
				list.add(new int[] {1});
			} else {
				list.getLast()[0]++;
			}
		}
		int m = list.size();
		int[] answer = new int[m];
		
		for (int i = 0; i < m; i++) {
			answer[i] = list.pollFirst()[0];
		}
		
		return answer;
	}
}

아오.... 테스트 케이스 11이 뭔지나 알면 이렇게 답답하진 않을텐데... 도무지 모르겠다...

 

아마 초반에 소요 작업 일수를 전부 미리 받아 큐에 저장하는데서 문제가 발생하는 것 같아서 코드를 다시 지우고, 수학적으로 접근하는 것이 아닌, 좀 더 직관적인 구현 방식으로 접근했다. 연결 리스트에 남은 작업량과 속도를 같이 정수 배열로 넣어 놓고 배포 가능 여부를 판단하여 무한 루프에서 빠져나오는 방식으로 진행했다. 

Code:

package com.choonham;


import java.util.ArrayList;
import java.util.LinkedList;

class Solution {
	public ArrayList<Integer> solution(int[] progresses, int[] speeds) {
		LinkedList<int[]> list = new LinkedList<>();
		ArrayList<Integer> answer = new ArrayList<>();
		
		for(int i = 0; i < progresses.length; i++)   //연결 리스트에 작업 속도와 작업 현황을 넣는다.
			list.add(new int[] {progresses[i], speeds[i]});
		
		while(list.size() > 0) {
			for(int[] tempArray : list) {    //작업 속도를 현황에 더해주는 작업
				tempArray[0] += tempArray[1];
			}
			
			if(list.get(0)[0] >= 100) {  // 배포 준비가 완료 되었을 때
				int n = 0;
				for(int i = 0; i < list.size(); ) { //더 이상 작업이 남아있지 않을 때까지 반복
					if(list.get(i)[0] >= 100)   { //그 다음 작업도 배포 준비가 완료 됐다면
						list.remove();    //배포
						n++;   //같은 일자에 배포된 것이므로 카운트 증가
					} else { // 배포 불가능이라면
						break;
					}
				}
				answer.add(n);
			}
		}
		return answer;
	}
}

이걸 짜다가 깨달은 게 하나 있는데, line 22에서 처럼 어차피 리스트의 길이는 배포가 완료되면 줄어들기 때문에 굳이 for문 마지막 연산이 필요가 없다. (아마 처음 짰던 코드는 이 구간에서 문제가 있었던 것 같다.)

아무튼, 위와 같이 작성하면

드디어, 테스트 케이스 11의 지옥에서 벗어날 수 있다. 근데 진짜로 두번째 코드가 훨씬 좋아보이긴 하는데, 왜 틀린지는 미스테리다...ㅎㅎ

 

아무튼 끝!

Comments