![[도서 리뷰] 자바 코드의 품질을 높이는 100가지 방법, 자바 베테랑이 전하는 실전 오류 패턴과 해법](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxDbT0%2FbtsMWDbQk6S%2FCL2WN6EqX0bDaWFD8Aky60%2Fimg.jpg)
한빛미디어 서평단 활동을 위해서 책을 협찬 받아 작성된 서평입니다. 📖 도서 정보https://www.hanbit.co.kr/store/books/look.php?p_code=B4010786144 자바 코드의 품질을 높이는 100가지 방법자바 코드 작성의 함정, 정적 분석 도구로 해결하라www.hanbit.co.kr 📖 리뷰 챕터 목차코드 품질 관리 표현식프로그램 구조 숫자일반적인 예외 문자열객체 비교컬렉션과 맵라이브러리 메서드유닛 테스트이 책은 자바 개발자가 흔히 저지르는 실수 100가지를 분석하고, 구체적인 사례와 함께 해결 방법을 제시한다는 점에서 인상깊었습니다. 챕터1에서는 코드 품질을 높이고 실수를 방지하기 위해 개발 문화와 도구를 어떻게 활용해야 하는지 설명합니다. 코드를 작성하는 것..
![[BOJ19236] 청소년 상어 (Java, 백트래킹, 시뮬레이션)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCRPZN%2FbtsLNB8NXpn%2F99t3RkDMzAnL7tDXKw2WN1%2Fimg.png)
문제 링크 https://www.acmicpc.net/problem/19236 풀이백트래킹이 약한 나에게 있어 정말 실수 연발했던 문제였다 (그래도 백트래킹 재미있다) ① 입력 데이터 초기화 후 상어가 `(0, 0)` 에 물고기를 먹고 그 방향을 가진다 ② 모든 물고기들이 이사를 시작한다- 작은 번호부터 순차적으로 이사- 이동 가능한 위치를 찾을 때 까지 반 시계 방향으로 제자리 회전하면서 빈칸 또는 물고기를 찾아 위치를 교환한다- 상어가 있거나, 맵의 경계를 벗어난 경우 다음 위치로 회전- 만약 이사 가능한 위치가 없다면 제자리를 유지한다③ 상어가 먹이를 탐색한다- 상어는 빈칸으로 이동 불가하고 이동하는 도중에 있는 물고기는 먹지 않는다- 이때, 큰 물고기를 먹는다고 항상 최적의 해를 보장하지 않는다 ..
![[프로그래머스] 사칙연산 (Java, DP, lv4)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8lWZh%2FbtsIKK7Sz9Y%2FCJQsi56Za7KpB7fkLKeq90%2Fimg.png)
문제 출처https://school.programmers.co.kr/learn/courses/30/lessons/1843# 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이- 동적 프로그래밍 (dynamic progamming)- bottom-up 방식 풀이 이 문제에서 주의할 점은 사칙연산에서 +는 결합 법칙이 성립하지만, -는 결합법칙이 성립하지 않는다는 부분이다 그렇기 때문에 각 구간별 최대값, 최소값을 구한 후 경우의 수를 고려해야 한다 출처. 나무 위키한 식에서 연산이 두 번 이상 연속될 때, 앞쪽의 연산을 먼저 계산한 값과 뒤쪽의 연산을 ..
![[프로그래머스] N으로 표현 (Java, DP, lv3)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhKC9T%2FbtsIKalf3XT%2F25EtEApjJjrTN6zbEtIpRk%2Fimg.png)
문제 출처 https://school.programmers.co.kr/learn/courses/30/lessons/42895# 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이- 동적 프로그래밍 (Dynamic Programming)- 숫자 N과 사칙연산을 사용해서 number가 만들어지는 N의 사용횟수(1 ~ 8개) 최소값을 구하는 문제- List 컬렉션에 Set 자료구조를 사용하여 중복을 제거하고, 연산 결과를 자리수마다 담을 수 있도록 하였다List> data = new ArrayList();for(int i = 0; i ());} 우선 첫 자..
![[Spring Boot] Simple Cache, EhCache(v3.10.8) 간단 테스트 해보기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVUt5c%2FbtsIKXS0lmG%2Fv0vxPjPzSpsEeeTCYCf4k0%2Fimg.png)
캐시란?- 데이터나 값을 미리 복사해놓는 임시 저장소- 시스템 성능을 향상시키기 위한 메커니즘 - 캐시에 데이터를 저장하고 엑세스하는 프로세스이다 캐시를 사용해야 하는 이유① 데이터 접근이 빠르고 비용이 저렴② 애플리케이션 성능이 향상됨③ 응답이 빠름④ 메모리에 데이터 접근하는게 DB에서 가져오는 것보다 항상 빠름⑤ 비용이 많은 백엔드 요청이 줄어듦 캐시에 데이터를 미리 복사해 놓음으로써 처리/접근 시간(비용) 없이 빠른 속도로 데이터 접근할 수 있다 언제 사용- 자주 변경되지 않는 데이터- 원본 데이터에 접근/처리 시간이 오래 걸리는 경우 캐싱 종류 ① 인메모리 캐싱 (ex. Redis)② 데이터베이스 캐싱 (ex. hibernate 1차 캐시)③ 웹 서버 캐싱 - HTTP Cache : 브라우저/프록..
![[프로그래머스] 징검다리 (Java, Parametric Search, lv4)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAVKi8%2FbtsIKSxHLBE%2FGM57HVmqbCqtmJn4cnmKjk%2Fimg.png)
문제 출처 https://school.programmers.co.kr/learn/courses/30/lessons/43236 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이- 처음 int[] rocks에서 n개의 바위를 제거하는 조합을 구하는 방식을 생각했으나 50,000C25,000으로 시간 초과 예상 - 이진 탐색 중 매개변수 탐색으로 할 경우 N * log(1억) = 50,000 * 30 시간 복잡도로 풀이 가능 절차- (중요*) int[] rocks를 오름차순 정렬 (ex. [2, 11, 14, 17, 21] )- L과 R의 범위를 지정- 바..
![[프로그래머스] 디스크 컨트롤러 (Java, Heap, lv3)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg6tZ2%2FbtsIJZ5m5Yw%2F6wZzLOd5FkSQVdxd6Li2Kk%2Fimg.png)
문제 출처 https://school.programmers.co.kr/learn/courses/30/lessons/42627 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이습관처럼 우선 순위 큐에 다 넣고, 정렬을 했었는데 경쟁을 할 때 다음 노드들의 값을 갱신 어떻게 해야 할지에서 막혀서 많은 시간 낭비를 하였다 (습관과 사고를 고쳐야 하는데 .. ) 예제 입력 jobs : [[0, 3], [1, 9], [2, 6]]result : 9 단순히 작업 시간 순으로 정렬한다고 해서 결과값을 구할 수 없었다10ms(= (3 + 11 + 16) / 3) ..
![[프로그래머스] 더 맵게 (Java, Heap, lv2)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgXKMB%2FbtsIK79ecHG%2FkVsl7SbMObXGTBPXxOk2qK%2Fimg.png)
문제 출처 https://school.programmers.co.kr/learn/courses/30/lessons/42626 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 스코빌 지수 가장 적은 두 가지 음식을 섞어 새로운 음식을 만든다 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) - K 이상 음식을 만들 수 있는 최소 턴 수 (만약 모두 섞었는데 못 구하는 경우 -1 리턴) - 우선 순위 큐, PriorityQueue 사용..
![[프로그래머스] 아이템 줍기 (BFS, Java, lv3)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F61N5I%2FbtsIDUcmr8W%2FhRO8u24a4VoQ7cPP6U7dhK%2Fimg.png)
문제 출처 https://school.programmers.co.kr/learn/courses/30/lessons/87694 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이- 격자형 그래프 문제 (BFS)- rectangle의 원소는 각 직사각형의 [좌측 하단 x, 좌측 하단 y, 우측 상단 x, 우측 상단 y] 좌표 형태로 주어진다- 직사각형 외곽 테두리를 통해 시작 (x, y) 에서 도착 (x,y) 까지 최단 거리를 구한다 문제 예시1에서 (3,5) -> (4,5)로 가야하는데 (3,6)으로 가버려서 15(오답)이 나와 시간 소비를 많이 했다..
![[프로그래머스] 퍼즐 조각 채우기 (Java, BFS, lv3)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLiZDC%2FbtsIDOXp26Q%2FwtktkOehjk37paZgInBi30%2Fimg.png)
문제 출처https://school.programmers.co.kr/learn/courses/30/lessons/84021 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이 요약 1. game_board의 빈 영역(0)과 table의 블록 영역(1)을 구한다2. 빈 영역에 블록이 끼워지는지 회전하며 최대 4번 비교한다3. 블록이 빈 영역에 끼워질 경우 결과값에 블록 크기를 누적하고, 사용처리한다 (2-3 반복) ① game_board 의 빈 영역(0), table 에 블록 영역(1)을 BFS 로 구한다List> emptySpace = new Arra..
![[프로그래머스] 주식 가격 (Java, lv2)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctApgs%2FbtsIEsSKpk4%2FK6f1d0QcpG7VNTzmW5JGa1%2Fimg.png)
문제 출처https://school.programmers.co.kr/learn/courses/30/lessons/42584 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이초 단위로 기록된 주식 가격이 담긴 배열 prices가 주어질때 가격이 떨어지지 않는 기간은 몇초인지 return- 제한 사항 int[] prices의 길이는 2 이상 100,000 이하 - O(n^2)으로 풀이시 O(10^10) 발생 가능- 스택을 사용하여 O(N) 풀이, 인덱스 번호를 스택에 넣는다는 아이디어를 생각하지 못했다. prices : [1, 2, 3, 2, 3]ret..
문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/181857 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 풀이int[] arr 주어질 때 길이가 2의 거듭 제곱이 되도록 하고, 빈 공간은 정수 0으로 채운다 비트 연산자를 사용해서 2의 거듭 제곱 길이를 구한다① arr 길이가 4인 경우 : 4 & 3 == 0 이 true가 되서 4가 반환② arr 길이가 6인 경우 : n보다 커질때까지 result 값을 2배씩 증가해서 8을 반환private int size(int n) { if((..
![[Java] TreeSet 주요 메소드 살펴보기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoAj46%2FbtsHg65wbxq%2FlC0f1FKc7KymWWMzQ8PLrk%2Fimg.png)
TreeSet ? - Java Collection Framework 제공하는 자료구조- 이진 탐색 트리(binary search tree)로 구현 - 시간복잡도 : O(logN) (HashSet의 경우 O(1))- 범위 탐색과 정렬에 유리 - Collection, Set 에서 제공하는 기본 메소드 또한 사용 가능- 중복 허용 X- null 허용 X (NPE 발생)- 정렬 기준의 경우 객체의 Comparable이나 TreeSet 생성자에 Comparator 초기화하여 사용- thread-safe 하지 않다 생성자- 내부적으로 Map 자료 구조를 사용하고, 아래와 같이 생성자를 제공한다 - 인자가 없는 기본 생성자를 사용할 경우 TreeMap으로 생성된다private transient NavigableMa..
![[넥스트스탭] 블랙잭 - 자바 플레이 그라운드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczZ5md%2FbtsEpmCr7xu%2Fs32kD0WWc2sinrFTNveISK%2Fimg.jpg)
깃 저장소학습 전https://github.com/ljw1126/my-java-blackjack-playground/tree/exercise-blackjack/src/main/java/nextstep/blackjack 학습 후https://github.com/ljw1126/my-java-blackjack-playground/tree/practice/src/main/java/nextstep/blackjack어려웠던 부분 - 클래스 책임을 제대로 처리하지 못하여, 로직이 분산되어 코드를 읽기 힘들었음- 테스트시 딜러와 플레이어가 가진 패를 초기화하는 방법을 생각지 못해 헤매었슴- 블랙잭 게임에 대한 이해 부족 (=요구사항 이해 부족)특히나 블랙잭 게임의 승패 판정할 때 딜러와 플레이어간의 1:1 비교를 이해..
![[넥스트스탭] 좌표계산기 - 자바 플레이 그라운드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwhKzu%2FbtsEiWR511y%2F4D3Gx9bEyaGN90B1XoADV1%2Fimg.jpg)
깃 저장소https://github.com/ljw1126/my-java-coordinate-playground/tree/practice/src/main/java복습 - 좌표 계산기 (선, 사각형, 삼각형)[요구사항]① 사용자가 점에 대한 좌표 정보를 입력한다② 좌표 정보는 괄호로 둘러쌓여 있으며, 쉼표(,) 로 x/y값을 구분한다 [예시]선의 경우 (10,10)-(14,15)사각형의 경우 (10,10)-(22,10)-(22,18)-(10,18)삼각형의 경우 (10,10)-(14,15)-(20,8)③ x, y 좌표 값의 범위는 1 ~ 24 이다④ 입력 범위를 초과할 경우 에러 문구를 출력하고 다시 입력을 받는다⑤ 정상적인 값을 입력한 경우, 콘솔에 2차원 그래프와 결과값을 출력한다 [결과]선의 경우 두 점..
![[넥스트스탭] 자동차 경주 게임 - 자바 플레이 그라운드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2bH4j%2FbtsEf6mQ8iw%2FRhy0POkBaIaaccn94iEY51%2Fimg.jpg)
깃 저장소학습 전https://github.com/ljw1126/my-java-racingcar-playground/tree/myself/src/main/java 학습 후https://github.com/ljw1126/my-java-racingcar-playground/tree/practice/src/main/java복습 - 자동차 경주 게임[기능 요구사항]① 각 자동차에 이름을 부여할 수 있다. (이때 자동차 이름은 5자를 초과할 수 없다)② 자동차 이름은 쉼표(,)를 기준으로 구분한다③ 전진하는 조건은 0에서 9사이에서 random값을 구한 후 값이 4이상인 경우이다④ 게임 종료 후 우승자를 출력한다. (이때 우승자는 한명 이상일 수 있다) [실행 결과]경주할 자동차 이름을 입력하세요(이름은 쉼표(,..
![[넥스트스탭] 숫자 야구 게임 - 자바 플레이 그라운드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN4r5n%2FbtsEcbCjtFv%2F6McfsbNevjRD6SZ78q416K%2Fimg.jpg)
강의 링크 https://edu.nextstep.camp/c/9WPRB0ys/ 플레이그라운드 edu.nextstep.camp깃 허브 저장소학습 전https://github.com/ljw1126/my-java-baseball-playground/blob/myself/src/main/java 학습 후https://github.com/ljw1126/my-java-baseball-playground/tree/practice/src/main/java학습 전 직접 작성한 코드 (펼처보기)반성)① 객체 지향적 언어를 사용하면서도, 거리가 먼 절차적 코드를 작성② 절차적 코드로 인해 한 눈에 로직을 파악하기 힘듦 (가독성 저하)③ 테스트 코드 미작성④ 클래스 미분리 - view, model, controller⑤ 의미..
![[BOJ13911] 집 구하기 (최단경로, 다익스트라)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHJQ7i%2FbtsFNxJrreg%2FKerCAjpRpKka5bcK2Z5iE1%2Fimg.png)
문제 링크 https://www.acmicpc.net/problem/13911 13911번: 집 구하기 첫줄에는 정점의 개수 V(3 ≤ V ≤ 10,000)와 도로의 개수 E(0 ≤ E ≤ 300,000)가 주어진다. 그 다음 E줄에 걸쳐 각 도로를 나타내는 세 개의 정수 (u,v,w)가 순서대로 주어진다. 이는 u와 v(1 ≤ u,v ≤ V)사 www.acmicpc.net 문제 풀이 - 다익스트라 알고리즘 - 맥세권과 스세권을 만족하는 최소 최단 거리 합 구하는 문제 (없는 경우 -1 출력) - 맥도날드와 스타벅스 각각 시작점으로 최단 경로 구할 경우 시간 초과 발생 가능 - MultiSource BFS 아이디어 응용해서 총 2번 다익스트라 실행 ① 모든 맥도날드를 시작점으로 집까지의 최단 거리 ② 모..