1. 시각처음엔 시간 따로, 분 따로, 초 따로 정수를 체크했는데 ,계속 답이 맞기 않길래 슬쩍 답지 봤더니 .. 체크를 마지막에 한 번만 하더라. # 정수 N이 입력되면# 00시 00분 00초 부터 N시 59분 59초까지의 모든 시각 중에서# 3이 하나라도 포함되는 모든 경우의 수를 구하라# hour : 00 ~ N# minute : 00 ~ 59# second : 00 ~ 59def case_include_3(): cnt = 0 num = input("5 -- ") for h in range(int(num)+1): for m in range(60): for s in range(60): # 매 시각 안에 '3'이 포함되어 있다면..
1. 내 코드def solution(sizes): answer = 0 w, h = 0, 0 for card in sizes: # 카드의 w, h 를 오름차순으로 정렬 card.sort() # w, h 각각의 최댓값을 변수로 할당 if card[0] > w: w = card[0] if card[1] > h: h = card[1] # w, h의 최댓값을 곱해 최소한의 크기를 반환 return w * h 직관적이고 명확하지만,sort() 를 굳이 쓰지 않아도 되는 부분에서 사용해서 다소 비효율적이다.간단한 정렬은 조건문으로 처리하자!! 2. 다른 사람 풀이 def solution..
구현 알고리즘이란?풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제.알고리즘은 간단한데 코드가 지나칠 만큼 길어지는 문제.(ex. 특정 소수점 자리까지 출력, 문자열 입력을 한 문자 단위로 파싱 등 )사소한 조건 설정이 많은 문제일 수록 코드로 구현하기 까다로움.프로그래밍 문법을 정확히 숙지하고 라이브러리 사용 경험이 풍부해야 함. * 구현이 핵심이 되는 유형- 완전 탐색 : 모든 경우의 수를 주저 없이 다 계산하는 해결 방법- 시뮬레이션 : 문제에서 제시한 알고리즘을 한 단계씩 차례대로 직접 수행 구현 시 고려해야 할 메모리 제약 사항1. int 크기 제약대체로 long long 에서 다룰 수 있는 수보다 더 큰 정수를 처리하는 문제는 잘 출제되지 않는다.Java -- long long, B..
1. 내 코드# 각 부서가 신청한 금액만큼을 모두 지원# 최대 몇 개의 부서def solution(d, budget): total = 0 # 적은 금액부터 차례로 더해서 budget 이 커버 가능한 최대 개수 return for i, req in enumerate(sorted(d)): total += req # total 이 budget 을 넘을 경우 if total > budget: return i # total 이 budget 보다 작을 경우 return len(d) sort 를 써서 복잡도는 배열길의 n 의 O(nlogn) 이 된다.일차 반복문 -- O(n)합 및 비교 연산 -- O(1)=> 최..
1. 내 코드for 문에서 리스트를 직접 수정할 경우 수정 직후 반복문이 끝나게 된다.그래서 lost=[3,4] reserve=[4,3] 케이스에서 3만 없어지고 4는 남게 됨.이럴 경우, [:] 를 써서 리스트 카피본으로 반복문을 돌리면 반복문이 끝까지 다 돌 수 있다. 내 코드의 복잡도는 이중 반복문 (X) 과 sort (log) 로,L (lost size), R (reserve size) 라고 할 때,O(L x R + LlogL) 이다.def solution(n, lost, reserve): answer = 0 # 여벌 체육복 중 하나만 도난당했을 경우 for l in lost[:]: if l in reserve: lost.remove(l) ..
# N이 1이 될 떄까지 1 혹은 2 과정을 수행해야 하는 횟수의 최솟값# 1) N-1# 2) N/K -- N이 K로 나누어떨어질 떄에만 선택 가능def until_one(): n, k = map(int, input("25 5 --").split()) result = 0 while n != 1: if n % k == 0: n /= k else: n -= 1 result += 1 return resultprint(until_one())'''# K로 가능한 한 많이 나눴을 때 가장 빠르게 N=1 만들 수 있다.# N이 K의 배수가 되도록 효율적으로 한 번에 빼는 방식# N, K를 공백으로 구분하여 입력받기n, ..
# 배열의 수들을 M번 더하여 가장 큰 수를 만드는 법칙.# 단, 특정 인덱스에 해당하는 수가 연속해서 K번 초과하여 더해질 수는 없음.# 인덱스가 다른데 값이 같을 경우 서로 다른 값으로 간주함.# N: 배열 크기, M: 숫자 더하는 횟수, K: 연속해서 더할 수 있는 횟수# N, M, K 공백으로 구분하여 입력 받기n, m, k = map(int, input().split())# N개의 자연수 공백으로 구분하여 입력 받기data = list(map(int, input().split()))max_value = max(data) # 가장 큰 수data.remove(max_value)next_max = max(data) # 두 번째로 큰 수result = 0cnt = k# 가장 큰 수를 더하는데,..
그리디 알고리즘이란?어떠한 문제가 있을 때, 단순 무식하게, *탐욕적으로 푸는 알고리즘.(탐욕적: 현재 상황에서 가장 좋은 것만 고르는 방법)현재의 선택이 나중에 미칠 영향에 대해서는 고려하지 않는다. 즉, 사전에 외우고 있지 않아도 풀 수 있을 가능성이 높은 문제 유형.단, 많은 유형을 접해보고 문제를 풀어보며 훈련을 해야한다.창의력이 중요함! 그리고 문제 풀이를 위해 해법을 찾을 때, 이것이 정당한지 검토해야 답을 도출할 수 있다.문제 유형 파악이 어렵다면 그리디 알고리즘을 의심하고,오랜 시간 고민해도 그리디 알고리즘으로 해결방법을 찾을 수 없다면, 그때는 다른 알고리즘 방법을 떠올려보다. # 여러 개의 숫자 카드 중 가장 높은 숫자가 쓰인 카드 한장을 뽑는 게임# 행을 선택 -> 가장 숫자가 작..