-
2775번 a층 b호에 사는 사람 수 구하기
결국 못 풀었다… for문 안쓰고 return 재귀함수로 풀려고 쌩쇼하다가 못풀었다…
for문 써서 다시해보자. 시간을 너무 많이 쓴거같아… 3시간 거의?;;
# arr[a][b] 만큼 초기화
arr = [[0] * (b+1) for _ in range(a+1)]
풀긴했는데 이렇게 푸는게 맞는지 모르겠다.
DP 방식 같기도 하고 아닌거같기도하고 풀이 좀 집가면서 확인하자…
Here is the code you provided:
aseT = int(input()) for _ in range(caseT): a = int(input()) b = int(input()) # arr[a][b] 만큼 초기화 arr = [[0] * (b+1) for _ in range(a+1)] for floor in range(len(arr)): for unit in range(1, b+1): if floor == 0: arr[floor][unit] = unit else: arr[floor][unit] = arr[floor-1][unit] + arr[floor][unit-1] print(arr[a][b])
나는 2차원으로 풀었는데 다른 사람들은 굳이 2차원으로 안풀었음…
1차원 리스트만 가지고 계속 층수 올리는 식으로 갱신함.
문제를 잘 생각해보면 dp 라고 볼수 있음…
a층, b호에 사는 사람 수는 a-1 층에 1호부터 b호까지 사는 사람을 다합쳐야한다.
이 말은 곧
(a층, b-1호에 사는 사람들 수) + (a-1층, b호에 사는 사람들 수)
이랑 같다…
왜냐면 a층, b-1호에 사는 사람들이 a-1층에 1호부터 b-1호까지 사는사람들은 더한 수니까 여기에 a-1층 b호에 사는 사람만 더해주면 깔끔!
cnt = [i for i in range(1, b+1)] # 1층 각 호수에 사는 사람들을 먼저 구해놈. # bottom-top의 dp 방식 for floor in range(a): for unit in range(1, b): cnt[unit] = cnt[unit-1] + cnt[unit] #(a층, b-1호에 사는 사람들 수) + (a-1층, b호에 사는 사람들 수) print(cnt[-1])
-
11653번 소인수분해 하는 법…
10분 풀다가 도저히 모르겠어서 검색찬스.
2학년 때 배운 기억이 난다.
2에서 시작해서 안 나누어지면 +1 한 3으로 나누어보고 이런식으로 함.
4로 나누어지면 어떡하나 싶었는데 생각해보니 그랬으면 이미 2로 나누어졌어야했기때문에 4를 소인수 값으로 착각할 일은 없다!
num = int(input()) prime = 2 while (num != 1): if num % prime == 0: print(prime) num = num / prime else: prime += 1
-
2309번 일곱 난쟁이의 키 총합이 100 되는 조합 찾기
하 이것도 어떻게 해야할지 모르겠다…
dp 같기도하고 sort+더블 포인터 같기도하고…
9개 중에서 7개 뽑는 방식은 9개 중에서 2개를 뽑는 가짓수와 같다.
조합 같은 문제 나오면 이런식으로 9C7 → 9C2로 치환해서 생각해보기.
7개 for문 돌리려니까 막막했는데 2개 뽑는걸로 해결되니까 이중포문으로 하면 끝날듯~
arr = [] for _ in range(9): arr.append(int(input())) arr.sort() for i in range(len(arr)-1): for j in range(i+1, len(arr)): if sum(arr) - (arr[i] + arr[j]) == 100: for m in range(len(arr)): if m != i and m != j: print(arr[m]) exit() ''' 풀기는 쉽게 풀었는데 마지막에 exit() 안해줘서 계속 출력해서 틀려서 답지 봄ㅠㅠ 3중 포문 너무 못생겨서 찾아보니까 arr.remove(m) 이런식으로 빼주고 print 하넹 '''
-
1924번 2007년 무슨 요일인지 맞추기
13분 컷또!
순회(?)해야될때 쓰는 나머지 개념을 잘 알고 있었기 때문에 맞출 수 있었다.
month, date = map(int, input().split()) d = 0 day = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'] if month != 1: for m in range(1,month): if m in [1, 3, 5, 7, 8, 10, 12]: d += 31 elif m == 2: d += 28 else: d += 30 d += date print(day[d%7]) ''' 대부분 나처럼 안하고 month도 배열로 총 며칠인지 다 써놓고 시작하네. if else 안씀ㅋㅋ '''
-
피보나치 구하기 (재귀가 아닌 dp방식)
시간은 짧고, 메모리를 크게 줘서 dp로 풀어야되는게 감이 왔다.
변수 이상하게 한거 못잡아서 10분 허비한거 치곤
30분 만에 품
bottom-top 방식으로 풀었음.
재귀였으면 top-bottom 방식으로 풀었을듯 근데 시간초과 나더라 재귀로 하면
n =int(input()) lst = [0 for _ in range(n+1)] for i in range(n+1): if i == 0: lst[i] = 0 if i == 1: lst[i] = 1 else: lst[i] = lst[i-1] + lst[i-2] print(lst[n]) \#lst[] 말고 dp[] 라고 하자 앞으로^^;;
-
11050번 이항계수 구하기
이항계수가 뭔지 몰라서 못풀겠음;;
-
이항계수란? 이항식을 전개했을때 나오는 각 항의 계수를 의미함.
ex) (a+b)^2 = 1a^2 + 2ab + 1b^2
→ 이게 조합 값이랑 같더라…
2C0, 2C1, 2C2 랑 같음.
# nCk 조합 값을 구하라는 것과 같은 거였음... n, k = map(int, input().split()) num = 1 for i in range(n, n-k, -1): num *= i for j in range(k, 0, -1): num /= j print(int(num))
내가 아는 조합 계산 하는 법 야매식으로 풀었음
5C2 = 54 / 21
원래 공식은
5C2 = 5! / 2!(5-2)!
원래 공식대로 풀거였으면 def factorial 선언해서 재귀함수로 만들어서 풀었으면 베스트였을듯.
5C2 = fact(5) / fact(2)*fact(5-2)
-
-
1934번 최대공약수 구하기
1일차 때 푼거라 쉽게 풀 줄 알았는데 30분이나 걸림.
그리고 소스가 왜이렇게 더럽지?;;
gcd 구하는 걸 def 함수로 뺐어야했는데…
from sys import stdin caseT = int(input()) for _ in range(caseT): a, b = map(int, sorted(stdin.readline().split())) tempA = a tempB = b while b % a != 0: temp = a a = b % a b = temp gcd = a print(tempA*tempB // gcd) ''' a,b의 최대공약수는 a를 b로 나눈 나머지와 b의 최대공약수와 같다. 따라서 나머지가 0이 될때까지 나눌때 그 값이 최대공약수가 된다. gcd(a,b) = gcd(a%b, b) 6, 10 -> 4, 6 -> 2, 4 -> '''
깔끔한 GCD 함수 ( temp 안쓰고…)
==파이썬이 이게 가능한 이유가==
==a,b 를 (a, b)의 tuple로 보고 b, a%b 를==
==(b, a%b)의 하나의 tuple로 봐서 temp 없이 값 바꿔치기가 된다고 함 ㄷㄷ==
def gcd(a, b): while(b): a, b = b, a % b return a
오늘 6개만 풀자고 했는데 7개 풀어서 기분이 좋네요~
2일차 백준