[TIL_Carrotww] 92 - 23/01/26

유형석·2023년 1월 26일
0

TIL

목록 보기
107/138
post-thumbnail

📝Carrotww의 코딩 기록장

🧲 python algorithm interview

🔍 Leetcode 200 Number of Islands - Medium

dfs 문제이다.
깔끔하지는 않은것 같지만 일단 책을 보고 풀지 않은 풀이이다.

  • 내 풀이
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        result = 0
        dx, dy = [0, 0, -1, 1], [-1, 1, 0, 0]
        visited = [[0 for _ in range(len(grid[0]))] for _ in range(len(grid))]

        def dfs(x, y):
            if visited[x][y] == 1 or grid[x][y] == '0':
                return 0
            stack = [(x, y)]
            visited.append((x, y))
            while stack:
                x, y = stack.pop()
                for i in range(4):
                    n_x, n_y = x + dx[i], y + dy[i]

                    if (n_x >= 0 and n_x < len(grid)) and (n_y >= 0 and n_y < len(grid[0])):
                        if grid[n_x][n_y] == '1' and visited[n_x][n_y] == 0:
                            stack.append((n_x, n_y))
                            visited[n_x][n_y] = 1
            return 1

        for i in range(len(grid)):
            for j in range(len(grid[0])):
                result += dfs(i, j)

        return result


속도는 나쁘지 않다.

🔍 Leetcode 17 Letter Combinations of a Phone Number - Medium

combinations을 이용하여 풀라다가 못풀고 책에 나온대로 dfs로 풀이하였다.

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        char_dict = {"1" : "", "2" : "abc", "3" : "def", "4" : "ghi", "5" : "jkl", "6" : "mno",
        "7" : "pqrs", "8" : "tuv", "9" : "wxyz"}
        result = []

        def dfs(index, word):
            if len(word) == len(digits):
                result.append(word)
                return

            for i in range(index, len(digits)):
                for char in char_dict[digits[i]]:
                    dfs(i+1, word+char)
        if not digits:
            return []
        dfs(0, "")
        return result

개인적으로 휴대폰 패드 문제가 나오면 dict를 수기로 작성해야하기 때문에 귀찮아서 별로 좋아하는 문제는 아니다.
하지만 dfs 문제는 좋아하기 때문에...ㅎㅎ

🧲 django 프로젝트 사용자 nickname뒤에 #0001 붙이기

🔍 discode는 nickname뒤에 위와같이 #0813 등으로 숫자가붙는다. 다른 어떤 게임도 그랬던거 같은데 nickname 중복을 가능하게 하기 위함인것같다.
현재 진행중인 프로젝트에도 위와 같은 방식을 적용하려고 고민을 했는데 일단 id 순서대로 # 뒤에 숫자를 붙여 주고, 9999가 넘어간다면 10000으로 나누어 나머지를 다시 뒤에 붙이는 식으로 만들기로 했다.
하지만 극악의 확률로 동일 nickname의 유저가 동일 번호에 걸린다면 번호 +1 을 해주어 생성되게 구현했다.

class Userfuc:
    def checkusernickname(nickname, num=None):
        if num == None:
            try:
                last_user_id = User.objects.last().id
            except:
                # 처음 가입 시 objects가 없음
                last_user_id = 0
        else:
            # 중복 nickname이 있어 num 매개변수에 값이 있음
            last_user_id = num + 1

        num = last_user_id
        # nickname ex) carrot#1996
        if last_user_id >= 10000:
            last_user_id %= 10000
        number_nickname = str(last_user_id + 1)

        while len(number_nickname) < 4:
            number_nickname = '0' + number_nickname

        result_nickname = f'{nickname}#{number_nickname}'
        verify_nickname = User.objects.filter(nickname=result_nickname)

        if verify_nickname:
            return Userfuc.checkusernickname(nickname, num)

        return result_nickname

테스트 코드를 작성하여 테스트해보지는 못했지만 가입시 뒤에 번호가 붙는것은 잘 작동한다.
같은 닉네임이 있을 경우 재귀로 다시 호출하게끔 작성하였다.

물론 조금 더 효율적이게 하려면 원래 있는 값들도 다시 넘긴다거나 재귀를 사용하지 않고 if문을 걸어주면 되지만, 속도차이가 아주 미세할 것이라 생각되고 지금 작성한 코드가 훨씬 깔끔해서 가져가기로 했다.

당연히 가입시 특수문자 제한 및 추가로 신경써주어야 할것이 남아있지만 주요 기능을 먼저 한 후 작성하는게 좋을 것이라고 판단되어 진행했다.

  • 중간 점검
    소셜 로그인으로만 가입하여 접속, 중복 닉네임 허용, access token, refresh token 저장 방식을 프론트 친구와 협의 후 구현까지 완성하였다.
    이제 채팅, 음성 채팅 기능으로 넘어갈 예정이다.
    이 음성채팅, 화면 공유를 해보기 위한 프로젝트이기 때문에 기대된다.
    오늘 끝!
profile
Carrot_hyeong

0개의 댓글