[TIL_Carrotww] 14 - 22/09/19

μœ ν˜•μ„Β·2022λ…„ 9μ›” 19일
0

TIL

λͺ©λ‘ 보기
17/138
post-thumbnail

πŸ“Carrotww의 μ½”λ”© 기둝μž₯

🧲 μ•Œκ³ λ¦¬μ¦˜

πŸ” ❓ Q. 문제 μ„€λͺ…
λ‘œλ΄‡ μ²­μ†ŒκΈ°κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ²­μ†Œν•˜λŠ” μ˜μ—­μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
λ‘œλ΄‡ μ²­μ†ŒκΈ°κ°€ μžˆλŠ” μž₯μ†ŒλŠ” NΓ—M 크기의 μ§μ‚¬κ°ν˜•μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 있으며, 1Γ—1크기의 μ •μ‚¬κ°ν˜• 칸으둜 λ‚˜λˆ„μ–΄μ Έ μžˆλ‹€. 각각의 칸은 λ²½ λ˜λŠ” 빈 칸이닀. μ²­μ†ŒκΈ°λŠ” λ°”λΌλ³΄λŠ” λ°©ν–₯이 있으며, 이 λ°©ν–₯은 동, μ„œ, 남, 뢁쀑 ν•˜λ‚˜μ΄λ‹€. μ§€λ„μ˜ 각 칸은 (r, c)둜 λ‚˜νƒ€λ‚Ό 수 있고, r은 뢁μͺ½μœΌλ‘œλΆ€ν„° 떨어진 칸의 개수, cλŠ” μ„œμͺ½μœΌλ‘œ λΆ€ν„° 떨어진 칸의 κ°œμˆ˜μ΄λ‹€.

λ‘œλ΄‡ μ²­μ†ŒκΈ°λŠ” λ‹€μŒκ³Ό 같이 μž‘λ™ν•œλ‹€.

  1. ν˜„μž¬ μœ„μΉ˜λ₯Ό μ²­μ†Œν•œλ‹€.
  2. ν˜„μž¬ μœ„μΉ˜μ—μ„œ ν˜„μž¬ λ°©ν–₯을 κΈ°μ€€μœΌλ‘œ μ™Όμͺ½λ°©ν–₯λΆ€ν„° μ°¨λ‘€λŒ€λ‘œ 탐색을 μ§„ν–‰ν•œλ‹€.
    a. μ™Όμͺ½ λ°©ν–₯에 아직 μ²­μ†Œν•˜μ§€ μ•Šμ€ 곡간이 μ‘΄μž¬ν•œλ‹€λ©΄, κ·Έ λ°©ν–₯으둜 νšŒμ „ν•œ λ‹€μŒ ν•œ 칸을 μ „μ§„ν•˜κ³  1λ²ˆλΆ€ν„° μ§„ν–‰ν•œλ‹€.
    b. μ™Όμͺ½ λ°©ν–₯에 μ²­μ†Œν•  곡간이 μ—†λ‹€λ©΄, κ·Έ λ°©ν–₯으둜 νšŒμ „ν•˜κ³  2번으둜 λŒμ•„κ°„λ‹€.
    c. λ„€ λ°©ν–₯ λͺ¨λ‘ μ²­μ†Œκ°€ 이미 λ˜μ–΄μžˆκ±°λ‚˜ 벽인 κ²½μš°μ—λŠ”, λ°”λΌλ³΄λŠ” λ°©ν–₯을 μœ μ§€ν•œ μ±„λ‘œ ν•œ μΉΈ 후진을 ν•˜κ³  2번으둜 λŒμ•„κ°„λ‹€.
    d. λ„€ λ°©ν–₯ λͺ¨λ‘ μ²­μ†Œκ°€ 이미 λ˜μ–΄μžˆκ±°λ‚˜ λ²½μ΄λ©΄μ„œ, λ’€μͺ½ λ°©ν–₯이 벽이라 후진도 ν•  수 μ—†λŠ” κ²½μš°μ—λŠ” μž‘λ™μ„ λ©ˆμΆ˜λ‹€.
    λ‘œλ΄‡ μ²­μ†ŒκΈ°λŠ” 이미 μ²­μ†Œλ˜μ–΄μžˆλŠ” 칸을 또 μ²­μ†Œν•˜μ§€ μ•ŠμœΌλ©°, 벽을 톡과할 수 μ—†λ‹€.

μž…λ ₯ 쑰건
λ‘œλ΄‡ μ²­μ†ŒκΈ°κ°€ μžˆλŠ” 칸의 μ’Œν‘œ (r, c)와 λ°”λΌλ³΄λŠ” λ°©ν–₯ dκ°€ 주어진닀. 이 λ•Œ dκ°€ 0인 κ²½μš°μ—λŠ” 뢁μͺ½μ„, 1인 κ²½μš°μ—λŠ” 동μͺ½μ„, 2인 κ²½μš°μ—λŠ” 남μͺ½μ„, 3인 κ²½μš°μ—λŠ” μ„œμͺ½μ„ 바라보고 μžˆλŠ” 것이닀.

λ˜ν•œ μ²­μ†Œν•˜κ³ μž ν•˜λŠ” 방의 지도λ₯Ό 2차원 λ°°μ—΄λ‘œ 주어진닀.
빈 칸은 0, 벽은 1둜 주어진닀. μ§€λ„μ˜ 첫 ν–‰, λ§ˆμ§€λ§‰ ν–‰, 첫 μ—΄, λ§ˆμ§€λ§‰ 열에 μžˆλŠ” λͺ¨λ“  칸은 벽이닀.

λ‘œλ΄‡ μ²­μ†ŒκΈ°κ°€ μžˆλŠ” 칸의 μƒνƒœλŠ” 항상 빈 칸이라고 ν–ˆμ„ λ•Œ,
λ‘œλ΄‡ μ²­μ†ŒκΈ°κ°€ μ²­μ†Œν•˜λŠ” 칸의 개수λ₯Ό λ°˜ν™˜ν•˜μ‹œμ˜€.

r, c, d = 7, 4, 0
room_map = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
    [1, 0, 0, 1, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]

πŸ’‘ 2차원 배열에 μ’€ μ•½ν•œλ° 이 문제λ₯Ό ν’€λ©° μ’€ 강해진 것 κ°™λ‹€ μ§„μ§œ 거의 λ‹€ μ ‘κ·Όν•˜μ˜€λŠ”λ° for λ¬Έ μ•ˆμ— 탭을 μ•ˆν•΄μ£Όκ³  2쀑 for 문을 μ“΄κ±Έ 눈치 λͺ»μ±„κ³  자꾸 μ΄μƒν•˜κ²Œ λ‚˜μ™€ μ‹œκ°„μ„ λ„ˆλ¬΄ 많이 ν—ˆλΉ„ν•΄μ„œ λ„ˆ 무 λ‹΅λ‹΅ν–ˆλ‹€ γ… 
λ‚œ λ°©ν–₯을 μž‘μ•„μ£ΌλŠ” ν•¨μˆ˜μ— μ’Œν‘œ(r, c) 와 (d) κΉŒμ§€ λ„£μ–΄μ£Όλ €κ³  ν–ˆμ§€λ§Œ ν’€μ΄λŠ” μ’€ 더 κΉ”λ”ν•œ λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜μ—¬ κ·Έ λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜μ˜€λ‹€.
λ‹€μŒλΆ€ν„°λŠ” μ’€ 더 꼼꼼히 μ‚΄νŽ΄λ³΄μž... γ… 

πŸ’‘ 풀이

current_r, current_c, current_d = 7, 4, 0
current_room_map = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
    [1, 0, 0, 1, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
def get_position(d):
    return (d + 3) % 4

def get_back(d):
    return (d + 2) % 4
# 뢁 0 -> 3 | back -> 2
# 동 1 -> 0 | back -> 3
# 남 2 -> 1 | back -> 0
# μ„œ 3 -> 2 | back -> 1


def get_count_of_departments_cleaned_by_robot_vacuum(r, c, d, room_map):
    # total_r, total_c = len(room_map), len(room_map[0])
    dr = [-1, 0, 1, 0]
    dc = [0, 1, 0, -1]
    n = len(room_map)
    m = len(room_map[0])
    clear = 1
    room_map[r][c] = 2
    queue = [[r, c, d]]

    while queue:
        r, c, d = queue.pop()
        temp = d

        
        for i in range(4):
            temp = get_position(temp)
            nx_r, nx_c = r + dr[temp], c + dc[temp]
        
            if 0 <= nx_r < n and 0 <= nx_c < m and room_map[nx_r][nx_c] == 0:
                clear += 1
                room_map[nx_r][nx_c] = 2
                queue.append([nx_r, nx_c, temp])
                break
            
            elif i == 3:
                nx_r, nx_c = r + dr[get_back(d)], c + dc[get_back(d)]
                queue.append([nx_r, nx_c, d])

                if room_map[nx_r][nx_c] == 1:
                    return clear
            
    
print(get_count_of_departments_cleaned_by_robot_vacuum(current_r, current_c, current_d, current_room_map))
current_room_map2 = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
    [1, 0, 0, 1, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
print("μ •λ‹΅ = 29 / ν˜„μž¬ 풀이 κ°’ = ", get_count_of_departments_cleaned_by_robot_vacuum(6,3,1,current_room_map2))
current_room_map3 = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
    [1, 0, 0, 1, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 1, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
print("μ •λ‹΅ = 33 / ν˜„μž¬ 풀이 κ°’ = ", get_count_of_departments_cleaned_by_robot_vacuum(7,4,1,current_room_map3))
current_room_map4 = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
    [1, 0, 1, 0, 1, 1, 1, 1, 0, 1],
    [1, 0, 0, 1, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 1, 0, 0, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
print("μ •λ‹΅ = 25 / ν˜„μž¬ 풀이 κ°’ = ", get_count_of_departments_cleaned_by_robot_vacuum(6,2,0,current_room_map4))

🧲 μž‘μ„€

πŸ” μ˜€λŠ˜μ€ 문제 ν•˜λ‚˜λ§Œ 올리렀 ν•œλ‹€. λ”°λ‘œ 링크가 μžˆλŠ” λ¬Έμ œκ°€ μ•„λ‹Œ κ°•μ˜ μžλ£Œμ—μ„œ κ°€μ Έμ˜¨ 문제라 μ—¬λŸ¬ 문제λ₯Ό μž‘μ„±ν•˜λ©΄ TIL이 λ„ˆλ¬΄ κΈΈμ–΄μ Έ ν”Όκ³€ν•˜λ‹€... 아직 λ„ˆλ¬΄ 많이 λΆ€μ‘±ν•˜λ‹€. λ¬Έμ œκ°€ μ•ˆν’€λ¦΄λ•ŒλŠ” μ’€ 닡닡함이 많이 μ°Ύμ•„μ˜€μ§€λ§Œ κ·Έλž˜λ„ ν•΄κ²°ν•˜λŠ”λ° μ§œλ¦Ών•œ 맛이 μžˆμœΌλ‹ˆκΉŒ γ…Žγ…Ž 2차원 λ°°μ—΄ κ΅΄λ¦¬λŠ”λ° μ’€ 더 μ΅μˆ™ν•΄μ Έμ„œ 속도λ₯Ό μ˜¬λ €μ•Όκ² λ‹€.
였늘 끝!

profile
Carrot_hyeong

0개의 λŒ“κΈ€