목록Algorithm (111)
Sunrise
브루트 포스 문제입니다. 주어진 숫자 N을 만들 수 있는 생성자를 구해야 하므로, 1~N까지 모든 경우의 수를 조사해서 문제를 풀 수 있습니다. for문으로 1~N까지 모든 경우의 수를 반복하고, 각 자릿수를 더하기 위해 while 문을 사용합니다. 가장 작은 생성자를 찾아야 하므로 for 문 오름차순으로 가다가 생성자를 찾게 되면 break합니다. N = int(input()) con = 0 for i in range(1, N+1): num = i part_sum = i while(1): part_sum += num % 10 num //= 10 if num == 0: break if part_sum == N: con = i break print(con)
브루트 포스 문제입니다. 받은 nums에 대해서 모든 경우의 수를 조사해야 하므로 브루트 포스 방법을 사용합니다. 블랙잭은 3개 카드 조합의 합을 구해야 하므로 3중 for문을 이용합니다. 만약 3개 카드 조합의 합이 M을 초과하면 continue로 다음 경우의 수로 넘어갑니다. 초과하지 않으면 max로 값 계속 비교해서 answer을 구합니다. N, M = map(int, input().split()) nums = list(map(int, input().split())) answer = 0 for i in range(N): for j in range(i+1, N): for k in range(j+1, N): if nums[i] + nums[j] + nums[k] > M: continue else: an..
재귀 문제입니다. 먼저, 답의 길이가 가변적이므로 리스트 append를 사용하여 리스트를 쌓아 정답을 구합니다. 재귀함수로부터 리스트를 리턴 받고, 출력 시 join을 이용하여 알맞은 형태로 출력합니다. 문제의 입력과 출력을 잘 살펴보면, 입력이 27일 때, 패턴이 3레벨 까지 들어가므로, 재귀함수 호출이 3번 되야합니다. 따라서 draw_star 재귀함수를 만들 때, 인자로 x//3 을 넣고 x == 1 일때 재귀가 종료되도록 설계합니다. x == 1에 재귀함수가 도달했다면, 문자열 ' * ' 이 들어있는 리스트를 받아와서 패턴을 답이 될 리스트 L에 담아줍니다. 패턴을 알고 있기 때문에, for문으로 패턴 모양에 맞게 리스트 요소를 넣어줍니다. 재귀함수 풀리는 과정 x == 1 → Stars = dr..
재귀 문제입니다. 출력 형태를 보고 문자열들의 출력이 재귀함수의 어떤 부분에 들어갈지를 생각해야 합니다. 재귀함수가 불릴 때마다 "____" 문자열이 출력되는 부분이 있으므로 인자 i를 추가해 1씩 더하며 사용해줍니다. i=0 에서 시작해서 i가 n에 도달하면 마지막 답을 출력하고 함수 종료부분으로 갑니다. def sol(i, n): print("____"*i + "\"재귀함수가 뭔가요?\"") if i == n: print("____"*i + "\"재귀함수는 자기 자신을 호출하는 함수라네\"") else: print("____"*i + "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.") print("____"*i + "마을 사람들은 모두 그 선인에게 수많은 질문을..
재귀 문제입니다. for문을 이용하여 구할 수 있지만 학습을 위해 재귀 함수를 이용하여 풉니다. n을 받고 재귀 함수 sol에 넣어 피보나치 수열 값을 받습니다. 재귀 함수 sol에서는 x가 0, 1, 2일 때는 0, 1, 1을 받고, x가 3 이상에서는 이전의 두 수열 숫자들을 합한 값을 받습니다. def sol(x): if x == 0: return 0 elif x == 1: return 1 elif x == 2: return 1 else: return sol(x-1) + sol(x-2) n = int(input()) print(sol(n))
재귀 문제입니다. for문을 이용하여 구할 수 있지만 학습을 위해 재귀 함수를 이용하여 풉니다. N이 0이면 0! = 1이므로 1 출력 N이 1 이상이면 재귀함수 sol에 넣어 값을 받습니다. 재귀함수 sol에서는, 1을 받기 전까지 1씩 깎이며 곱해져야 하므로 x가 1일 때 1 x가 1이 아니면 x * 재귀함수 호출 def sol(x): if x == 1: return x else: return x * sol(x-1) N = int(input()) if N == 0: print(1) else: print(sol(N))
소수 응용 문제입니다. n을 받고 n을 두 소수의 합으로 나타내면 됩니다. 합하여 n이 되는 두 소수의 범위 2~n//2+1 에 대해서, 소수 판별함수를 사용하여 num, n-num 쌍을 구해줍니다. 구한 쌍은 gold_partition 리스트에 넣어 놨다가, 최소 차이 쌍을 구하기 위해 for 문을 돌립니다. +) 다른 풀이는 python 제출로도 가능한 걸로 보아 최적화 더 필요 import sys input = sys.stdin.readline def is_prime_number(x): if x == 1: return False for i in range(2, int(pow(x, 0.5))+1): if x % i == 0: return False return True T = int(input()) ..
수학 문제입니다. n을 받았을 때, n+1 ~ 2n 까지 범위에 소수의 개수를 출력하면 됩니다. 소수 판별함수 is_prime_number 를 작성할 때, 시간 초과에 걸리지 않게 제곱근까지만 판별합니다. +) 이 코드는 pypy로 제출해야 통과되는데 다른 풀이는 python 제출로도 가능한 걸로 보아 최적화 더 필요 import sys input = sys.stdin.readline def is_prime_number(x): if x == 1: return False for i in range(2, int(pow(x,0.5))+1): if x % i == 0: return False return True while(1): n = int(input()) if n == 0: break cnt = 0 for..
수학 문제입니다. N kg의 설탕 봉지를 5kg, 3kg에 나눠 담는데 최소 봉지 개수를 구해야 합니다. 5kg으로 나눠지면 바로 최소 개수를 구할 수 있습니다. 5kg으로 안나눠지면 while문으로 3kg에 하나씩 담으면서 다음 나머지 값이 5kg으로 나눠지는지 확인합니다. 끝까지 5kg로 안나눠지고 마지막 값도 3kg로 안나눠져서 음수가 나오면 -1 출력 N = int(input()) cnt = 0 while N >= 0: # N 담아서 감소하는 중 if N % 5 == 0: # 5로 나눠지면 바로 최소 cnt 구하기 cnt += N//5 print(cnt) break else: # 5로 안나눠지면 3 빼가면서 다음 기회 보기 N -= 3 cnt += 1 else: # 3으로 안 나눠 떨어져서 음수 ..
수학 문제입니다. 4층 3층 1 1+(1+(1+2)) 2층 1 1+(1+2) 1+(1+2)+(1+2+3) 1+(1+2)+(1+2+3)... 1층 1 1+2 1+2+3 1+2+3+4 0층 1 2 3 4 k층, n호 입력받았을 때, k-1층의 1호부터 n호까지 사람 합을 구해야 합니다. 규칙을 보면, n 인덱스까지의 값들을 누적시키므로 0층 사람 수 리스트를 정의하고 for 문으로 합을 누적시키면서 1층, 2층, 3층을 완성시키면서 k층 n호의 값을 구하러 갑니다. 먼저, 한 층을 완성하는 for 문 for j in range(1, n): # n = 1일때 실행 x people[j] += people[j-1] 다음 층으로 가기 위한 이중 for문 for i in range(k): # k번 for j in r..