코드 47

[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) 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] N으로 표현

1. 문제 2. 풀이 과정 방법 1) N을 한 개 사용할 때부터 8개까지 사용할 때까지 돌면서, 찾는 값이 나오면 종료한다. 1개일 때 : N(1) 2개일 때 : N(1) + 연산자 + N(1) 3개일 때 : N(1) + 연산자 + N(2), N(2) + 연산자 + N(1) ... 여기서 연산자가 +, *일 때는 연산자 기준으로 좌우가 바뀌어도 같은 값이지만 -, //는 다른 값이 나올 수 있어서 추가로 고려해주어야 한다. def solution(N, number): answer = 0 arr = [] for i in range(1, 9):#사용하는 N의 수 temp = set() #중복제거를 위해 집합 사용 temp.add(int(str(N)*i)) #5, 55, 555 for j in range(1,..

[Python] 이중우선순위큐

1. 문제 2. 풀이 과정 방법 1) remove하면 heap구조가 깨지지만 잘 작동한다. 이유는 최댓값을 빼서 구조가 깨진 후, min_h에서 pop하거나 push할 때 다시 heap 구조를 만들기 때문이다. 따라서, 작동하는 데에는 문제가 없지만 max값을 찾는 데에서 시간이 비교적 많이 걸린다. import heapq as hq def solution(operations): answer = [0, 0] min_h = [] #기본 for operation in operations: order, num = operation.split() num = int(num) if order == 'I': hq.heappush(min_h, num) elif min_h and order == 'D': if num =..

[Python] 디스크 컨트롤

1. 문제 2. 풀이 과정 방법 1) import heapq as hq def solution(jobs): answer = 0 jobs.sort() heap = [] count = 0 #시간 pre_idx = -1 while True: #전에 heap에 안들어갔었고, 현재 count보다 작은 값 heap에 넣기 temp = pre_idx for i in range(temp+1, len(jobs)): if jobs[i][0] > count: break hq.heappush(heap, [jobs[i][1], jobs[i][0]]) pre_idx = i if heap: e = hq.heappop(heap) count += e[0] #요청 처리 끝낸 후 answer += count - e[1] #현재 시각 - ..

[Python] 베스트앨범

1. 문제 2. 풀이 과정 방법 1) def solution(genres, plays): answer = [] hash1 = {} #장르별 분류 [재생횟수, 고유번호] 쌍을 저장 hash2 = {} #장르별 속한 노래들의 재생 수의 합 for i in range(len(genres)): #장르별 분류 if genres[i] not in hash1.keys(): hash1[genres[i]] = [] hash1[genres[i]].append([-plays[i], i]) #정렬하기 쉽게 재생 횟수를 -로 저장 #속한 노래들의 재생 수의 합 if genres[i] not in hash2.keys(): hash2[genres[i]] = 0 hash2[genres[i]] += plays[i] #합이 큰 순서대로..