목록알고리즘 문제 (44)
배고픈 개발자 이야기
- 문제 - 철수가 동생이랑 롤케이크를 나눠 먹는다. 롤케이크 위에 토핑을 일렬로 올리는데, 케잌의 크기와 토핑의 개수의 상관없이 잘랐을 때, 토핑의 종류가 같으면 공평하게 나눈것이고, 공평하게 자르는 경우의 수를 반환하면 된다. - 풀이 - 1. 처음엔 왼쪽, 오른쪽으로 나누어 원소를 넣고 빼며 set, list, len을 사용하였더니 시간초과가 떳다. 2. 인터넷을 슬쩍 참고하여 리스트의 개수를 dict로 변경해주는 Counter를 사용하여 효율성을 올렸다. 3. 왼쪽은 set에 계속 더해주고, 오른쪽 조각은 dict에서 값을 빼주는 식으로 갱신하여, 길이를 비교하도록 하였다. - 결과 - 100점~ # programmers exercise task # https://school.programmers..
n개의 노드와 연결되어 있는 간선 정보인 edge가 주어진다. 문제는 1번노드에서 가장 멀리 떨어진 노드의 개수를 구하는 문제이다. - 풀이 - 1. edge로 graph를 간선간 가중치가 1인 형태로 먼저 저장한다. 2. 1번 노드를 start로, 2 ~ n번 노드를 destination으로 dijkstra로 최단거리를 각각 계산한다. 3. 최단거리의 max 값을 취한 후 동일한 거리를 가진 노드들의 개수를 센다. - 결과 - 100점~ # programmers graph task # https://school.programmers.co.kr/learn/courses/30/lessons/49189?language=python3 import heapq graph = {} def dijkstra(start..
단순 구현 문제이다. 문제 지문에 맞게 코드를 구현하기만 하면 된다. def solution(new_id): answer = '' for x in new_id: if x.isupper(): answer += x.lower() else: answer += x answer, new_id = '', answer for x in new_id: if not 96 < ord(x) < 123: if not 47 < ord(x) < 58: if not ord(x) in [95, 45, 46]: continue answer += x answer, new_id = '', answer i = 0 while i < len(new_id): answer += new_id[i] if ord(new_id[i]) == 46: i +=..
괄호 맞추기 문제로 stack 개념을 사용하여 풀었다 요점은 다음 함수 2개를 잘 구현하면된다. 1. 올바른 괄호쌍을 검사하는 함수 2. u, v로 나누어 규칙에 맞게 처리하는 함수 def compact(p): stack = [] for x in p: if x == '(': stack.append('(') else: if not stack: return False stack.pop() return True def seperate(p): if not p: return p l, r = '', '' if p[0] == '(': l, r = '(', ')' else: l, r = ')', '(' stack = [] idx = 0 for i, x in enumerate(p): if x == l: stack.app..
중복되는 뉴스를 편리하게 제공하기 위해 뉴스기사 제목의 자카드 유사도를 검사하는 문제 뉴스제목을 부분집합으로 만들어 (교집합/합집합) * 65536의 값을 구하는 문제입니다. 주의점 - 대소문자를 구분하지 않는다. - 영어 소문자 이외의 단어가 들어간 부분집합은 제외한다. - 둘 다 공집합인 경우는 자카드 유사도를 1로 정의한다 (나눠지지 않으므로) - intersection, union을 파이썬 set함수로 구하면 중복 부분집합이 제거되므로 직접 구현한다. 위의 주의점만 신경쓰면 된다. def solution(str1, str2): answer = 0 sub_str1, sub_str2 = list(), list() len_str1, len_str2 = len(str1), len(str2) for i i..
나중에 # "100-200*300-500+20" 60420 import copy def calculate(prior, tokenizes): tokenize = copy.deepcopy(tokenizes) for queue in prior: i = 1 while queue in tokenize: if tokenize[i] == queue: num = 0 if queue == "+": num = tokenize[i-1] + tokenize[i+1] elif queue == "-": num = tokenize[i-1] - tokenize[i+1] else: num = tokenize[i-1] * tokenize[i+1] del tokenize[i+1] del tokenize[i] tokenize[i-1] = ..
규칙이 귀찮지만 어렵진 않음 def solution(dartResult): i, idx, length = 0, 0, len(dartResult) score = [] while idx < length: temp_score = 0 if dartResult[idx+1] == "0" and dartResult[idx] =="1": temp_score = 10 idx += 1 else: temp_score = int(dartResult[idx]) if dartResult[idx+1] == "S": temp_score = int(temp_score) ** 1 if dartResult[idx+1] == "D": temp_score = int(temp_score) ** 2 if dartResult[idx+1] == "..
이진수 변환 및 합치는 문제 쉬움 def solution(n, arr1, arr2): answer = [] for i in range(n): temp = [" "]*n num1, num2 = arr1[i], arr2[i] for j in range(n): a1, a2 = int(num1 / 2), int(num2 / 2) b1, b2 = int(num1 % 2), int(num2 % 2) if b1 or b2: temp[n-j-1] = "#" num1, num2 = a1, a2 # if a != 0: # num = a # else: # break answer.append(''.join(map(str, temp))) return answer