Coding Test

[프로그래머스] 방의 개수

상상쓰 2021. 9. 30. 11:10

https://programmers.co.kr/learn/courses/30/lessons/49190

 

코딩테스트 연습 - 방의 개수

[6, 6, 6, 4, 4, 4, 2, 2, 2, 0, 0, 0, 1, 6, 5, 5, 3, 6, 0] 3

programmers.co.kr

 

오일러 공식이 생각나서 활용하니 맞았다.

v(꼭짓점의 개수) - e(변의 개수) + f(면의 개수) = 2

 

문제로 주어진 조건으로 봤을 때, 대각선으로 변이 교차하는 경우 오일러 공식의 전제 조건인 평면 그래프가 아닐 수 있으므로 1칸이 아니라 2칸으로 그래프를 늘려 1칸마다 꼭짓점으로 생각한다. set 을 이용하여 중복된 꼭짓점 또는 변을 무시하여 정확한 개수를 구한다. 변은 점과 점이 이어진 선으로 중복을 막기 위해서 값을 (x[0] + y[0], x[1] + y[1]) 로 한다. 

 

문제에서 사방이 막혀야 방으로 인정하므로 f = e - v + 2 에서 바깥 평면은 무시되므로 1을 빼준다. 

 

def solution(arrows):
    answer = 0
    d = {0 : (-1, 0), 1 : (-1, 1), 2 : (0, 1), 3 : (1, 1), 4 : (1, 0), 5 : (1, -1), 6 : (0, -1), 7 : (-1, -1)}
    x = (0, 0)
    v = set({x})
    e = set()

    for arrow in arrows:
        for i in range(2):
            y = (x[0] + d[arrow][0], x[1] + d[arrow][1])
            v.add(y)
            e.add((x[0] + y[0], x[1] + y[1]))
            x = y
        
    answer = len(e) - len(v) + 1
        
    return answer

print(solution([6, 6, 6, 4, 4, 4, 2, 2, 2, 0, 0, 0, 1, 6, 5, 5, 3, 6, 0])) # 3