정적 팩터리 메서드의 장점 1. 이름을 가질 수 있다. 하나의 시그니처로는 생성자를 하나만 만들 수 있기 때문에 생성자에 넘기는 매개변수와 생성자 자체만으로 반환될 객체의 특성을 제대로 설명할 수 없다. 하지만 정적 팩터리 메서드는 이러한 제약이 없다. 시그니처가 같은 생성자가 여러 개 필요할 것 같으면 각각 차이를 잘 드러내는 이름을 지어주어 반환 객체의 특성을 쉽게 묘사할 수 있다. 예를 들면, 이름을 가진 정적 팩터리 메서드가 소수인 BigInteger를 반환한다는 의미를 더 잘 나타내고 있다. 위의 예시를 통해 이름을 가지는 정적 팩터리 메서드의 장점을 한눈에 확인할 수 있다. 2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다. 불변 클래스 인스턴스를 미리 만들어 놓거나 인스턴스 캐싱으로 ..
시작, NextStep 아직 개발 경험이나 실력이 많이 부족하지만 개발을 할 때 항상 고민하는 부분이 있다. 내가 코드를 이렇게 짜면 다른 사람이 유지 보수하기 쉬울까? 내가 작성하는 코드가 레거시가 될 수 있다는 것을 항상 염두하며 코드를 작성하려고 노력은 하고 있지만 실제로 내가 작성한 코드가 좋은 코드인지, 읽기 쉽고 유지 보수하기 좋은 코드인지에 대한 의문은 항상 가지고 있었다. 그래서 유지 보수하기 좋은 코드란 무엇인지, 객체지향의 특징을 잘 살린 코드 등에 대한 모범 사례를 공부하기 시작했다. 하지만 이러한 사례들을 학습한다고 해도 제대로 활용한 것인지에 대한 의문점은 가시질 않았고 명확한 코드 리뷰에 대한 필요성이 느껴졌다. 그러던 중 우연히 NextStep이라는 강의를 알게 되었고, 소개된..
문제 백준 2839 설탕배달 https://www.acmicpc.net/problem/2839 풀이 문제에서 요구하는 것은 설탕을 정확하게 최소한으로 가져갈 수 있는 봉지의 수이다. 그렇다면 3Kg봉지와 5Kg봉지 중 5Kg봉지를 가장 많이 쓰는 것이 최적해가 될 것이다. 이 문제는 접근 방법에 따라 쉬울수도 어려울수도 있는 문제인 것 같다. 예를들면, N킬로그램을 구하기 위해 더하는 방법으로 접근한다면 경우의 수가 굉장히 많아져서 최적해를 찾아내기 어려워진다. 접근방법으로 N킬로그램부터 3Kg씩 빼면서 5Kg의 배수를 찾아내면 굉장히 쉽게 풀린다. 코드 import java.util.Scanner; /* 설탕 배달 */ public class baekjoon_설탕배달 { public static voi..
문제 백준 16236 아기상어 https://www.acmicpc.net/problem/16236 풀이 지도에 상어가 1마리 존재하고, 상어는 자신보다 작은 물고기를 먹을수 있다. 자신보다 큰 물고기 칸에는 갈 수 없고, 상어는 자신의 길이와 같은 수의 물고기를 먹으면 길이가 1만큼 증가한다. 상어는 가장 가까운 물고기부터 먹는다. 상어가 먹을 수 있는 모든 물고기를 먹었을 때 최소 시간을 구하는 문제이다. 조건이 까다롭지만 bfs탐색을 통해 풀수있다. 지도에서 9라는 값을 찾아 초기 시작 좌표를 획득하고 bfs탐색을 진행한다. 탐색을 통해 먹을 수 있는 물고기를 찾아 해당 좌표에 있는 값을 0(물고기를 먹었다는 뜻)으로 바꾸고 그 좌표를 기준으로 다시 bfs탐색을 수행한다. 먹을 수 있는 물고기가 여러..
문제 백준 7576번 토마토 https://www.acmicpc.net/problem/7576 풀이 토마토가 모두 익을 때까지의 최소 날짜를 출력해야 한다. 만약, 저장될 때부터 모든 토마토가 익어있는 상태이면 0을 출력해야 하고, 토마토가 모두 익지는 못하는 상황이면 -1을 출력해야 한다. map에 입력받은 배열에 1인 값을 찾아 bfs 탐색을 시작한다. 방문하지 않은 배열이고 값이 0(익지않은 토마토) 일때, 값을 1(익은 토마토)로 바꾸고 방문처리 해준 후 큐에 다음 좌표를 담고 탐색을 계속 진행한다. 코드 #include #include using namespace std; struct POS{ int y,x,date; }; int n,m,ans; bool visited[1000][1000]; i..
문제 프로그래머스 전화번호 목록 https://programmers.co.kr/learn/courses/30/lessons/42577 풀이 ph에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하여 답을 출력하는 문제이다. find 함수를 이용하여 간단하게 해결했다. find 함수는 매개변수가 존재하면 0을 존재하지 않으면 -1을 리턴한다. check에 반환되는 값이 0일때 cnt를 1증가시키고 cnt의 값이 1 이상일 경우 접두어가 존재한다고 판단하게 된다. 코드 #include #include #include using namespace std; bool solution(vector ph) { bool answer = true; int n = ph.size(); for(int ..
문제 프로그래머스 피보나치 수 https://programmers.co.kr/learn/courses/30/lessons/12945 풀이 메모이제이션을 이용하면 간단하게 풀 수 있다. F(n) = F(n-1) + F(n-2) 수식을 그대로 적용하여 반복문을 통해 피보나치 수열을 구하면 된다. 코드 #include #include using namespace std; int memo[100000]; int fibo(int n){ memo[0] = 0; memo[1]= 1; for(int i=2;i
문제 프로그래머스 H-Index https://programmers.co.kr/learn/courses/30/lessons/42747 풀이 H-INDEX는 H번 이상 인용된 논문이 H개 이상일 때, H의 최대 값을 구하는 문제이다. 내림차순 정렬을 통해 인덱스와 값을 비교한다. 인용수가 index보다 큰 경우 answer+1 그 수가 index와 작거나 같아지는 순간 answer를 리턴해주면 된다. 코드 #include #include #include using namespace std; bool compare(int a, int b){ return a > b; } int solution(vector citations) { int answer= 0; sort(citations.begin(),citatio..
문제 프로그래머스 연습문제- 같은 숫자는 싫어 https://programmers.co.kr/learn/courses/30/lessons/12906 풀이 arr 배열안에 연속적으로 나타나는 숫자를 하나만 남기고 제거하는 문제이다. ans라는 배열에 arr의 첫번째 값을 초기값으로 넣고, 이후 수를 비교한다. ans의 -1번째 수, 즉 ans 배열의 마지막 원소를 arr[i]번째 수와 비교하여 답을 찾을 수 있다. 코드 def solution(arr): ans = list() ans.append(arr[0]) for i in range(1, len(arr)): if ans[-1] != arr[i]: ans.append(arr[i]) else: continue return ans