프로그래머스 51

[Python] 실패율

1. 문제 2. 풀이 과정 def solution(N, stages): rate = [0]*(N+2) total = len(stages) #도전자 수 for stage in stages: rate[stage] += 1 result = [] for i, r in enumerate(rate[1:N+1], start = 1): if total == 0: result.append((0, i)) continue temp = rate[i]/total #실패율 total -= rate[i] #스테이지에 도달한 플레이어 수 result.append((temp, i)) return list(map(lambda x:x[1], sorted(result, key = lambda x:x[0], reverse = True)))

[Python] 오픈채팅방

1. 문제 2. 풀이 과정 def solution(record): user = {} result = [] for r in record: order = r.split() if order[0] == "Enter": user[order[1]] = order[2] result.append((order[1], "님이 들어왔습니다.")) elif order[0] == "Leave": result.append((order[1], "님이 나갔습니다.")) elif order[0] == "Change": user[order[1]] = order[2] answer = [] for uid, command in result: temp = user[uid]+command answer.append(temp) return answer

[Python] 방의 개수

1. 문제 2. 풀이 과정 방법 1) arrows를 하나씩 보면서 그 때마다 면이 생기면 count를 했다. 면이 생기는 경우는 크게 두 경우로 나눠볼 수 있다. 1. 이미 지나간 점(vertex)를 또 지나가는 경우 2. 다른 점으로 이동하면서 간선들 간에 교점이 생기는 경우 두 경우는 동시에 발생할 수도 있어서 if를 두 번 사용하여 계산하였다. 여기서 주의해야 할 점은 이미 지나간 간선을 다시 지나가면서 중복 count되지 않도록 해야 한다. 코드에서는 지금 지나가는 간선이 edg에 있는지 확인하는 걸로 중복되지 않도록 했다. def solution(arrows): answer = 0 dxy = [(0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1), (-1, ..

[Python] 순위

1. 문제 2. 풀이 과정 방법 1) 자신의 앞과 뒤에 있는 선수 수의 합이 n-1개면 정확한 순위를 알 수 있다. 한 노드씩 차례대로 살펴보면서, 자신을 이긴 선수와 진 선수의 수를 구한다. 자신을 이긴 선수를 stack에 넣고 꺼내서 그 선수를 이긴 선수들까지 계속 count해나간다. def ncount(n, g, start): visited = [False]*n stack = [start] visited[start] = True while stack: n = stack.pop() for i in g[n]: if not visited[i]: visited[i] = True stack.append(i) return visited.count(True)-1 def solution(n, results): g..

[Python] 가장 먼 노드

1. 문제 2. 풀이 과정 방법 1) heapq 이용, 방법 2)를 추천 import heapq as hq def solution(n, edge): answer = 0 graph = [[] for _ in range(n+1)] distance = [int(1e9)]*(n+1) for x, y in edge: graph[x].append(y) graph[y].append(x) q = [] hq.heappush(q, (0, 1)) #최소거리, 시작노드 번호 distance[1] = 0 while q: d, node = hq.heappop(q) for n in graph[node]: if distance[n] == int(1e9): #방문하지 않은 노드라면 hq.heappush(q, (d+1, n)) dist..

[Python] 도둑질

1. 문제 2. 풀이 과정 방법 1) result 배열을 만들고 각 집을 털 때마다 자신보다 -2, -3인 지점으로부터 [시작점 포함한 경우, 포함하지 않은 경우] 두 값을 계산하여 저장한다. def solution(money): l = len(money) result = [[0, 0]] result.append([0, money[0]]) #시작점 포함, 시작점 포함X result.append([money[1], 0]) for i in range(3, l+1): temp = [0, 0] temp[0] = money[i-1] + max(result[i-2][0], result[i-3][0]) temp[1] = money[i-1] + max(result[i-2][1], result[i-3][1]) resul..

[Python] 여행경로

1. 문제 2. 풀이 과정 방법 1) BFS from collections import deque def solution(tickets): answer = [] #티켓을 출발점을 key로 저장 hash_map = {} for a, b in tickets: if a in hash_map: hash_map[a].append([a, b]) else: hash_map[a] = [[a, b]] def bfs(start): q = deque() #출발하는 지점의 티켓 넣기 for h in hash_map[start]: q.append([h]) while q: arr = q.popleft() #모든 티켓을 사용할 수 있는 경우 답에 추가 if len(arr)==len(tickets): temp = start for ..

[Python] 등굣길

1. 문제 2. 풀이 과정 방법 1) 필요한 부분만 보고 count def solution(m, n, puddles): answer = 0 arr = [[0]*(m) for _ in range(n)] #웅덩이는 -1로 표기 if puddles != [[]]: for x, y in puddles: arr[y-1][x-1] = -1 q = set() #중복 제거 q.add((0, 0)) arr[0][0] = 1 while q: temp = set() for a, b in q: if a == n-1 and b == m-1: return arr[a][b]%1000000007 #하 na = a + 1 if na < n and arr[na][b] != -1: arr[na][b] += arr[a][b] temp.ad..