PUT
vs PATCH
문제 풀 때 항상 고질병이, 어디 하나 막히면 그걸로 멍때리느라 시간을 너무 허비한다.
그리고 구현력이 너무 약해서 슬프다
자두나무 문제를 2차원 배열로 해결할 수 있을 것 같은데, 특정 케이스 (예를 들어, 한 나무에서 버티는 경우가 가장 많은 자두를 먹는 경우) 를 어떻게 처리 해야 할 지 감이 안 온다.
슬쩍 다른 답들을 보니 3차원 dp를 사용하던데, 직관적으로 이해가 안되서 일단 2차원 배열로 문제를 풀어보는 걸로 결정.
import sys
input = sys.stdin.readline
T, W = map(int, input().split())
plum_trees = [int(input()) for _ in range(T)]
dp = [[0] * T for _ in range(W + 1)]
dp[0][0] = plum_trees[0] % 2
dp[1][0] = (dp[0][0] + 1) % 2
for i in range(1, T):
dp[0][i] = dp[0][i - 1] + plum_trees[i] % 2
for i in range(1, W + 1):
for j in range(i, T):
if plum_trees[j] % 2 == (i + 1) % 2:
dp[i][j] = max(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1)
else:
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1])
print(dp[-1][-1])
for x in dp:
print(*x)
이것 저것 하다 보니 준비를 못하네… 요즘에 DB 만져보느라 (정확히 말하면 ORM이긴 하지만…) 시간이 많이 걸릴 것 같으니 DB 관련 책을 일정 분량 씩 읽고 정리해보자…
사놓고 읽지 않았던… 파워 오브 데이터베이스
DTO를 사용하는 이유는 간단하게 클라이언트로부터 들어오는 값을 검증하겠다 아닌가?
검증 뿐만 아니라, Pipe 옵션 설정을 통해서 특정 타입으로 변환도 가능하다.
비슷한 개념들이 상당히 많은 것 같은데, filter
, guard
, pipe
의 사용처가 각각 다르겠지…?
보니까 각 상황마다 DTO를 작성하는 경우가 많은 것 같더라.
nestJs에서 try~catch 내부에 throw 하지 않더라도 올바르게 에러를 핸들링하는 모습을 봤다.
try~catch 블럭 내부에 throw를 한 경우 에러 로그를 좀 더 자세하게 보여주는 것 같던데, 결과 자체가 다르지는 않았다.
try~catch없이도 에러를 핸들링 할 수 있는 이유는 nestJs 자체적으로 built-in exception filter
가 있다고 한다.
mdn문서에 따르면, throw를 하면 callstack의 첫번째 catch 블록에 제어 흐름이 넘어간다고 하던데, 그러면 built-in exception filter
가 첫번째 callstack에 있다고 봐도 되는 것일런지…
걔 코드는 어디서 까봅니꺼?
Prisma를 통해서 유저를 생성하고, 그 값을 반환하게 되면 비밀번호까지 포함해서 주는 문제가 있었다. 이런 문제를 해결하기 위해 select
옵션을 사용하면 되는데,
this.prismaService.create({
data: {...},
select: {
password:false,
}
}),
위 방식대로 하니 적어도 하나 이상의 컬럼은 true로 놓아야한다는 오류가 뜬다.
다음과 같이 작성해줬더니 동작은 잘 하는데, 그럼 매번 저렇게 써줘야하나싶다.
this.prismaService.create({
data: {...},
select: {
email:true,
password:false,
...
}
}),
노션에서 보심 더 이쁩니다...(?)
훈수 환영합니다.
파워오브데이터베이스 잘 읽고 계신가요?
그나저나 이름이 팰린드롬으로 바뀌었군요!