-
5월 25일 목요일 TIL 회고록카테고리 없음 2023. 5. 25. 22:00
코딩테스트 한접시
프로그래머스 Lv1. 행렬의 덧셈
문제 설명, 제한 조건 및 입출력 예
문제 풀이 및 해설
class Solution { public int[][] solution(int[][] arr1, int[][] arr2) { int[][] answer = new int[arr1.length][arr1[0].length]; List<Integer> list = new ArrayList<>(); for(int i = 0 ; i < arr1.length; i++) { for (int j = 0 ; j < arr1[i].length; j++) { answer[i][j] += arr1[i][j] + arr2[i][j]; } } return answer; } }
뭔가 머리로는 이해가 되었지만 글로 쓰자니.... 너무 어렵다
맨 처음에 리턴 값인 answer를 new int[arr1.length][arr1[0].length] 로 정의했다. 이유는 문제 설명에서 두 행렬은 같은 행, 같은 열의 값을 가지고 있다. 그래서 answer의 [][] 를 미리 arr1과 맞게 만들어준다. 본 문제 입출력 예 [[1,2].[2.3]]을 예시로 들면
arr1.length는 [[1,2], [2.3]] 총 두개이다. 그래서 answer의 첫번째 []는 2가 들어가고, arr1[0].length는 [1.2]에서 1과 2, 총 두개이다.
그래서 answer의 두번째 []도 2가 들어간다. 그래서 answer는 answer[2][2]가 된다.
그 후 for문을 사용해 i < arr.length 만큼 도는 for문을 만든 후 다시 for문을 사용해 i < arr[i].length 만큼 도는 for문을 만든다.
그 후 arr1[i][j] + arr2[i][j]를 더한 값을 answer[i][j]에 넣어준 후 리턴시킨다.
개인 프로젝트
블로그를 참고하며 무한 댓글을 만들던 중 Repository에서 Query문을 사용해야 하는 부분에서 막혔었다.
참고한 블로그에서 주석으로 쿼리 부분을 적어주셨었는데, WHERE 부분에서 그대로 적으면 안될 줄 알고 안적고 IN절을 사용해 WHERE문을 작성하고 실행했더니 전부 에러... 혹시나 하고 블로그에 적혀있던 쿼리문 그대로 적어서 실행했더니?? 오류가 사라졌다 !!!
하지만 다시 한 번 실행해보니 no suitable constructor found for constructorexpression(no arguments) 에러가 나왔다.
구글링을 해보았더니 해당 오류는 XxxDto.class에서 정의하는 필드와 Repository에서 select로 표현하고자하는 필드가 완전히 일치하지 않아서 발생하는 문제라고 적혀있었다.. (익셉션)
해결 방법은
1. 모든 필드의 타입이 일치해야 한다.
2. 모든 필드의 순서가 일치해야 한다.
3. Repo. 쪽에서의 필드명과 XxxDto 쪽에서의 필드명이 일치해야한다. 만약 다르다면, Repo. 쪽에서 위 코드와 같이 .as("별칭") 메서드를 사용해서 XxxDto 쪽에서의 필드명과 같도록 별칭을 지정해주도록 한다.
내 CommentResponseDto이다.
CommentRepositoryImpl.Class
모든 필드에 타입과 순서가 일치한다. 근데 왜 오류가 나오는지 살펴보았다.
자세히보니 CommentResponse.class에서 QueryDsl 전용 생성자가 public이 아닌 private로 되어있었다!
private -> public으로 변경한 후 실행해보니 정상 작동 되었다.
실행한 후 Postman에서 테스트를 해보았는데 오류는 안나오나 대댓글 작성이 되지 않았다.
코드를 자세히 보니 빼먹은 부분이 있었다. 빼먹은 부분도 Repository에서 쿼리 작성이 필요한데... 쿼리 작성 후 실행해보았지만 실행이 안된다.
미치겠다.. 얼른 고쳐봐야겠다. 제발 꼭 구현 해보고싶다 무한 댓글!!