forTinrange(int(input())):N=int(input())arr=list(map(int,input().split()))dp=[1]*Nforiinrange(1,N):forjinrange(i):ifarr[j]<arr[i]:dp[i]=max(dp[i],dp[j]+1)print(f'#{T+1}{max(dp)}')# dp는 쉬운듯 어렵고 어려운듯 쉽다...# LIS로 검색하면 도움이 되는 글이 많다.
D3_3304_최장 공통 부분 수열(LCS)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
forTinrange(int(input())):A,B=input().split()dp=[[0foriinrange(len(A)+1)]forjinrange(len(B)+1)]foriinrange(1,len(B)+1):forjinrange(1,len(A)+1):ifB[i-1]==A[j-1]:dp[i][j]=dp[i-1][j-1]+1else:dp[i][j]=max(dp[i][j-1],dp[i-1][j])print(f'#{T+1}{dp[-1][-1]}')# 아니다. DP는 그냥 겁나 어렵다..# 각각의 문자 위치를 숫자로 바꾸고 이를 2차원 배열로 만들어서# 일치하는 문자가 나왔을 때의 숫자를 dp에 기록해서 진행하는데# 난 A, B의 검사 순서를 B -> A 로 해야 한다는 것을 아주 느리게 깨달았다.# LCS로 검색하면 도움이 되는 글이 많다.
forTinrange(int(input())):N=int(input())days=[]for_inrange(N):days.append(int(input())-1)days=days[1:]dp=[1]*(N-1)count=0whileany(dp):# 👈 dp가 모두 0일 때까지 while을 돌린다.i=dp.index(1)forjinrange(i,N-1):ifdays[j]%days[i]==0:dp[j]=0count+=1print(f"#{T+1}{count}")# 2주기로 정박하는 배가 있다고 할 때, 이 배는 2일 4일 8일 12일에 정박할 수 있다.# 중간에 비어있는 일자가 있더라도 1배가 정박한 것으로 본다.# any() 함수를 써봤는데 좋았다. 푸는데 2시간... 걸렸다...ㅎ.
D3_10726_이진수 표현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
defcheck2(M):foriinrange(N):ifM%2!=1:return"OFF"else:M=M//2return"ON"forTinrange(int(input())):N,M=map(int,input().split())print(f'#{T+1}{check2(M)}')# 특정 조건에서 더 이상 검색할 필요가 없다면, def를 선언해 사용하는 것이 아주 유용하다. # 처음에는 bin함수를 사용해 slicing을 해서 뭐..뭐.. 어떻게 해보려 했지만# run time error가 났다. 조금 생각해보니, 굳이 bin을 사용할 것도 없어보였고,# 간단하게 시도했더니 풀렸다.