1. 카펫
접근방법
1.
brown 가로 ≥ yellow 가로 + 2
brown 세로 ≥ yellow 세로 + 2
노란색을 기준으로 코드를 짜야겠다 !!
2.
너비 * 높이 = total = brown + yellow
3.
노란색의 높이를 1부터 height ≤ width까지 반복한다.
4.
2 * 가로길이 + 2 * 세로길이 = brown 수 + 4
def solution(brown, yellow):
answer = []
# brown 가로 >= yellow 가로+2
# brown 세로 >= yellow 세로+2
total = brown + yellow
for height in range(1, total+1):
if (total / height) % 1 == 0:
width = total / height
if width >= height:
if 2*width + 2*height == brown+4:
answer = [width, height]
return answer
Python
복사
1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 | 1 |
2. 피로도
접근방법
1.
그리디
a.
최소피로도가 높고, 소모피로도가 작은 순으로 정렬 (람다식사용)
b.
이렇게 할 경우 반례가 존재할 수 있음 (최소피로도, 소모피로도가 둘 다 높은 경우)
2.
완탐
a.
던전을 던전의 갯수만큼 순열을 생성해서 (nPr)
b.
각 던전을 돌 때 1. 최소피로도 보다 높을 경우 돌 수 있음 2. 던전에 입장하면 power가 깎임
c.
방금 순회한 결과값 갯수가 이전 순회한 결과값 갯수 보다 크면 answer에 할당
from itertools import permutations
def solution(k, dungeons):
answer = -1
dungeon_cnt = len(dungeons)
# 순열을 통해 모든 경우의 수 확인
for dungeon in permutations(dungeons, dungeon_cnt):
power = k
cnt = 0
# 순열을 통해 나온 던전 챌린지 시작
for go in dungeon:
if power >= go[0]:
power -= go[1]
cnt += 1
# 지금까지의 cnt와 보다 큰 cnt가 나오면 재할당
if answer < cnt:
answer = cnt
return answer
Python
복사
answer = 0
N = 0
visited = []
def dfs(k, cnt, dungeons):
global answer
if cnt > answer:
answer = cnt
for j in range(N):
if k >= dungeons[j][0] and not visited[j]:
visited[j] = 1
dfs(k - dungeons[j][1], cnt + 1, dungeons)
visited[j] = 0
def solution(k, dungeons):
global N, visited
N = len(dungeons)
visited = [0] * N
dfs(k, 0, dungeons)
return answer
Python
복사
3. 전력망을 둘로 나누기
접근방법(BFS)
1.
bfs 공식을 만든다
a.
1. deque 선언 2. 방문처리를 위한 visited[False] * (n+1) 3. 노드(선입된 값)을 빼면서 인접한 노드 방문처리 4. 시작하는 곳을 True로 바꾸고 while queue: 실행
b.
2개의 전력망은 최소 1개씩 들고 있기에 두 전력망의 차의 절댓값은 최소 2이다 (answer = 2)
c.
인접한 노드들을 각각 배열에 추가
d. bfs의 시작점 start를 설정하기 —> 배열에 값이 있는 경우 start(= 인접한 곳이 있을 경우)
e. 두 전력망의 차이(절대값 abs사용)
from collections import deque
def bfs(graph, start, visited):
queue = deque([start])
visited[start] = True
cnt = 0
while queue:
x = queue.popleft()
cnt += 1
for i in graph[x]:
if not visited[i]:
queue.append(i)
visited[i] = True
return cnt
def solution(n, wires):
answer = n-2 # 최대 n-2개
for i in range(len(wires)):
temps = wires[:]
graph = [[] for _ in range(n+1)]
visited = [False] * (n+1)
temps.pop(i)
# 연결된 곳들 파악
for wire in temps:
x, y = wire
graph[x].append(y)
graph[y].append(x)
# start 변경로직
for idx, check in enumerate(graph):
if check != []:
start = idx
break
# 개수
first_cnts = bfs(graph, start, visited)
second_cnts = (n - first_cnts)
if abs(first_cnts - second_cnts) < answer:
answer = abs(first_cnts - second_cnts)
return answer
graph = [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]]
print(solution(9, graph))
Python
복사