Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

우주에서 글을 적어본다

99클럽 코테 스터디 8일차 TIL + 스택과 수학 머리 본문

항해99 TIL

99클럽 코테 스터디 8일차 TIL + 스택과 수학 머리

우주로 날아간 사람 2024. 7. 29. 19:42

[오늘의 학습 키워드 및 문제]
- 프로그래머스의 "기능개발" 문제를 풀었다.
- 주제는 스택/큐였지만 먼저 퍼뜩 떠오른 구현이었다.
- 그래서 구현으로 먼저 풀고 스택/큐를 활용해서도 풀어봤다.

[나의 코드]

import math

def solution(progresses, speeds):
    answer = []
    days = []
    
    for i in range(len(progresses)):
        left_days = math.ceil((100 - progresses[i]) / speeds[i])
        days.append(left_days)
    
    # math 라이브러리 안 쓰고 푼 거
    """
    for i in range(len(progresses)):
        if (100 - progresses[i]) % speeds[i] != 0:
            left_days = (100 - progresses[i]) // speeds[i] + 1
        else:
            left_days = (100 - progresses[i]) // speeds[i]
        days.append(left_days)
    """
    
    deploy_day = days[0]
    count = 0
    
    for day in days:
        if day <= deploy_day:
            count += 1
        else:
            answer.append(count)
            deploy_day = day
            count = 1
    
    answer.append(count)
    return answer

구현으로 푼 코드이다.
일단 기본적인 생각 과정은 이렇다. 노트에다 아래와 같이 적어 놓고 코드를 적기 시작했다.

① 남은 일수 계산한다.
② 앞날이 뒷날보다 크면 count + 1을 해준다.
③ 아니라면 answer에 count를 넣어주고 count 변수를 초기화한다.

다만 아래 스택/큐로 푼 문제와 비교해 단점을 꼽자면 math 라이브러리를 불러와야 하는 귀찮음이 있었다.
참고로 웬만하면 라이브러리 안 쓰는 걸 좋아하는 편이다. 근데 안 쓰면 코드 길어지는 것도 싫다.

def solution(progresses, speeds):
    answer = []
    count = 0
    time = 0
    
    while len(progresses):
        if progresses[0] + time * speeds[0] >= 100:
            progresses.pop(0)
            speeds.pop(0)
            count += 1
        else:
            if count > 0:
                answer.append(count)
                count = 0
            time += 1
    answer.append(count)
    return answer

다음은 스택/큐 풀이이다. 구체적으로 말하면 큐를 이용한 거다.
입력이 적기 때문에 큐를 위한 deque 라이브러리를 쓰지 않고, 그냥 배열을 써도 상관없었다.

아마 이 코드에서 가장 중요한 부분이 progresses[0] + time * speeds[0] >= 100 일거라 생각한다.
나는 수학 머리가 없어서 이 부분은 다른 분들 걸 참고했다.

위의 코드는 100에서 다 된 거를 뺐는데 이거는 안 된 거를 더해서 100을 만들어 버리는 코드였다.
즉, 현재 시점(time)에서 각 작업이 완료되었는지를 확인하는 조건을 구한 거다.
이 코드와 같이 짤 수 있도록 노력해야겠다.

다들 이런 풀이를 어떻게 생각해 내신 건지 모르겠다.
그런 기념으로 저 둘의 속도 차이를 구경하고 가겠다. (어차피 아무도 깊이 들여다볼 게 아니..)
뭐... 비슷한 것 같다.

일반 구현 풀이
큐 풀이

[오늘의 회고]
- 날짜만 잘 구할 수 있다면 나머지는 어렵지 않은 문제였다. 수학 머리 좀 기르자. 근데 쉽지 않다.
- 나 주제에 나머지를 못짜면... 눈물이 앞을... 끝!