이번주는 알고리즘 4일 + 스프링 기초(JDBC 학습) 1일로 진도를 나갔다.
알고리즘은 다 한번씩 다뤄봤던 것들이지만 보지 않으면 구현하지 못하는 것들이기도 했어서 복습한다는 마음가짐으로 열심히 임했다.
JDBC 부분은 java 애플리케이션을 데이터베이스와 연결하기 위한 Java 표준 API로 이전에 다뤄보진 않은 개념이었는데, 내가 편하게 가져다 쓰는 JPA의 밑바닥이 이런식으로 돌아가는구나 싶었던 내용이었다.
네이버 신입 공채가 있어서 경험을 쌓고자 지원했다.
솔직히 자소서가 너무 쓰기 귀찮아서 쓰지말까 한 20번은 고민했던 것 같다.
없는 내용을 쥐어짜야 했어서 쓰는데도 너무 오래걸렸다.
나름 열심히 자소서를 적어서 냈지만 오늘 친구와 톡을 나누던 도중, 이번에는 코테뿐만 아니라 CS도 같이 테스트를 본다는 사실을 전해듣고 사실상 반포기를 한 상태이다..
이번 주는 시간적 여유가 정말 없기에 가볍게 정리하고 넘어가려고 한다.(백엔드 프로젝트 기획 + 설계, 네이버 코테 + CS 준비, 클린 코드 스터디, 코테 스터디)
[수업 내용]
알고리즘
-TimSort
대부분 이름은 들어본 적 있었던 반면, 유일하게 처음 접하는 개념이 있었으니 그것은 바로 TimSort였다.
내부적으로 32 크기의 단위까지는 삽입정렬을 진행하고, 그 set들에 대해 병합정렬을 진행하는 복합적인 방식이었다.
간단하게 삽입정렬을 설명하면 앞에서부터 알맞은 위치에 원소를 삽입하고 기존에 정렬되어 있던 나머지 부분을 뒤로 한칸씩 미는 정렬인데, O(n^2)이긴하나 적은 데이터나 거의 정렬된 데이터에서 효율적으로 동작하는 방식이다.
반면, 병합 정렬은 n log n이긴 하나 추가적인 메모리 공간이 필요하므로 삽입 정렬로 단점을 보완하는 느낌이다.
(또한 추가적으로 병합 정렬은 캐시 히트율이 좋지 못하다는 단점도 존재한다)
-퀵 소트
정렬중에 뭔가 가장 이해가 직관적으로 안되는 것 같다.
복습하는 겸 나만 이해할 수 있는 언어로 끄적거려보자.
pivot을 기준으로 해당 값보다 작은 데이터는 왼쪽, 큰 데이터는 오른쪽에 위치할 수 있도록 low와 high 인덱스 위치를 잘 조정해주는 느낌이다.
정확히는 pivot보다 low가 커질때까지, 또 pivot보다 high가 작아질 때까지 계속 업데이트 하다가 low와 high 위치를 바꿔치기 하면 pivot보다 작은 놈이 왼쪽, pivot보다 큰 놈은 오른쪽에 위치하게 되므로 양옆 장애물을 1단 제거한 느낌으로 이해했다.
그러다가 high가 low보다 작아지는 역전 상태가 일어나면 pivot으로 설정된 요소와 high의 요소를 swap해준다.
그리고 high 위치를 다시 pivot으로 잡고 나눠진 부분 각각에 대해 quicksort를 적용한다.
코드로 짜는 연습을 한번 해봐야 할 것 같다. 사실 졸려서 머리가 안 돌아간다..
-다익스트라
pq사용, 정점에서 뻗어나갈 수 있는 정점을 통한 거리 갱신 이후 pq에 push, 최적화 위해 if(dist[cur] < pq.poll().dist)면 continue
-프림
다익스트라와 유사, visited 배열 + pq 사용, 뻗어나갈 수 있는 정점에 달린 모든 간선 push(어차피 dist 순으로 pq가 정렬해줌)
-크루스칼
union-find 이용해서 사이클 이루는지 체크, 모든 간선 가중치를 오름차순 정렬 이후 적은 것부터 뽑아나감, 해당 간선의 양 끝 점을 find를 통해 사이클을 이루는지 체크하고 아니면 merge하면서 부모를 같게 갱신
-LIS(가장 긴 증가하는 부분 수열)
-dp배열 모두 값 1로 초기화하고 앞에서부터 for i=1~n; for j=1~i-1까지 돌면서, arr[i] > arr[j]인 경우만 dp[j]가 쌓아왔던 스택을 먹어치우는 느낌응로 dp[i] = max(dp[i], dp[j] + 1);
-LCS(최장 공통 부분 수열)
-점화식 : dp[i][j] = if(arr[i] == arr[j]) dp[i][j] = dp[i-1][j-1] + 1, else dp[i][j] = max(dp[i-1][j], dp[i][j-1])
JDBC
-Java Application -> DataBase를 지원하는 API
-일종의 어댑터, 브리지 패턴(추상적인 인터페이스를 구현과 분리)으로 볼 수 있음
-전반적인 실행순서 : 드라이버 등록(sql.connector 라이브러리 포함시 자동 등록) - Connection 객체 생성(보통 JDBCTemplate 클래스 별도 생성하여 getConnection static 메소드 구현하고 이를 호출) - .createStatement()나prepareStatement(String sql)형식으로 Statement나 PreparedStatement 객체 생성 - 이후 executeQuery를 통해 해당 쿼리 실행(prepareStatement의 경우 ?의 placeHolder 값을 setInt등으로 설정하는 과정 필요) - select의 경우 .next()을 통해 ResultSet 객체로 조회 결과를 받아올 수 있으며, 이외 update, insert, delete의 경우 영향받은 행의 개수를 int로 반환받는다.
-CRUD 설계 : Service에서 Connection 객체를 만들고 비즈니스 로직 마무리에 따라 close, Repository에서 생성된 Connection 객체를 넘겨받아 preparedStatement 객체 생성하여 하나의 SQL 구문 실행 -> DBMS를 통해 수행되는 CRUD 작업 단위의 메소드 정의
[마무리하며]
여태까지 항상 c++로 코테 준비를 해왔었는데, 4일간의 알고리즘 수업을 통해서 Java로 백준 문제를 많이 풀어보았고 Java로 푸는 코테에 적응할 수 있어서 PCCP도 응시언어를 C++에서 Java로 바꿨다.
글을 쓰는 시점에서 바로 내일인 3/18일에 시험을 치게 된다.
잘 치면 기업에서 우대사항이 있던데, 솔직히 이번엔 좋은 성적을 기대하고 있지 않다. Java로 코테를 치기 시작한지 얼마 안돼서, 특정 자료구조의 사용법을 온전히 익히지 못하기도 했고 구현 자체에서도 조금 더 많은 시간을 투자해야 하기 때문이다.
부트캠프를 마치는 그날까지 코테를 놓치 않고 매일 풀어서 기본적인 구현력을 높이는 것이 목표다..
그걸 위해 코테 스터디도 가입했다. 이번주도 화이팅!
'Beyond SW > 주간 회고' 카테고리의 다른 글
| 한화시스템 Beyond SW캠프 15기 10주차 회고 (1) | 2025.03.31 |
|---|---|
| 한화시스템 Beyond SW캠프 15기 9주차 회고 (0) | 2025.03.24 |
| 한화시스템 Beyond SW캠프 15기 7주차 회고 (7) | 2025.03.09 |
| 한화시스템 Beyond SW캠프 15기 6주차 회고 (1) | 2025.03.03 |
| 한화시스템 Beyond SW캠프 15기 5주차 회고 (0) | 2025.03.02 |