post-custom-banner

나만의 무기

오늘도 어제에 이어 DM 기능 관련 작업을 하며, 베이스 코드에서 몇 가지 개선했다! 주요 기능들에 대해선 이곳저곳 코드가 추가되고, 코드 양도 많아서 전체 코드를 적진 않겠다. 대신 프로젝트가 끝난 후에 가능하다면 코드를 공개하는 방향으로... 🥲 오늘도 역시나 캡쳐들은 최대한 팀원들의 신상정보가 드러나지 않도록, 일부 잘라내고 업로드하였다.

가장 주요한 기능은 Search bar를 구현한 것이다. 베이스코드에 주어진 코드에서는, Search bar는 뼈대만 나와있고 전혀 동작하지 않는다. 이걸 Search bar에서 무언가를 입력하면, 해당하는 상대방 목록만 실시간으로 볼 수 있도록 하였다.

실시간 메세지 반영

그리고 메세지를 보냈을 때, 바로바로 대화창에 나타나도록 구현해주었다. 역시나 주어진 베이스코드는 레이아웃만 주어져있기에 TextField를 작성해도 아무 일도 발생하지 않는 상태였다. 그래서, 메세지를 입력하고 보냈을 때, 그 메세지는 대화창에 나타나면서 키보드는 닫히지 않고 기존의 TextField는 지워주도록 했다. 키보드를 닫을지 말지 등을 많이 고민해봤는데, 인스타그램의 DM 메시지 기능이 직관적인 것 같아서 결정에 참고했다 !

그 외에 추가해준 기능

이외에도 몇 가지를 추가해 완성도를 높이려고 했다. 이 부분은 코드가 짧아서 가독성을 해치지 않기에 공유해도 괜찮을 것 같다.

프로필 사진이 동그랗게 뜨도록 수정

CircleAvatar()를 활용해 보다 깔끔하게 만들어주었다.

CircleAvatar(
  backgroundImage: NetworkImage(
    widget.imageUrl
     ),
  maxRadius: 20,
),

키보드 외의 화면을 눌렀을 때 키보드가 닫히도록 만들기

원하는 영역을 GestureDetector로 감싸고, 키보드 이외의 영역을 tap 했을 때 빠져나갈 수 있도록 만들어주었다.

GestureDetector(
      onTap: (){
        FocusScope.of(context).unfocus();
      },
      child: Scaffold(
				...
				...
	  )
)

입력 없이 보냈을 때는 처리 안되도록 하기

원래는 입력 없이 보내도, 메세지 창에 비어있는 파란색 대화창이 나타나는 상황이었다. 아래의 코드를 추가해 간단히 해결해주었다.

if (inputData.text.isNotEmpty) {
	addMessage(widget.name, inputData.text);
    inputData.clear();
}

이외에도 다른 팀원들과 서로 돕고 도우며 알찬 하루를 보냈다.
처음에 서치바 보고 '와 이거 어떻게 하지?' 싶었는데, 잘해내서 뿌듯하다. 내일도 기대된다 !

알고리즘 스터디

어제에 이어 오늘도 풀었다. 다행~
부등호 라는 문제였다 !

백준 - 부등호

우선, Backtracking 의 기본인 종료조건을 설정해주었다.
모든 부등호에 대한 탐색을 완료했을 때, 마치도록 다음과 같이 설정했다.

def backtracking(n, now):
    if n == k:
        answer.append(''.join(list(map(str,now))))
        return

아직 모든 부등호에 대한 처리가 이루어진게 아니라면, 그때그때마다 그 순간에 마주한 부등호가 > 인지, <인지에 따라서 알맞게 처리할 수 있도록 구성하였다.

부등호가 '>'인 경우엔 가장 최근에 추가한 숫자보다 작은 숫자가 들어갈 수 있다. 그래서 범위를 0에서부터 가장 최근에 추가한 숫자보다 하나 작은 숫자까지의 범위에서 다음 단계를 진행할 수 있도록 해주었다.


    if L[n] == '>':
        for i in range(int(now[-1])):
            if str(i) in now:
                continue
            backtracking(n+1, now + list(str(i)))

반면 '<'인 경우엔 가장 최근에 추가한 숫자보다 큰 숫자만 들어갈 수 있을 것이다. 따라서, 범위를 가장 최근에 추가한 숫자보다 하나 큰 숫자부터, 9까지의 범위에서 다음 단계를 진행할 수 있도록 해주었다.

    else: # L[n] == '<'
        for i in range(int(now[-1])+1, 10):
            if str(i) in now:
                continue
            backtracking(n+1, now + list(str(i)))

이렇게 구성한 백트래킹을, 0~9에서 각각 시작해주도록 하였다.

for i in range(10):
    backtracking(0, [str(i)])

효율성이 떨어지면 어쩌나 고민했는데, 다행히도 한번에 잘 통과했다 :) 최종 코드는 다음과 같다 !

from sys import stdin
input = stdin.readline

k = int(input())
L = input().strip().split()

answer = []

def backtracking(n, now):
    if n == k:
        answer.append(''.join(list(map(str,now))))
        return
    if L[n] == '>':
        for i in range(int(now[-1])):
            if str(i) in now:
                continue
            backtracking(n+1, now + list(str(i)))
    else:
        for i in range(int(now[-1])+1, 10):
            if str(i) in now:
                continue
            backtracking(n+1, now + list(str(i)))

for i in range(10):
    backtracking(0, [str(i)])
    
print(answer[-1])
print(answer[0])
post-custom-banner

0개의 댓글