[TIL_Carrotww] 30 - 22/10/14

์œ ํ˜•์„ยท2022๋…„ 10์›” 14์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
36/138
post-thumbnail

๐Ÿ“Carrotww์˜ ์ฝ”๋”ฉ ๊ธฐ๋ก์žฅ

๐Ÿงฒ Algorithm

๐Ÿ” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ
์ „ํ˜•์ ์ธ dfs, bfs ๋ฌธ์ œ์ด๋‹ค ๋‚ด๊ฐ€ ์žฌ๊ท€์— ์•ฝํ•œํŽธ์ธ๋ฐ ๊ทธ๋ž˜๋„ ๋‚˜๋ฆ„ ๋งŽ์ด ์ต์ˆ™ํ•ด์ ธ์„œ ๋ฌธ์ œ๋ฅผ ๋ดค์„๋•Œ ๋‡Œ์ •์ง€๊ฐ€ ์™”์—ˆ์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์ง€๊ธˆ์€ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผ ํ•ด์•ผํ•  ์ง€ ๋Š๋‚Œ์ด ์˜ค๊ธฐ๋Š” ํ•œ๋‹ค.

def solution(maps):
    import math
    from collections import deque
    last_row, last_col = len(maps[0]) - 1, len(maps) - 1
    MAX = math.inf
    visited = [[MAX] * (last_row + 1) for x in range(last_col + 1)]

    # ๋™์„œ๋‚จ๋ถ
    dx = [1, -1, 0, 0]
    dy = [0, 0, -1, 1]

    result = []
    stack = deque([(0, 0, 1)])

    cnt = 0
    while stack:
        cnt += 1
        x, y, cnt_val = stack.popleft()
        if x == last_row and y == last_col:
            result.append(visited[y][x])

        for i in range(4):
            n_x, n_y = x + dx[i], y + dy[i]
            if 0 <= n_x <= last_row and 0 <= n_y <= last_col:
                if maps[n_y][n_x] == 1:
                    if visited[n_y][n_x] < cnt_val + 1:
                        continue
                    visited[n_y][n_x] = cnt_val + 1
                    stack.append((n_x, n_y, cnt_val + 1))

    if result:
        print(cnt)
        return min(result)
    return -1

  • ํ•˜๋‹ค ํ•˜๋‹ค DFS๋กœ DP๊นŒ์ง€ ์„ž์–ด์„œ ๋๊นŒ์ง€ ํ•ด๋ณด์•˜๋Š”๋ฐ ํšจ์œจ์„ฑ์—์„œ ํ•˜๋‚˜๋„ ์•„์‰ฝ์ง€ ์•Š๊ฒŒ ๋ชจ๋‘ ์‹คํŒจํ–ˆ๋‹ค ใ… ใ… 
    ์ด ๋ฌธ์ œ๋กœ ์ด์ œ ๋จธ๋ฆฌ์†์— ๊ฐ์ธ๋˜์—ˆ๋‹ค. ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” BFS ๋กœ ํ‘ธ๋Š”๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค๋Š”๊ฒƒ.
    ์ฒ˜์Œ์— DFS ๋กœ ์ ‘๊ทผํ•˜์—ฌ ๊ผญ ํ’€๊ณ ์‹ถ์–ด์„œ visited์— ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ๋ฉฐ ๊ธฐ๋กํ•˜์˜€๋Š”๋ฐ ํšจ์œจ์„ฑ์—์„œ ๋–จ์–ด์ง€๋Š” ๊ฒƒ ๋ณด๋‹ˆ ์œ„ ๋ฌธ์ œ๋Š” BFS ์•„๋‹ˆ๋ฉด ์•ˆ๋  ๊ฒƒ ๊ฐ™๋‹ค...
    ์•„๋ž˜๋Š” BFS๋กœ ๋‹ค์‹œ ํ‘ผ ๋ฌธ์ œ
  • ๋˜ row์™€ column ์— ๋Œ€ํ•ด์„œ ๋‚˜๋Š” ๋‹ค๋ฅธ ์‹์œผ๋กœ ํ‘œ๊ธฐ๋ฅผ ํ•˜์˜€๋Š”๋ฐ ํ–‰ -> x ์ถ• row -> ํ–‰์— ์žˆ๋Š” ์ž๋ฃŒ ์ˆ˜ ๋กœ ํ‘œ๊ธฐ๋ฅผ ํ•˜์˜€๋‹ค.
    ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ‘œ๊ธฐ๋ฅผ ํ•˜๋ฉด ๊ฐ€์‹œ์„ฑ์ด ์ข‹์ง€ ์•Š๊ณ  ํ–‰๋ ฌ์— ๋Œ€์ž…ํ• ๋•Œ row, x, col, y๋ฅผ ์„œ๋กœ ๋ฐ˜๋Œ€๋กœ ๋Œ€์ž…ํ•ด ์ฃผ์–ด์•ผ ํ•ด์„œ ๋‚˜๋งŒ ์•Œ์•„๋ณด๊ธฐ ์‰ฌ์› ๋‹ค.
    ์•„๋ž˜ ํ’€์ด๋Š” row -> row์˜ ๊ฐœ์ˆ˜ ; col -> column์˜ ๊ฐœ์ˆ˜ ๋กœ ํ‘œ๊ธฐํ•˜์—ฌ ๊ฐ€์‹œ์„ฑ์ด ์ข‹์•„? ์กŒ๋‹ค. ใ…Žใ…Ž ์ด์ œ ์ ˆ๋Œ€ ์•ˆ๊นŒ๋จน๊ณ  ์ž˜ ์“ธ ๊ฒƒ ๊ฐ™๋‹ค.
def solution(maps):
    from collections import deque
    total_row, total_col = len(maps) - 1, len(maps[0]) - 1
    cnt = 0
    queue = deque()
    queue.append([0, 0])
    visited = [[0]*(total_col + 1) for _ in range(total_row + 1)]
    visited[0][0] = 1
    # ๋™์„œ๋‚จ๋ถ
    dr, dc = [1, -1, 0, 0], [0, 0, -1, 1]

    while queue:
        current_r, current_c = queue.popleft()
        if current_r == total_row and current_c == total_col:
            return visited[current_r][current_c]

        for i in range(4):
            next_r, next_c = dr[i] + current_r, dc[i] + current_c
            if 0 <= next_r <= total_row and 0 <= next_c <= total_col:
                if maps[next_r][next_c] == 1 and not visited[next_r][next_c]:
                    visited[next_r][next_c] = visited[current_r][current_c] + 1
                    queue.append((next_r, next_c))
    return -1

์ง„์งœ BFS, DFS ์ดํ•ด๋Š” ๋์ง€๋งŒ ํ’€๋•Œ ์ƒ์ƒ์ด ์•ˆ๋ผ์„œ ๋ง‰๋ง‰ํ–ˆ์—ˆ๋Š”๋ฐ ์—ญ์‹œ ์‹œ๊ฐ„์ด ๋‹ต์ธ๊ฐ€๋ณด๋‹ค.
์žก๊ณ  ๊ณ„์† ํ•˜๋‹ˆ๊นŒ ์™„๋ฒฝํžˆ ์ดํ•ดํ–ˆ๋‹ค. ์ด์ œ๋Š” ๋จธ๋ฆฌ์†์—์„œ ์ง€๋„๋กœ ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
์œ„ ๋ฐฉ์‹๋Œ€๋กœ(BFS) ๋กœ ํ‘ธ๋‹ˆ ํšจ์œจ์„ฑ ๋ฐ”๋กœ ํ†ต๊ณผ ใ…Ž
ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ํ†ต๊ณผ ์‹œ๊ฐ„๋„ ํ›จ์”ฌ ๋นจ๋ผ์กŒ๋‹ค. ๊ตณ๊ตณ ๋„ˆ๋ฌด ๊ธฐ๋ถ„ ์ข‹๋‹ค.

๐Ÿ” DFS ๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜ ๋” ํ’€์—ˆ๋Š”๋ฐ ์ด๊ฑด ์‰ฌ์šฐ๋‹ˆ ํ‘ผ ๋ฐฉ์‹๋งŒ ์˜ฌ๋ฆฌ๊ฒ ๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํƒ€๊ฒŸ๋„˜๋ฒ„

def solution(numbers, target):
    result = []

    def dfs(number, temp):
        if not number:
            if temp == target:
                result.append(1)
            return
        temp_num = number.pop()
        dfs(number[:], temp + temp_num)
        dfs(number[:], temp - temp_num)

    num = numbers.pop()
    dfs(numbers[:], -num)
    dfs(numbers[:], num)

    return len(result)

๐Ÿงฒ Django set_password ํ•จ์ˆ˜

๐Ÿ” Django authenticate ์‚ฌ์šฉ ์‹œ

user = authenticate(request, username=username, password=password)

DB ๋„ ์ •์ƒ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ณ  POST ๋กœ ๋ฐ์ดํ„ฐ๋„ ์ž˜ ๋„˜์–ด์™”๋Š”๋ฐ user ๊ฐ€ ๊ณ„์† None์ด ๋œฐ๋•Œ!!!
์žฅ๊ณ ์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต์ค‘์ธ AbstractUser ๋ฅผ ์ƒ์†๋ฐ›์•„ user model์„ ๋งŒ๋“ค์–ด ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž… ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ๋Š”๋ฐ ๋กœ๊ทธ์ธ, ์ฆ‰ ์œ„ ์ฝ”๋“œ์˜ user ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๊พธ ์—†๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด์˜€๋‹ค.

๐Ÿ’ก ์ด์œ ๋Š” ๋‚ด๊ฐ€ PW ์ €์žฅ ์‹œ DB์— ์ž˜ ๋ชป ์ €์žฅํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ...

user_table.username = request.POST.get('username')
user_table.set_password(request.POST.get('password'))

Django์—์„œ AbstractUser ๋ชจ๋ธ์„ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ• ๋•Œ DB์— set_password ํ•จ์ˆ˜๋กœ ์ €์žฅ์„ ํ•˜์—ฌ์•ผ ์•”ํ˜ธํ™” ํ•˜์—ฌ ์ €์žฅํ•˜์—ฌ authenticate๋กœ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•ด ์ง„๋‹ค.
๊ฒ€์ฆ ์‹œ decoding์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฐ™์€ ๊ฐ’์„ encoding ํ•˜์—ฌ ์ €์žฅ๋œ ๊ฐ’์ด๋ž‘ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ

0๊ฐœ์˜ ๋Œ“๊ธ€