전체 글
-
[백준 1260번] DFS와 BFSCoding Test/백준 2021. 1. 4. 21:33
# 문제 내 풀이 from collections import deque import sys input = sys.stdin.readline # 조금 더 빠르게 입력 받기 n, m, v = map(int, input().split()) graph = [[] for _ in range(n + 1)] for i in range(m): n1, n2 = map(int, input().split()) graph[n1].append(n2) graph[n2].append(n1) # graph의 각각 노드에 대하여 인접한 노드 정보를 오름차순으로 정렬 for i in range(n + 1): graph[i].sort() dfs_visited = [False] * (n + 1) # dfs 방문 정보를 담을 배열 생성 bf..
-
[알고리즘] 최단 경로 (Shortest Path) - 플로이드 워셜 (Floyd-Warshall)Computer Science/자료구조 & 알고리즘 2021. 1. 4. 20:15
# 플로이드 워셜 알고리즘 (Floyd-Warshall Algorithm) 1. 플로이드 워셜 알고리즘 개요 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)은 최단 경로를 구하는 또 하나의 대표적 알고리즘이다. 다만, 다익스트라 알고리즘이 '한 지점에서 다른 특정 지점까지의 최단 경로를 구하는 경우'에 사용한다면, 플로이드 워셜 알고리즘은 '모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구하는 경우'에 사용한다. 플로이드 워셜은 다익스트라처럼 단계별로 거쳐가는 노드를 기준으로 알고리즘을 수행하지만 매 단계마다 방문하지 않은 노드 중에 최단 거리를 갖는 노드를 찾는 과정이 없다. 그리고 2차원 테이블에 모든 노드의 최단 거리 정보를 저장하며, 이를 점화식을 통해 갱신한다는 점에..
-
[프로그래머스 42747번] H-IndexCoding Test/프로그래머스 2020. 12. 23. 00:12
# 문제 내 풀이 def solution(citations): answer = 0 citations.sort() n = len(citations) cnt = 1 # 뒤에서부터 h번 이상 인용된 논문이 h편 이상이 되는 위치 찾기 for i in range(n - 1, -1, -1): if citations[i] < cnt: answer = cnt - 1 break cnt += 1 # h의 최댓값이 모든 논문의 개수일 경우 if len(citations) == cnt - 1: answer = cnt - 1 return answer 지향할 답안 def solution(citations): citations = sorted(citations) l = len(citations) for i in range(l):..
-
[프로그래머스 42842번] 카펫Coding Test/프로그래머스 2020. 12. 21. 19:38
# 문제 내 풀이 - 시간초과로 문제 풀이 실패, 수정 답안 # 관계식을 구해 이차방정식으로 정리한 다음 근의 공식 사용 def solution(brown, yellow): term = (((brown + 4) / 2) ** 2 - 4 * (brown + yellow)) ** 0.5 w = ((brown + 4) / 2 + term) / 2 h = ((brown + 4) / 2 - term) / 2 return [w,h] 문제점 문제의 조건을 꼼꼼히 보면 조건식 2개로 2차 방정식을 만들어 문제를 해결할 수 있었다. 조건식을 꼼꼼히 보고 수학적 방향의 풀이도 생각해보자.
-
[프로그래머스 42746번] 가장 큰 수Coding Test/프로그래머스 2020. 12. 21. 02:44
# 문제 내 풀이 - 시간초과, 수정 답안 def solution(numbers): numbers.sort(key=lambda x: str(x) * 3, reverse=True) return str(int(''.join(map(str, numbers)))) 원래의 내 풀이 - 완전 탐색으로 접근해 답은 맞으나 시간 초과 from itertools import permutations def solution(numbers): max_num = '0' # 만들 수 있는 가장 큰 수 저장 # 만들 수 있는 모든 수를 순열로 확인 p_numbers = permutations(numbers, len(numbers)) # 모든 경우의 수를 문자열 상태로 비교하며 가장 큰 수 탐색 for p in p_numbers: ..
-
[프로그래머스 42883번] 큰 수 만들기Coding Test/프로그래머스 2020. 12. 20. 02:36
# 문제 내 풀이 def solution(number, k): answer = '' idx = 0 # 매 단계에서 가장 큰 숫자의 인덱스 while k > 0: # 제거할 것이 있을 때까지 max_val = '-1' start_idx = idx # 이번 단계의 시작 인덱스를 기록 # 시작 인덱스부터 뒤로 k + 1개 만큼 탐색하여 가장 큰 수 찾음 for i in range(idx, idx + k + 1): if eval(number[i] + '>' + max_val): max_val = number[i] idx = i # 만일 찾은 수가 9라면 뒷 부분은 더 탐색하지 않고 루프 종료 if max_val == '9': break answer += number[idx] k -= idx - start_idx..
-
[프로그래머스 42578번] 위장Coding Test/프로그래머스 2020. 12. 19. 17:13
# 문제 내 풀이 - 문제 풀이 실패, 지향할 답안 def solution(clothes): answer = 1 # dictionary 형태로 재구성 c_dict = {} for val, key in clothes: if key in c_dict.keys(): c_dict[key].append(val) else: c_dict[key] = [val] # 안 입은 경우의 수를 포함해서 옷의 종류 별 개수들을 각각 곱함 for val in c_dict.values(): answer *= (len(val) + 1) return answer - 1 # 하나도 안 입은 경우의 수를 빼고 반환 주목할 점 Dictionary 자료형의 Value 값을 List 재구성하는 방법을 도저히 모르겠었는데 다른 분의 답안을 보며..