post-custom-banner

나만의 무기 만들기

토요일 작업 회고

지난 토요일은 오후 5시 이후에 일정이 있어서 TIL은 따로 작성하지 않았다.
하지만 아침 9시부터 5시까지 집중해서 생각보다 많은 일을 했는데, 우선 드디어 스크롤을 개선했다.
근데 진짜 웃긴게... 에뮬레이터에서 자꾸 농구 -> 공부로 바꾼다. 공부해야 하는건 나도 안다구요...😂

어쨌든, 이제는 메세지를 입력할 때 메세지화면이 밀려 올라가고, 메세지를 입력하면 가장 최근 메세지가 잘 보이도록 개선을 완료했다😎 내가 이전에 참고했던 글은 [Flutter] SingleChildScrollView를 Keyboard에 따라 유연하게 스크롤하는 방법 등의 글이었는데, 지금 구성하는 코드에는 적절치 않은 솔루션이었다. 대신 이번에는 좋은 유투브 영상(Flutter keyboard Onfocus Scrollview)을 찾아서 혹시나하고 적용해봤는데, 드디어 해결을 해서 기분이 아주 좋다 !!

body: SingleChildScrollView(
          reverse: true,
          child: Column(
          ....
          ....
          )
),
bottomNavigationBar: Padding(
          padding:
              EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
          child: Container(
          ....
          ....
          )
)

이런 식으로 body는 SingleChildScrollView 내에서 reverse = true 를 적용해주었고, 기존에는 body에 있던 텍스트 입력창을 bottomNavigationBar로 빼준 다음에 padding을 줬더니 해결되었다.

여기서 MediaQuery는 화면 크기를 얻기 위해 사용한 클래스인데, viewInsets.bottom을 활용하면 시스템 UI에 의해 가려지는 부분의 크기를 구할 수 있고, 그만큼의 padding을 갖게 된다. 따라서 키보드가 나타면서 화면을 가리게 되면, 그만큼의 padding을 가지도록 함으로써 body가 밀려올라가는 효과가 생기는 듯 하다. 아주 NICE ~

그리고 유저별로 마이페이지 연동을 해서, 로그인하는 유저마다 다른 마이페이지가 나타나도록 했다. 현재로서는 해당 유저의 닉네임을 가지고 샘플 데이터에서 뽑아오도록 되어있는데, DB연동 작업은 nodejs 공부를 마친 후에 할 예정이다.

명함첩 UI도 살짝 바꿨는데, 명함의 크기를 조정하는데 매우 애를 먹었다. 살펴보니 ListTile의 경우엔 max height가 50으로 설정되어 있어서, 이거 때문에 별에 별 에러가 난 것이었다. 그래서 아예 처음부터 Container로 다시 짜고, 일단은 영역 구분을 위해 검은색 줄로 구분하도록 해두었다.

❌ 절대 최종 UI도 아니고, 디자인한거도 아니고, 그냥 뜨도록만 만들어 둔 것이다.
디자인은 DB연동이 끝난 후에 작업하기로 했다.

오늘의 작업

그리고 오늘은 Flutter가 아니라 Node.js 입문을 했다. 기존에는 리더인 곤님만 DB를 비롯한 BE 쪽을 작업하고 있었고, 나머지는 모두 FE성격에 가까운 Flutter에 붙어서 작업을 했었다. 하지만 원활한 개발을 위해선 당연히 API를 비롯해 DB 작업도 할 수 있어야하니까, 이번엔 내가 BE로 붙기로 했다. 이전에 DB를 설계하고 ERD를 짤 때는 나도 참여하긴 했지만, 이번 프로젝트에서는 처음으로 직접 작업하게 되는거라 매우 신난다. 원래 BE를 희망하고 있기도 하니까, BE 권유가 왔을 때 주저하지 않고 하겠다고 얘기했다.

그렇게 해서 오늘은 Node.js에 대해 알아보는 시간을 가졌는데, 일단 유투브에 공개된 코딩애플 형의 무료 강의를 수강했다.

강의를 쭉 들으며 정리하는 시간을 가진 후에, clone을 받아서 우리 코드를 살펴보다보니 오늘 하루가 끝났다. 이전에 미니 프로젝트 때에는 내가 BE를 맡아서 mongoDB를 직접 설계하고 python으로 처리하는 역할을 했었지만, Node.js는 처음인데다 우리는 mySQL을 쓰다보니까 그때와는 약간 다른 것 같다. 그래도 기본적인 결은 비슷해서, 내일까지는 이해를 마치고 슬슬 DB연동과 API 수정보완 작업을 시작할 수 있을 것 같다.

내일도 빡세게 달리자 ...... !

알고리즘 스터디

프로그래머스 - 야근 지수

오늘은 프로그래머스에서 한 문제를 풀었다.
야근 지수 라는 문제인데, 이렇게 생겼다. 문제를 보자마자 이걸 어떻게 해야할까.... 라는 생각이 먼저 들었다.
n이 줄어들 때까지 while문을 돌리고, 줄일때마다 sort를 해줄까....?
하지만 시간초과가 났고.... 그러던 와중에 갑자기 'heap'이라는 귓속말이....들렸다....
그리고... 바로 풀음. 그래서 온전히 내 힘으로 푼 것은 아닌 느낌이라 좀 아쉽다 ㅠㅠ

minheap이 아니라 maxheap으로 구현해주어야 하는 이유는 1씩 줄여가는 와중에 그때그때 내가 필요한 것은 '현재 제일 큰 값'이기 때문이다. 그렇게 해서 음수처리된 최댓값을 heap에서 뽑은 후에, +1을 해서 다시 heap에 넣는 것을 반복하면 간단히 풀리는 문제였다.

제대로 안되서 좀 아쉽지만, 그래도 한 가지 확실한 교훈을 얻었다.
만약 반복해서 정렬을 해줘야하고, 그때마다 필요한게 최솟값 혹은 최댓값이라면, heap을 씁시다...!
다음엔 절대 잊지 않아야겠다 🫡

제출한 코드는 다음과 같다.

# 야근 피로도 : 야근을 시작한 시점에서, 남은 일의 작업량을 제곱하여 더한 값. 
# N시간 동안 야근 피로도를 최소화하도록 일하기
# 1시간동안 작업량 1만큼을 처리할 수 있다.

from heapq import heapify, heappush, heappop
def solution(n, works):
    if sum(works) <= n:
        return 0
    if len(works) == 1:
        return (works[0]-n) ** 2
    works = [-x for x in works]
    heapify(works)
    while n:
        heappush(works, heappop(works)+1)
        n -=1 
                
    works = [x**2 for x in works]
    return sum(works)
post-custom-banner

0개의 댓글