FixDiscountPolicy -> RateDiscountPolicy로 바꾸기 new 부분만 바꿔주면 된다. 하지만 여기서 중요한 부분이 있다. 현재 클래스는 분명 DiscountPolicy(추상적)에 의존하지만, FixDiscountPolicy, RateDiscountPolicy(구현체)에도 의존하고 있는 것이 보인다. 그래서 DIP 위배된다. 또한 클라이언트 코드를 변경하기 때문에 *OCP를 위반한다. OCP(Open/Closed principle) 계방-폐쇄 원칙 -> 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. ex) 기름차 -> 전기차로 변경할 때, 나는 운전면허증만 있으면 운전할 수 있어야 하는데, 나한테 뭘 요구함. 잘못된거임 생성자 주입 주석 처리 된 부분이 원래 구현체를 의존하는 ..
MemberServiceImpl은 MemberRepository interface를 의존한다. 그러나 실제 할당하는 인스턴스는 구현체를 의존함. --> 추상화와 구체화 모두 의존함. DIP 위반 *DIP(dependency inversion principle) 의존관계 역전 원칙 -> 구체화에 의존하지 말고, 추상화에 의존해야함. 설계가 잘되었다. 위 클래스(orderservice) 입장에서는 할인에 대해선 모름. 그냥 discountPolicy가 알아서 해줘라고 던져주는 것임. 만약 할인이 변경된다? 하면 할인 부분만 변경하면 됨. 전체 코드를 변경할 필요가 없음. --> *단일 책임 원칙이 잘 지켜짐. *SRP(Single responsibility principle) 단일 책임 원칙 -> 한 클래스..
1. file - settings - gradle 검색 - build and run 모두 intellij IDEA - gradle jvm 11 2. file - project structure - project settings - Project - Project SDK 11 3. file - project structure - project settings - Platform Settings - SDKs 11 (4. Settings - Annotation Processors - Enable annotation processing 체크 --> 롬복)
그래프 그래프는 정점(Vertex)와 간선(Edge)로 이뤄져있다. 간선은 무방향과 방향, 그리고 가중치의 유무로 나뉠 수 있다. 차수 차수란 정점의 연결된 간선의 수를 의미함. 즉, degree(x)는 정점 x에 연결된 간선의 수를 뜻함. 모든 정점의 차수 합 == 간선 개수의 2배를 만족함. 위 조건은 시간 복잡도에 이용되기 때문에 알아야함. 그래프 저장하는 방법 그래프를 저장하는 방법은 인접 행렬과 인접 리스트가 있다. 서로 장단점이 있다. 기준은 필요 공간, 한 정점에서 다른 정점으로 갈 수 있는지, 한 정점에서 갈 수 있는 정점들을 구할 때으로 나눠봄. 인접 행렬 필요 공간 : O(V^2) 정점의 개수만큼(VxV) 이차원 배열을 만들어야함. 정점 A에서 정점 B로 갈 수 있는지 판단 : O(1)..
오늘 intellij를 사용하다가 분명히 패키지 경로와 클래스 이름도 정확하게 입력했는데 cannot resolve symbol class라는 오류가 떴다. 그래서 path가 잘못된 줄 알고 패키지와 클래스를 삭제하고, 다시 만들고를 반복했다. 구글링을 하여 file - invalidate caches / restart를 누르고 재시작하더니 됐다.
오답 노트 & 새로 알게 된 점 전에 풀었던 문제는 일차원 배열로 해결했다. 이번에는 이차원 배열을 이용하였다. 해당 문제는 강의를 통해 풀었던 문제이다. 이런 생각은 어떻게 할까,,, 라는 생각이 들었던 문제이다. dp[i][0]은 i-1번째 계단을 밟지 않고 i번째 계단을 밟을 경우, dp[i][1]은 i-1번째 계단을 밝고 i 번째 계단을 밟을 경우이다. 그래서 dp[i][0]을 구하기 위해서는 i-1번째 계단을 밟지 않을 경우에는 연속 세 계단을 어차피 오를 수 없기 때문에 dp[i-2][0]과 dp[i-2][1]중 최댓값을 고르면 된다. dp[i][1]은 i-1번째 계단을 밟을 경우이므로, i-2번째 계단을 밟으면 안 된다. 그래서 dp[i-1]계단에서 i-2계단을 밟지 않아야 하므로, dp[i..
오답 노트 & 새로 알게 된 점 해당 문제는 규칙성을 찾기 너무 어려웠다. 뭔가 알 것 같으면서도, 보이질 않았다. 26이라는 숫자가 중요한 것 같은데 어떻게 구현할지 생각이 1도 안 났다. 처음에 풀 때는, 반대로 풀었다. 즉, 예로 25114를 보면 4 -> 14 -> 114 -> 5114 -> 25114 이렇게 접근했다. dp를 배울 때, dp[N]이 원하는 답이라 하였는데, 위의 방법처럼 풀게 되면 반대로 풀게 되어 dp[1]인가 여기를 구해야했었다. 그래서 규칙성은 보이는데 어떻게 구현할지를 모르겠다고 말한 것이다. 구글링을 하여 힌트를 보니, 2 -> 25 -> 251 -> 2511 -> 25114로 접근하여 dp[N]이 원하는 답이 됐던 것이다. 규칙성은 숫자 하나를 비교하고, 그 다음에는 ..
오답 노트 & 새로 알게 된 점 오르막 수는 규칙성이 쉽게 보였다. 다만 이차원 배열을 사용해야 한다는 것을 늦게 알게 되어, 문제를 푸는데 시간이 좀 걸렸다. dp[i][j]라 할 때, i 길이 수에서 j 숫자로 시작하는 숫자들의 개수를 의미한다. 즉, dp[2][3]은 길이가 2인 숫자들 중, 앞이 3으로 시작하는 오르막 수들의 개수이다. 2자리 부분을 봐보자. 0으로 시작하는 곳은 1자리인 0~9가 반복, 1로 시작되는 숫자는 1~9, 2로 시작되는 숫자는 2~9 등등 된다. 3자리 부분에서는 2자리 총합부터 시작하여 점점 하나씩 빼게 된다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3..
오답 노트 & 새로 알게 된 점 이 문제를 풀려고 한 5~6시간 쓴 것 같다. 처음에 dp공부하는 것은 너무나 많은 생각과 시간을 투자한다. 하지만 중요한 부분이니 견디고 견뎌서 dp를 정복해야한다,, 그리고 문제 풀이에 매우 큰 도움을 주신 류호석님께 너무 감사한다,, 첫 번째, 문제 접근을 잘못하여 파티션을 제대로 나누지 못했다. 류호석님 dp강의를 보면 dp를 풀기 위해서는 파티션을 나눠야 한다. 하지만 문제에서 1+2+2, 2+1+2, 2+2+1은 항상 같은 값으로 나오기 때문에 처음 나는 중복된 것을 뺐다. 그래서 파티션을 나눠서 공통점을 찾으려는 과정에서 어려움을 겪게 되고, 찾지 못하게 된다. 그래서 질문을 하게 되었고, 위의 중복된 값을 같이 써야 한다고 말씀해주셨다. 왜냐하면 빼놓고 쓰게..
오답 노트 & 새로 알게 된 점 문제 점화식은 구글링을 통해 알 수 있었다,, dp는 너무 어렵다,, 초기값은 dp[0] ~ dp[5]까지 있었다. 여기서 dp[0]은 원래대로라면 0이지만, 위의 조건을 만족시키기 위해 1이라고 했다. 위의 조건을 만족시키기 위해 dp[0]을 1이라고 내 마음대로 설정해도 되냐고 물어보았다. 아무것도 안 더하는 방법이 있다고 생각하면 dp[0]은 1이 될 수 있다. 그래서 문제를 어떻게 설명하냐에 따라 풀이가 달라지는 것 같다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package Dynamic_Programming; //BOJ 159..
오답 노트 & 새로 알게 된 점 해당 문제는 1, 2, 3 더하기 1을 풀면 똑같은 점화식을 가진다는 것을 알 수 있다. 하지만 이 문제의 함정은 n의 범위이다. 1에서는 아마 n의 범위가 11보다 작은 정수였는데, 해당 문제는 n이 1,000,000보다 작거나 같은 정수(양수)이다. 그리고 1,000,000,009로 나눈 나머지를 출력한다고 한다. 처음에 문제를 똑같이 풀 때에는 당연히 1과 똑같이 코드를 제출했다. 그냥 n의 범위가 다른가 보다 하고 말이다. 하지만 당연하게 틀렸습니다가 나왔다. 나는 저 10억으로 나눈 나머지를 출력한다 이 부분을 간과하였다. 이 말은 즉, 어디가 10억이 넘는 곳이 있다라는 말이었고, 배열의 범위를 int로 하면 안 되는 것이었다. 만약 점화식에서 dp[i-3], ..
오답 노트 & 새로 알게 된 점 문제를 처음에 접근할 때는 클래스를 구성해서 x, y좌표를 따로 저장한 뒤에 무조건 사다리를 건너야하며 등등 어렵게 생각을 했다. 그리고, 1~6일 때 모두 큐에 넣는다면 터질 것 같아서 도저히 풀이 방법이 생각나질 않았다. 그러나 구글링을 통하여 힌트를 얻었고, 문제를 풀 수 있었다. 이차원 배열을 사용하지 않고 사다리나 뱀이 있는 경우 시작점을 배열의 index, 도착점을 배열의 value로 설정한다. 그래서 해당 배열의 값이 0이 아니게 되면 도착점을 큐에 넣어준다. 사다리나 뱀이 없는 경우 그냥 count만 1 늘려준다. 오답 노트 & 새로 알게 된 점 ( 2021.10.24) 문제를 다시 풀어보았는데 틀렸다. 처음에 생각한 점이 뱀은 무조건 지나면 안된다였다. 주..