목록Coding/Coding Test & Algorithm (60)
호기심 많은 분석가
코딩테스트 연습 - 가장 큰 수 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 programmers.co.kr def solution(numbers): numbers = list(map(str, numbers)) numbers.sort(key=lambda x: x*3, reverse=True) return str(int("".join(numbers))) 이번 문제의 풀이는 정말 경이롭다. 총 2가지의 실패를 경험하고 다른 분의 코드를 참고했다. 첫 번째는 str형태는 sort 해줬을 때 앞의 자리 수에 따라..
코딩테스트 연습 - K번째수 [1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3] programmers.co.kr 내 풀이 def solution(array, commands): return [sorted(array[com[0]-1:com[1]])[com[2]-1] for com in commands] 다들 최대한 짧게 코딩하는 것을 좋아해 보여서 한 줄로 코딩해보았다. sort함수가 너무 잘 구현되어 있기 때문에 문제의 설명에 따라 진행하기만 하면 쉽게 해결할 수 있음. 또한 list comprehension은 역시 쓸 때마다 기분이 좋아지는 문법이야.
코딩테스트 연습 - 더 맵게 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같 programmers.co.kr 내 풀이 import heapq def get_sco(d1, d2) : return d1+d2*2 def solution(scoville, K): answer = 0 heapq.heapify(scoville) while True : if len(scoville) == 1 and scoville[0] < K : return -1 first = heapq.heappop(scoville) second = heapq.heappop(scoville) heap..
코딩테스트 연습 - 다리를 지나는 트럭 트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 programmers.co.kr def solution(bridge_length, weight, truck_weights): gone = [] going = [] ready = truck_weights.copy() answer = 1 go_tm = 1 while truck_weights : if len(going)!=0 and going[0][1] == bridge_length : gone.append(going.pop(0)) if len(gone) == len(tr..
코딩테스트 연습 - 위장 programmers.co.kr from functools import reduce def multiply(arr) : return reduce(lambda x, y : x*y, arr) def solution(clothes): answer = {} for name, spe in clothes : if spe not in answer : answer[spe] = set() answer[spe].add(name) return multiply([len(answer[i])+1 for i in answer])-1 내 풀이 이 문제는 살짝의 수학이 동반되면 쉬워진다. 모든 옷의 경우 입냐, 입지 않냐의 2가지의 경우로 나누어진다. 상의가 n가지 있을 경우 고르는 n가지와 입지 않는 1가지..
코딩테스트 연습 - 전화번호 목록 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조 programmers.co.kr def solution(phone_book): answer = True phone_book.sort() for i in range(len(phone_book)-1) : if phone_book[i] == phone_book[i+1][:len(phone_book[i])]: return False return answer 우선 sort 문법을 통해 배열을 앞자리 크기 순으로 정렬해준다. 그러면 ["12", "124", "1235"] -> ["12", "1235"..
코딩테스트 연습 - 완주하지 못한 선수 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수 programmers.co.kr from collections import Counter def solution(participant, completion): ans = Counter(participant)-Counter(completion) answer = list(ans.elements())[0] return answer 처음 봤을 때 가장 먼저 Counter 문법을 떠올리긴 했지만, Counter 결과끼리 뺄셈 연산이 되는지 몰라서 for문으로 풀었다. for문은 역시..
11399번: ATM 첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000) www.acmicpc.net from sys import stdin n = int(stdin.readline()) ans_list = list(map(int, stdin.readline().split())) ans_list = sorted(ans_list) result = 0 for i in range(len(ans_list)): result += ans_list[i]*(len(ans_list)-i) print(result) 요번 문제는 깔끔히 잘 풀었다고 생각한다. 핵심은 최대한 덜 기다리기 위해 인출하는 데 시간이 짧..
9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net from sys import stdin n = int(stdin.readline()) ans_list = [int(stdin.readline().strip()) for _ in range(n)] arr = [0]*12 arr[1]=1 arr[2]=2 arr[3]=4 for i in range(4, 12) : arr[i] = arr[i-1]+arr[i-2]+arr[i-3] for ans in ans_list : print(arr[ans]) 이번 문제도 점화식을 세우면 가볍게 해결할 수 있었다. $$ A_n = A_{n-1} + A_{n-2} + A_{n-3} $..
2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. www.acmicpc.net from sys import stdin n = int(stdin.readline()) graph = [list(map(int, stdin.readline().split())) for _ in range(n)] white, blue = 0, 0 def get_block(x,y,n) : global white, blue color = graph[x][y] for i in range(x, x+n): for j in range(y, y+n) ..