목록수학 (63)
홍우진의 개발 일기장
문제 링크https://www.acmicpc.net/problem/1002 풀이 코드 import matht = int(input())for _ in range(t): x1, y1, r1, x2, y2, r2 = list(map(int, input().split())) btw = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) if btw == 0 and r1 == r2: # 두 원의 크기가 같아 겹치는 경우 print(-1) elif r1 + r2 == btw or abs(r2 - r1) == btw: # 내접 혹은 외접일 때 print(1) elif (abs(r1 - r2) 코드 해석두 좌표 사의의 거리를 ..
문제 링크https://www.acmicpc.net/problem/15652풀이 코드 n,m = map(int, input().split())dap = [] def dfs(start): if len(dap) == m: print(*dap) return for i in range(start, n+1): #받은 수보다 큰 수부터 시작 dap.append(i) dfs(i) # 반복 dap.pop() #원상복구 dfs(1)코드 해석DFS를 사용하여 풀이하였다. 체감 난이도: ★★★☆☆
문제 링크https://www.acmicpc.net/problem/4948 풀이 코드 num = 123456 * 2 + 1tot = [1] * numfor i in range(1, num): # 미리 소수 판단 if i == 1: continue for j in range(2, int(i**0.5)+1): # 2부터 i의 제곱근까지의 수로 나눠지는지 if i % j == 0: tot[i] = 0 breakwhile 1: dap = 0 n = int(input()) if n == 0: break for i in range(n+1, 2*n+1): # n부터 2n까지 dap += t..
문제 링크https://www.acmicpc.net/problem/2740 풀이 코드import sysinput = sys.stdin.readlinen, m = map(int,input().split())a = [list(map(int,input().split())) for i in range(n)]m, k = map(int,input().split())b = [list(map(int,input().split())) for i in range(m)]for i in range(n): result = [] for j in range(k): x = 0 for l in range(m): x += a[i][l] * b[l][j] result.ap..
문제 링크https://www.acmicpc.net/problem/1904풀이 코드n = int(input())dp = [1] * nfor i in range(1,n): dp[i] = (dp[i-1] + dp[i-2]) % 15746print(dp[-1])코드 해석경우의 수를 살펴보면1 자릿수 일 땐 1 1개2 자릿수 일 땐 00,11 2개3 자릿수 일 땐 001,100,111 3개4 자릿수 일 땐 0000,0011,1001,1100,1111 5개5 자릿수 일 땐 00001,00100,00111,10000,10011,11001,11100 8개 어라...?피보나치수열이랑 똑같잖아? 그래서 DP를 사용한 피보나치수열로 풀었다.점화식은 dp[i] = dp[i-1] + dp[i-2]이다. htt..
문제 링크https://www.acmicpc.net/problem/10448풀이 코드t = [n*(n+1)//2 for n in range(1, 46)]dap = [0] * 1001for i in t: for j in t: for k in t: if i+j+k 코드 해석수를 미리 구해놓은 뒤 푸는 방식을 사용하였다. 체감 난이도: ★☆☆☆☆

문제 링크https://www.acmicpc.net/problem/10972 풀이 코드n = int(input())arr = list(map(int, input().split()))x = [x for x in range(n,0,-1)] # 마지막 순열if arr == x: # 마지막 순열일 경우 -1 출력 print(-1)else: for i in range(n-1, 0, -1): # 뒤에서부터 비교 if arr[i-1] 코드 해석 1 4 3 5 2를 예로 들어보자.1 4 3 5 2의 다음 순서는 1 4 5 2 3이 된다.로직은 다음과 같다. 뒤에서부터 본인과 앞 수의 값을 비교한다.만약 앞의 수(3)가 더 적다면그 적은 수를 기준(3)으로 삼는다.다시 뒤에서부터 기준보..
문제 링크https://www.acmicpc.net/problem/14606 풀이 코드sum = 0for i in range(1,int(input())): sum += iprint(sum)코드 해석쫌 생각해보니피자탑의 즐거움 최댓값을 구한다고 하면피자탑을 하나씩 옮기면서 다 더하면 될 것 같았다.예를 들어보자면5의 최댓값 = 4*1 + 3*1 + 2*1 + 1*1 = 10 이라는 것을 알 수 있다. 다 풀고 나서 난이도에 비해 너무 쉬워서 검색해봤더니DP로 풀라고 나온 문제였다.어쩐지 문제가 너무 쉽더라... DP로 푼다면 이렇게 풀 수 있다.n = int(input())dp = [0]*(11)dp[1] = 0dp[2] = 1for i in range(3, n+1): m = i//2 dp..