매일 매일, 차곡 차곡 쌓기



완벽하지 않은 것을 두려워 말며,
완성도를 높히는데 집중하자.

알고리즘

프로그래머스 Lv2 - 과제 진행하기

blockbuddy93 2024. 2. 8. 16:21

문제

https://school.programmers.co.kr/learn/courses/30/lessons/176962

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 시간 : 대략 180분..

시도 횟수 : 3

복기

문제만 꼼꼼히 읽으면, 쉽게 풀 수 있는 단 순 구현 문제 였다. 만, 구현하는데 오랜 시간이 걸렸다.

 

1. 시계열 데이터를 다루는데 오래 걸렸다. 다음에는 좀 더 빠륵 ㅔ풀자

1.1 정렬의 어려움 String으로 LocalTime 으로 만들고 Comparator 로 정렬하고 그랬는데, 그냥 Comparator 로 시계열을 정렬할 수 있었다. 

1.2. Stirng으로 parsing해서 LocalTime을 만들었는데, DateTimeFormaater 로 쉽게 LocalTtime으로 만들 수 있었음.

1.3 두 시간사이의 차이를 계산하는 방법이 기억나지 않았음 Duration between toMinutes로 구할 수 있었다.

 

2. Queue, Stack 사용법을 익히는데도 시간을 썼다. 이부분은 양쪽모두 활용가능한 Dequeue로 앞으로 풀자.

3. 머리로 생각만하고 구현했는데, 복잡했고 충분히 구현이 되지 않아 1차 실패하였다. 로직을 종이에 정리하고 하자.

4. 2차 시도 실패원인은 문제에 2군데 놓친 부분이 있어 실패하였다. "가장 최근에 멈춘것 부터 실행", "남은 시간 처리" 사소한 실수는 계속 줄여야 한다.

 

 

import java.util.*;
import java.time.*;
import java.time.format.*;

class Solution {
    public String[] solution(String[][] plans) {
        int index = 0;
        int N = plans.length;
        String[] answer = new String[N];
        
        Arrays.sort(plans, Comparator.comparing(a -> a[1]));
        
        Deque<Schedule> wait = new LinkedList<>();
        DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");
        Integer remainingTime = 0;
        for(int i = 1 ; i < N ; i++) {
            String prvName = plans[i-1][0];
            LocalTime prvTime = LocalTime.parse(plans[i-1][1], format);
            Integer prvPlayTime = Integer.parseInt(plans[i-1][2]);
            
            LocalTime curTime = LocalTime.parse(plans[i][1], format);
            Duration duration = Duration.between(prvTime, curTime);
            Integer diffMin = (int)duration.toMinutes();
            
            if (prvPlayTime <= diffMin) {
                answer[index++] = prvName;
                remainingTime = diffMin - prvPlayTime;
                while (!wait.isEmpty() && remainingTime - wait.peekLast().time >= 0) {
                    Schedule schedule = wait.pollLast();
                    remainingTime -= schedule.time;
                    answer[index++] = schedule.name;
                }
                
                // 남은시간을 처리해주지 않아 2번째 시도 때 83 점 받음
                if(wait.peekLast() != null && remainingTime != 0){
                   wait.peekLast().time -= remainingTime; 
                }
            } else {
                wait.addLast(new Schedule(prvName, prvPlayTime - diffMin));
            }
        }
        
        answer[index++] = plans[N-1][0];
        
        while (!wait.isEmpty()){
            answer[index++] = wait.pollLast().name;
        }
        
    
        return answer;
    }
    
    class Schedule {
        String name;
        Integer time;
        
        public Schedule(String name, Integer time) {
            this.name = name;
            this.time = time;
        }
    }
}

 

더 나은 풀이방법

https://magentino.tistory.com/159

 

[프로그래머스/LV2] 과제 진행하기 (Python)

Problem : https://school.programmers.co.kr/learn/courses/30/lessons/176962 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이

magentino.tistory.com

https://magentino.tistory.com/159