[우아한 테크코스 8기] 3주차 프리코스 회고
·
experience
3주차 미션: Lotto 3주차 로또 미션은 이전 미션들보다 훨씬 복잡한 구조를 가지면서, 책임을 어디에 둘 것인가 에 대한 고민을 많이 했던것 같습니다. 리드미에 기능을 모두 정리한 후, 기능 단위 커밋을 진행했습니다. 1. 생성 책임의 위치 로또 번호를 생성하는 책임을 어디에 둘지 가장 많이 고민했습니다.Lotto는 값 객체로, 이미 생성된 번호를 받아서 검증하고 보관하는 역할에 충실해야 한다고 판단했습니다.따라서 로또 번호 생성 책임은 Lottos에서 담당하도록 분리했습니다.Lottos는 사용자가 구입한 여러 장의 로또를 관리하며, 내부적으로 각 Lotto 객체를 생성하는 책임을 가집니다.이렇게 역할을 분리하니 Lotto는 불변 객체로 유지할 수 있었고, 테스트 역시 훨씬 수월해졌습니다. 2. ..
[우아한 테크코스 8기] 2주차 프리코스 회고
·
experience
따로 블로그에는 올리지 못했던 ...!! 이미 반년이 지났지만 뒤늦게라도 올립니당 .. 2주차 미션 : racingcar 2주차 미션에서는 자바의 단일 책임 원칙과 MVC 패턴의 의존성을 고민하면서 코드를 설계하고, 테스트 가능성을 높이는 데 집중했습니다.다음은 고민했던 점을 정리해 보았습니다. 1. 클래스 설계와 책임 분리처음에는 Car와 Cars 두 클래스만으로 게임을 구성했지만, 게임 진행 로직이 컨트롤러에 노출되어 재사용이 어렵다는 문제를 발견했습니다. 그래서 게임의 핵심 흐름을 제어할 RacingGame 클래스를 추가하여, 컨트롤러는 입력과 출력, 게임 흐름만 관리하고, 실제 도메인 로직은 도메인 클래스가 책임지도록 구조를 바꿨습니다.이 구조를 통해 각 클래스가 자신의 책임에만 집중하..
[알고리즘] 시뮬레이션 어려웠던 문제 (백준 14503)
·
Algorithm
백준 14503번 : 로봇청소기 처음에 문제만 읽고, 그동안 많이 풀었던 좌표를 이용한 BFS문제로 방향을 잡았는데 풀리지 않았다.이 문제의 유형은 시뮬레이션 문제이다. 시뮬레이션이란?시뮬레이션의 핵심은 문제의 규칙을 그대로 따라가야 한다는 것에 있다. 위 문제는 로봇이 모든 곳을 탐색하는게 아니라, 정해진 규칙대로만 움직이는 특징이 있다. 왼쪽 확인 없으면 또 왼쪽 4번 다 확인 뒤로 이동 로봇청소기는 이 규칙을 가진다. // 북 동 남 서int[] dy = {-1, 0, 1, 0};int[] dx = {0, 1, 0, -1}; 먼저 방향을 숫자로 표현하기 위해 좌표를 잡는다. y = 행 (위 아래), x=열(좌우) 예를 들면 북쪽으로 이동할경우 행이 줄어든다. (1,1) → (0,1)따라서d..
[알고리즘] BFS / DFS 접근 방식 정리
·
Algorithm
DFS / BFS 알고리즘의 특징은 이전 글에서 정리한 적 있다.코테 준비를 하면서, 어떤 유형에서 어떤 알고리즘을 써야할지 헷갈리는 부분이 많아 정리해보려고 한다. DFS일반적으로 재귀함수를 이용하여 구현한다. 정점 v를 방문한다.정점 v에서 인접한 정점 중에 방문하지 않은 정점 w가 있다면 w를 v로 하여 1부터 재귀함수를 반복한다.인접한 정점을 모두 방문했다면 스택에서 정점을 꺼내 위를 반복한다. import java.util.LinkedList;public class DFS_Graph { private int V; private LinkedList adj[]; DFS_Graph(int v){ V = v; adj = new LinkedList[v]; ..
[프로젝트] 댓글 조회시 N+1 문제 해결, 성능 비교
·
project
상품/ 레퍼런스 댓글 관련 기능을 구현하기 위해 Jpa 연관관계 설정과 조회 로직을 구성하였다.그러나 실제로 API를 호출해본 결과, 단순 조회임에도 불구하고 예상보다 많은 수의 쿼리가 발생하는 것을 확인할 수 있었으며,사용자의 데이터 양이 증가할수록 쿼리 수가 급격히 늘어나 성능 저하로 이어지는 구조임을 확인할 수 있었다. N+1 문제란?-> 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 기존 코드 방식public List getComments(Long userId, CommentableType type, Long commentableId) { // 1. 부모 댓글 목록 조회 (쿼리 1회) L..
[코테/알고리즘] 탐색 알고리즘 - DFS와 백트래킹
·
Algorithm
깊이 우선 탐색이란루트 노드 (혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법이다.넓게 탐색하기 전에, 깊게 탐색하는것이다.더 이상 갈곳이 없는 정점에 도착했다면 마지막에 따라왔던 간선을 따라 뒤로 돌아간다. 깊이 우선 탐색이 너비 우선 탐색보다 좀 더 간단하다. 검색 속도는 너비 우선 탐색보다 느리다. DFS의 가장 큰 특징 ➡️ 재귀적인 특징으로 구현을 한다.그래서 각 원소를 포함시킬지 말지 여부를 다 시도해야 하는 완전 탐색의 경우 재귀호출이나 DFS로 짜는것이 쉽다. 다음은 그래프 형식의 DFS 이다.노드 간 연결을 리스트로 관리한다.import java.util.LinkedList;public class DFS_study {..
[우아한테크코스 8기] 1주차 프리코스 회고
·
experience
1주차 미션은 문자열 덧셈 계산기 구현이었다. 1주차 미션과 시험이 겹쳐서, 미션 마감 하루전 미션을 시작하게 되었다.미션을 진행하면서 처음에 눈에 들어온 것은, '기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다.' 는 것이었다.간단해 보였지만 어떻게 요구사항을 분석해 나가느냐에 따라 차이가 큰 미션이라고 생각했다. 기능 목록을 작성하고, 기능 목록을 기준으로 커밋하라는 요구사항이 있었다. 먼저 구현할 기능을 정리하고 순서대로 기능을 추가하였다. 처음에 고민하면서 기능 목록을 꼼꼼하게 정리하고 미션을 시작하니까 수월했던것 같다. 발생할 수 있는 예외에 대해서도 README에 정리해 보았다. 고민했던점 ! 1.입력값의 범위입력값의 타입과 범위를 어떻게 설정할지 고민하였다.요구..
[코테/알고리즘] Java - Deque를 이용한 알고리즘 풀이
·
Algorithm
Deque란? 양쪽 끝에서 삭제와 삽입이 전부 가능하다. 스택과 큐를 덱의 특수한 예시라고 생각할 수 있다. 원소의 추가가 O(1)원소의 제거가 O(1)제일 앞/뒤의 원소 확인이 O(1)제일 앞/뒤가 아닌 나머지 원소들의 확인/변경이 원칙적으로 불가능 배열과 연결리스트 둘다 구현할 수 있지만, 배열을 이용하는 방식이 훨씬 더 편리하다.head ➡️ 가장 앞에 있는 원소의 인덱스tail ➡️ 가장 뒤에 있는 원소의 인덱스 +1 큐와 다르게 양쪽으로 삭제와 삽입이 모두 가능하기 때문에, 초기값을 max로 둔다! Deque의 자주 쓰이는 메서드offerLast(E e)뒤에 원소 추가큐 삽입pollFirst()앞에서 원소 꺼내고 제거큐 삭제peekFirst()앞 원소 확인 (삭제 X)큐 조회offerFirst(..