Today
-
Yesterday
-
Total
-
  • 프로그래머스 : 기능개발
    코딩테스트 문제 풀이/프로그래머스 2023. 11. 20. 00:01

    문제 설명

    내 코드

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

    💪

Designed by Tistory / Custom by 얼거스