일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- 추석맞이 코딩챌린지
- 자바
- programmers
- java
- 위클리 챌린지
- Set
- heapq
- lambda
- Zip
- 다익스트라
- divmod
- backjoon
- DateTime
- 이분탐색
- Combinations
- KAKAO BLIND RECRUITMENT
- 수학
- 프로그래머스
- 백준
- 동적 계획법
- dfs
- 정규식
- Re
- BFS
- python
- 파이썬
- 카카오
- 정렬
- 재귀함수
- 그리디
Archives
- Today
- Total
상상쓰
[프로그래머스] 방의 개수 본문
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
'Coding Test' 카테고리의 다른 글
[백준] 가장 긴 증가하는 부분 수열 (0) | 2021.10.04 |
---|---|
[백준] 라면 사기 (Small) (2) | 2021.10.01 |
[백준] 배 (0) | 2021.09.29 |
[백준] 카드 구매하기 (0) | 2021.09.28 |
[프로그래머스] 8주차_최소직사각형 (0) | 2021.09.27 |
Comments