목록공부/알고리즘 (13)
기록을 합시다.

문제 요약 입을 수 있는 총 옷가지 수 (다 벗는 건 안됨ㅋ) 내가 생각한 로직 모든 경우의 수들을 구해준다. 구한 수들의 최대값을 구한다. 최대값까지의 소수들을 구한다. 소수들이 내가 구한 경우의 수들에 포함되는지 확인한다. 파이썬으로 제출한 정답 import collections import itertools def solution(numbers): numbers_list = list(numbers); number_combis=[] for i in range(1, len(numbers_list)+1): number_combis.extend(itertools.permutations(numbers_list, i)) max_num = 0 number_combi_list = [] for combi in se..

문제 요약 입을 수 있는 총 옷가지 수 (다 벗는 건 안됨ㅋ) 내가 생각한 로직 각 종류의 옷가지 수에 +1(옷 안 입은 거)들을 거듭해서 곱해주고, 마지막에 -1(다 벗은 경우의 수)을 해줘야 한다. 파이썬으로 제출한 정답 from collections import Counter def solution(clothes): clothes_dic = Counter([clothe[1] for clothe in clothes]) count = 1 for count_clothes in clothes_dic.values(): count = count*(count_clothes + 1) return count-1 자바로 제출한 정답 import java.util.*; class Solution { public int..

문제 요약 파이썬으로 제출한 정답 def solution(n, computers): visited = [False]*(n+2) tree = 0 for i in range(n): if visited[i] == False: DFS(n, i, visited, computers) tree += 1 return tree def DFS(n, start, visited, computers): visited[start] = True for i in range(n): if (visited[i] == False) and (computers[start][i]==1): DFS(n, i, visited, computers) 자바로 제출한 정답 import java.util.*; class Solution { public int..

문제 요약 모든 기능들은 매일 개발 하되, 맨 앞의 일들이 개발 완료된 후에야 뒤에 완료된 연속된 일들도 동시에 배포한다. 한 번 배포할 때, 몇 개의 기능들을 배포하게 되는지 구하라. 내가 생각한 로직 첫 번째 기능의 100-현재 진행상황을 구하고, 이를 개발 속도와 나눠 총 며칠 후에 개발이 완료되는지 확인한다. 구한 일 수를 가지고, 모든 기능들의 개발 상황에 개발 속도*구한 일 수를 더해준다. 파이썬으로 제출한 정답 import math import collections def solution(progresses, speeds): q = collections.deque(progresses); s = collections.deque(speeds); answer = [] count = 0 while ..

문제 요약 임의의 전화번호가 다른 전화번호의 앞자리와 같으면 false를 반환, 그렇지 않다면 true를 반환해준다. 파이썬으로 제출한 정답 def solution(phone_book): for i in range(len(phone_book)-1): for j in range(i+1, len(phone_book)): if len(phone_book[i]) len(phone_book[j]): #접두사가 하나라도 있으면 False if phone_book[i].startswith(pho..

문제 요약 주어진 배열의 순서를 바꾸지 않고, +/-를 이용하여 주어진 숫자가 나오도록 하는 방법을 구하라. 내가 생각한 로직 각각의 숫자가 +/-일 루트가 두 가지 가지로 쪼개진다. 마지막의 숫자를 더했을 때, 주어진 숫자가 나올 때, 방법 1가지가 나온다. 파이썬으로 제출한 정답 def solution(numbers, target): sup = [0] for i in numbers: sub = [] for j in sup: sub.append(j + i) sub.append(j - i) sup = sub return sup.count(target) 자바로 제출한 정답 class Solution { int answer = 0; public int solution(int[] numbers, int tar..

문제 요약 문제를 푸는 사람은 총 세 명, 각각 문제를 찍는 방법은 다르다. 문제의 정답을 제일 많이 맞춘 사람(사람들)의 배열이 답이다. 내가 생각한 로직 각각의 사람들과 정답을 비교하여, scores라는 배열에 사람들의 점수를 담는다. 배열의 최대값을 구하여, 사람들이 최대값을 충족하는지 확인하고, 만약 충족한다면 새 배열에 사람을 담는다. python으로 제출한 정답 def solution(answers): length = len(answers) first_person_answer = [1,2,3,4,5] * 5001 second_person_answer = [2,1,2,3,2,4,2,5] * 1251 third_person_answer = [3,3,1,1,2,2,4,4,5,5] * 1001 sco..

문제 요약 마라톤에 참여 하였지만 마라톤을 완주하지 못 한 사람을 구해야 한다. 중복된 이름이 있어서 그 점을 유의해야 한다. 문제에 나와있듯, 완주하지 못 한 사람은 딱 한 명이다. 내가 생각한 로직(python) collections 라이브러리의 Counter 클래스를 사용하여, 완주한 사람과 완주하지 못 한 사람을 이름 별로 세어준 딕셔너리 생성 딕셔너리들끼리 -연산을 한다. (python에서는 딕셔너리끼리 +, - 연산 가능) 값이 0이 아닌 이름이 곧 정답 파이썬으로 제출한 정답 from collections import Counter def solution(participant, completion): participant_dic = Counter(participant) completion_d..

문제 요약 모든 명함을 담을 수 있는 명함 케이스의 크기를 구하라 명함의 크기는 가로, 세로로 회전해서 넣을 수 있으므로 이 점 고려해야함 내가 생각한 로직 모든 명함의 가로, 세로를 크기 순으로 정렬한다. (ex. [30,70] => [70,30]) 크기순으로 정렬한 명함들 안에서 첫 번째 요소의 max값과 두 번째 요소의 max값을 구한다. 파이썬으로 제출한 정답 def solution(sizes): sorted_sizes = [] max_width = -1 max_height = -1 for size in sizes : n, m = size if n >= m: sorted_sizes.append(size) else: sorted_sizes.append([m, n]) for size in sorted..

문제 요약 commands변수에 담긴 명령들을 이용해서 배열을 부분 정렬하고, 부분 정렬한 곳에서 특정 인덱스의 값들을 반환하라. 파이썬으로 제출한 정답 def solution(array, commands): answer = [] for command in commands: a, b, idx = command new_list = sorted(array[a-1:b]) answer.append(new_list[idx-1]) return answer자바로 제출한 정답 import java.util.*; class Solution { public List solution(int[] array, int[][] commands) { List answer = new ArrayList(); for(int[] comma..