1. Problem
2. My Solution
from collections import deque
def bfs(x,y,depth,maps):
n = len(maps)
m = len(maps[0])
move = [(-1,0),(1,0),(0,-1),(0,1)]
queue = deque()
queue.append((x,y,depth))
maps[x][y] = 0
while (queue):
x,y,depth = queue.popleft()
if x == n-1 and y == m-1:
return depth
for dx, dy in move:
nx = x + dx
ny = y + dy
if 0 <= nx < n and 0 <= ny < m and maps[nx][ny] == 1:
queue.append((nx,ny,depth+1))
maps[nx][ny] = 0
return -1
def solution(maps):
return bfs(0,0,1,maps)
1. Problem
2. My Solution
target_loc
target_val
target_loc
의 좌표 공간에 순서대로 회전시킨target_val
값을 삽입target_val
에서 가장 작은 값을 answer 에 삽입하면 됨from collections import deque
def rotate_and_find(x1,y1,x2,y2,arr):
target_loc = []
target_val = deque()
# 상
for y in range(y1,y2):
target_loc.append((x1,y))
target_val.append(arr[x1][y])
# 우
for x in range(x1, x2):
target_loc.append((x,y2))
target_val.append(arr[x][y2])
# 하
for y in range(y2, y1, -1):
target_loc.append((x2,y))
target_val.append(arr[x2][y])
# 좌
for x in range(x2, x1, -1):
target_loc.append((x,y1))
target_val.append(arr[x][y1])
# rotate
target_val.appendleft(target_val.pop())
# find_min
min_val = min(target_val)
# rotate_apply
for x,y in target_loc:
arr[x][y] = target_val.popleft()
return min_val
def solution(rows, columns, queries):
answer = []
arr = [[0] * (columns+1) for _ in range(rows+1)]
# 행렬에 숫자 지정
for i in range(1,rows+1):
for j in range(1,columns+1):
arr[i][j] = ((i-1) * columns + j)
for x1,y1,x2,y2 in queries:
answer.append(rotate_and_find(x1,y1,x2,y2,arr))
return answer
1. Problem
2. My Solution
위와 같이 문제 해결에 필요한 로직을 뽑아냈지만 3,4,5 구현하는 방법을 생각해내지 못했음
3. Others' Solutions
1,2,4,5 번 해결
- 3차원visited[x][y][나가는 방향]
을 이용하여 해당 격자에서 특정 방향으로 빛을 쏴보고(2번), 또한 나간적이 있는지 판단한다. 만약 빛이 나가야되는 방향으로 이미 나간적이 있다면 (3차원 값이 True) 빛을 쏜 격자로 다시 돌아왔다는 의미이고 동시에 싸이클이 형성되었다는 의미이므로 이동 횟수를 return 하면됨(4번 필요없음). 또한 빛을 쏴야되는 방향값이 True 라면 해당 싸이클은 이미 count 되었으므로 pass 하면됨(5번)
3 번 해결
- 빛의 방향을 시계방향[↑,→,↓,←]
[(-1,0),(0,1),(1,0),(0,-1)]
으로 매핑하게끔 설정하고 들어오는 방향에 +1 하면 오른쪽으로 방향을 틀고, -1 하면 왼쪽으로 방향을 틀게끔 구현할 수 있음
if grid[x][y] == 'R':
d = (d+1) % 4
if grid[x][y] == 'L':
d = (d-1) % 4
import sys
sys.setrecursionlimit(10**8)
move = [(-1,0),(0,1),(1,0),(0,-1)]
def light(x,y,d,grid,cnt):
dx, dy = move[d]
nx = (x + dx) % n
ny = (y + dy) % m
if grid[nx][ny] == 'R':
d = (d+1) % 4
if grid[nx][ny] == 'L':
d = (d-1) % 4
if visited[nx][ny][d] == True:
return cnt
else:
visited[nx][ny][d] = True
return light(nx,ny,d,grid,cnt+1)
def solution(grid):
global n,m, visited
answer = []
n = len(grid)
m = len(grid[0])
visited = [[[False] * 4 for _ in range(m)] for _ in range(n)]
for x in range(n):
for y in range(m):
for d in range(4):
if visited[x][y][d] == False:
answer.append(light(x,y,d,grid,0))
answer.sort()
return answer
move = [(-1,0),(0,1),(1,0),(0,-1)]
def light(x,y,d,grid):
cnt = 0
while (True):
dx, dy = move[d]
x = (x + dx) % n
y = (y + dy) % m
if grid[x][y] == 'R':
d = (d+1) % 4
if grid[x][y] == 'L':
d = (d-1) % 4
if visited[x][y][d] == True:
return cnt
else:
visited[x][y][d] = True
cnt += 1
def solution(grid):
global n,m, visited
answer = []
n = len(grid)
m = len(grid[0])
visited = [[[False] * 4 for _ in range(m)] for _ in range(n)]
for x in range(n):
for y in range(m):
for d in range(4):
if visited[x][y][d] == False:
answer.append(light(x,y,d,grid))
answer.sort()
return answer
4. Learned
global
키워드를 이용하여 전역변수로 지정할 수 있고, 또한 사용할 수 있음1. Problem
2. My Solution
from itertools import permutations
def solution(numbers):
possible = list(permutations(numbers, len(numbers)))
possible_str = []
for i in possible:
possible_str.append(''.join(map(str,i)))
return max(possible_str)
아래와 같은 방법을 생각해봄
sort.arr(key = lambda x:(-x[0],-x[1],-x[2],-x[3])
하지만 자릿수가 1개인 것은 인덱스 에러가 발생하는 문제가 있기 때문에 자릿수를 맞추기 위해서 0으로 채운다 ? 도 생각해봤지만 1, 10, 100, 1000 을 구별할 방법이 없음. 또한 5, 54 는 5000, 5400 이 되서 545 가 됨 (554가 정답)
3. Others' Solutions
sort.arr(key = lambda x:(-x[0],-x[1],-x[2],-x[3])
처럼 적용됨def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x * 3, reverse=True)
return str(int(''.join(numbers)))
4. Learned
1. Problem
2. My Solution
위 경우 어느 것도 속하지 않으면 올바른 괄호임
from collections import deque
def solution(s):
if len(s) % 2 == 1:
return 0
answer = 0
s = deque(s)
pre = False
for x in range(len(s)):
stack = []
s.append(s.popleft())
flag = True
if pre == True:
pre = False
continue
for i in s:
if i in ["[", "{", "("]:
stack.append(i)
elif not stack:
flag = False
break
else:
j = stack.pop()
if (j == "[" and i != "]") or \
(j == "{" and i != "}") or \
(j == "(" and i != ")"):
flag = False
break
if flag == True:
answer += 1
pre = True
return answer
3. Learned
==
연산으로 코딩하여 잘못된 부분을 찾느라 시간이 걸리는 경우가 자주 있는데 조심하자 ! 1. Problem
2. My Solution
import heapq
def dijkstra(start):
h = []
distance[start] = 0
heapq.heappush(h, (0,start))
while h:
dist, now = heapq.heappop(h)
if distance[now] < dist:
continue
for edge in graph[now]:
cost = dist + edge[1]
if cost < distance[edge[0]]:
distance[edge[0]] = cost
heapq.heappush(h,(cost,edge[0]))
def solution(N, road, K):
global distance, graph
answer = 0
inf = 10e10
distance = [inf] * (N+1)
graph = [[] for _ in range(N+1)]
for a,b,dist in road:
graph[a].append((b,dist))
graph[b].append((a,dist))
dijkstra(1)
for dist in distance:
if dist <= K:
answer += 1
return answer
3. Learned
1. Problem
2. My Solution
from collections import deque
def solution(n,a,b):
# round of 8 = 8강
round = n
answer = 1
player_list = deque(range(1,n+1))
while(round > 1):
if len(player_list) == (round//2):
round //= 2
answer += 1
p1 = player_list.popleft()
p2 = player_list.popleft()
if (p1 == a and p2 == b) or (p1 == b and p2 == a):
break
if (p2 == a or p2 == b):
player_list.append(p2)
else:
player_list.append(p1)
return answer
1. Problem
2. My Solution
from itertools import permutations
def solution(k, dungeons):
routes = list(permutations(dungeons,len(dungeons)))
answer = 0
for route in routes:
cnt = 0
p = k
route = list(route)
while(route):
if route[-1][0] > p:
break
p -= route.pop()[1]
cnt += 1
answer = max(answer, cnt)
return answer
3. Learned
1. Problem
2. My Solution
10%를 계산한 금액이 1 원 미만인 경우에는 이득을 분배하지 않고 자신이 모두 가집니다.
문제 조건 때문에 실적을 합산해서 DFS 를 수행하면 안되고 각각 나눠서 계산해야함 import sys
sys.setrecursionlimit(10**8)
def dfs(start):
commission = []
net_profit = []
for i in member[start][2]:
profit = i * 100
commission.append(int(profit * 0.1))
net_profit.append(profit - int(profit * 0.1))
for i in member[start][1]:
commissions = dfs(i)
for j in commissions:
if int(j * 0.1) < 1:
net_profit.append(j)
else:
net_profit.append(j - int(j*0.1))
commission.append(int(j*0.1))
member[start][3] = sum(net_profit)
return commission
def solution(enroll, referral, seller, amount):
global member
# {'나': [부모, 자식들[], 실적, 이익}
member = {'center':['',[],[],0]}
# 멤버 조직도 구성
for i in range(len(enroll)):
me = enroll[i]
parent = referral[i]
# {'나': [부모, 자식들[], 실적, 이익}
member[me] = ['',[],[],0]
if parent == "-":
member[me][0] = 'center'
member['center'][1].append(me)
else:
member[me][0] = parent # 나에다 부모 넣고
member[parent][1].append(me) # 나를 부모에 넣고
# 멤버 실적 반영
for i in range(len(seller)):
member[seller[i]][2].append(amount[i])
dfs('center')
return [member[i][3] for i in enroll]
3. Others' Solutions