프로그래머스 : 기능개발

김아무개·2023년 3월 14일
0

프로그래머스

목록 보기
2/41

문제 설명

내 코드

class Solution {
    public static int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        
        for (int i = 0; i < progresses.length; i++) {
            progresses[i] = ((100 - progresses[i]) % speeds[i] == 0) ? (100 - progresses[i]) / speeds[i] : (100 - progresses[i]) / speeds[i] + 1;
        }
        
        int cnt = 0;
        for (int i = 0; i < progresses.length; i++) {
            if (progresses[i] == 0) continue;
            
            cnt++;
            for (int j = i + 1; j < progresses.length; j++) {
                if (progresses[j] < progresses[i]) progresses[j] = 0;
                else progresses[j] -= progresses[i];
            }
            progresses[i] = 0;
            
            for (int j = i; j < progresses.length; j++) {
                if (progresses[j] > 0) break;
                progresses[i]++;
            }
        }

        answer = new int[cnt];
        cnt = 0;
        for (int i = 0; i < progresses.length; i++) {
            if (progresses[i] > 0) answer[cnt++] = progresses[i];
        }
        return answer;
    }
}

✏️

class Solution {
    public static int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        
        // 각각 작업 소요 기간으로 덮어쓰기
        for (int i = 0; i < progresses.length; i++) {
        	
            // 100 - progresses[i] = 100% - 작업_진행_진도율
            // (100 - progresses[i]) % speeds[i] = n.n일을 찾기 위함! n.n일이면 +1
            progresses[i] = ((100 - progresses[i]) % speeds[i] == 0) ? (100 - progresses[i]) / speeds[i] : (100 - progresses[i]) / speeds[i] + 1;
        }
        
		// 배포되는 날짜 카운팅 
        int cnt = 0;
        for (int i = 0; i < progresses.length; i++) {
        	// (progresses[i] == 0)이면 배포할게 없는 작업(이미 배포됨)
            if (progresses[i] == 0) continue;
            
            // 위에 if문을 지나서 여기로 온거면 배포할게 있는날로, cnt += 1
            cnt++;
            
            // j는 i+1부터 마지막작업일까지 체크
            // 왜냐하면 0 ~ i-1 까지는 이미 배포 확인된 작업이고
            // i는 남은 작업일의 작업완료일을 계산해야하기 때문에, 
            // 이번 for문에서 함께 계산해버리면 뒷부분을 계산할 수 없다. 그래서 j = i + 1
            for (int j = i + 1; j < progresses.length; j++) {
            	
                // j 작업의 완료일이 i작업의 완료일보다 적으면 
                // i 작업의 배포가 완료될때 함께 완료될수있으므로 0 줌
                if (progresses[j] < progresses[i]) progresses[j] = 0;
                else progresses[j] -= progresses[i];
                // else 면 j 작업의 완료 소요일이 i 작업보다 긴것으로,
                // j 작업 소요일수에서 i작업 소요일수를 빼줌 
                // 왜냐하면 모든 작업은 큐가 돌아가는날 다같이 카운팅되니깐!
            }
            
            // i일이 배포되는동안 나머지 작업의 배포 상태 계산을 완료한 상태이기때문에
            // i일도 0 줌
            progresses[i] = 0;
            
            // 아래 for문은 i가 배포완료된 날 함께 완료된 다른 작업물의 수량을 세기 위함
            // 해당 작업인 i가 이미 0으로 초기화 되었기 때문에,
            // for문은 i부터 작업이 아직 안끝난(j > 0) 것을 만날때까지 +1 해줌  
            for (int j = i; j < progresses.length; j++) {
                if (progresses[j] > 0) break;
                progresses[i]++;
            }
        }

		// 아래는 결과를 담을 answer 배열을 만들고 값을 옮기는 작업
        answer = new int[cnt];
        cnt = 0;
        for (int i = 0; i < progresses.length; i++) {
            if (progresses[i] > 0) answer[cnt++] = progresses[i];
        }
        return answer;
    }
}

💪

profile
Hello velog! 

0개의 댓글