본문 바로가기
Algorithm/프로그래머스

[스택/큐] 기능개발

by seeker00 2021. 9. 13.

프로그래머스 [스택/큐]기능개발 링크

java

import java.util.ArrayList;
​
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
​
        ArrayList<Integer> list = new ArrayList<Integer>();
        int temp = 0;
        int count = 0;
        int length = progresses.length;
​
        for (int i = 0; i < length; i++) {
            int day =  (int) Math.ceil((float) (100 - progresses[i]) / speeds[i]);
            if (temp >= day) {
                count++;
            } else {
                if (count> 0) list.add(count);
                temp = day;
                count = 1;
            }
        }
        list.add(count);
​
​
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}
​
// Stream을 활용해보고 싶었으나 이 이후엔 어떻게 하면 좋을지 답이 안 보였다.
        int[] days = IntStream.range(0, progresses.length)
                .map(i -> (int) Math.ceil((float) (100 - progresses[i]) / speeds[i]))
                .toArray();
        Arrays.stream(days).forEach(d -> System.out.println(d));


Math.ceil 과 (float) 형 변환에서 에러가 났다. (testcase 11번)

  • (int) Math.ceil((float) (100 - progresses[i]) / speeds[i])

그 외에는 내림 계산이었을 때(그냥 바로 int 형으로 변환)도 패스가 되었다.
자바는 여러모로 역시 타입 체크를 잘 해야하는데, 아직 많이 어렵다.

List 에서 Array로 형 변환도 map을 이용했지만 결국은 for문을 돌린 거나 다름이 없지 않나?
그리고 int와 Integer 간의 형 변환도 어렵다. 자동 형변환이 되는 거 아닌가?

  • List 컬렉션은 primitive 형을 가질 수 없다고 한다. 결국 변환 과정이 필요한 듯 하다.
  • primitive 타입과 Wrapper 객체 간에 변환은 자바 컴파일러가 Autoboxing을 수행함으로써 발생하며, 비용이 발생한다.
  • list.stream().mapToInt(Integer::intValue).toArray();
  • list.toArray(new Integer[] (list.size());
    • 이 경우에는 Integer 형 배열을 생성하기에 int 형 배열로 바로 호환(?)이 되지 않는다.
    • 즉, list.size()로 적절한 크기의 int 형 배열을 생성하고 for 문으로 하나씩 담아줄 수 있다.

미처 생각지도 못한 부분이어서, 앞으론 더 꼼꼼히 확인해야 겠다는 반성을 하면서, 자바 타입에 대해서도 코테 연습을 하면서 다시 공부를 해야될 것 같다.

python

def solution(progresses, speeds):
    answer = []
    days = [(100-p)//s if (100-p)%s==0 else (100-p)//s +1 for p, s in zip(progresses, speeds)]
    from collections import deque
    days = deque(days)

    count = 1
    d = days.popleft()
    while len(days)>0:
        if d >= days[0]:
            days.popleft()
            count +=1
        else:
            answer.append(count)
            d = days.popleft()
            count = 1
    answer.append(count)      

    return answer


몇 달 전에 풀었던 파이썬 코드인데...
내 머리의 한계인 걸까, 놀라울 만큼 로직이 그냥 그대로다;; 앞으로 열심히 공부해서 좀 더 발전해야겠다는 생각이 든다.

'Algorithm > 프로그래머스' 카테고리의 다른 글

[힙(Heap)] 더 맵게  (0) 2021.12.16
[깊이/너비 우선 탐색(DFS/BFS)] 타겟 넘버  (0) 2021.12.07
[해시] 위장  (0) 2021.09.24
[해시] 전화번호 목록  (0) 2021.09.16
[해시] 완주하지 못한 선수  (0) 2021.09.15