목록전체 글 (102)
영호
개요 3주 차 미션에서는 로또 게임이 나왔습니다. 미션을 진행하면서 있었던 일들에 대해 작성해보겠습니다. 신경 썼던 점 자율적인 객체 만들기 테스트하기 좋은 코드 작성 연관관계와 의존관계 분리 자율적인 객체 캡슐화를 위해 객체가 자신이 가지고 있는 정보에 대한 책임을 가지게 함으로써 응집도를 높이고 결합도를 낮추고 싶었습니다. 왜냐하면 프리코스를 진행하면서 읽은 책, 구글링, 세미나 영상 등 모두 좋은 객체지향 설계를 위해서는 응집도를 높이고 결합도를 낮춰야 한다는 내용을 설명하며 캡슐화가 빠지지 않았습니다. 물론 2주 차 미션에서도 해당 내용을 지키기 위해서 노력했지만, 지속적인 노력을 통해 실력을 키우고 싶었습니다. 이 과정에서 로또 당첨 순위를 판별하는 책임을 전체 로또 정보를 가지고 있는 Enti..
개요 1주 차에는 코딩 테스트 형식의 문제들이 나왔고, 2주 차에는 프리코스를 검색해보면 항상 나오는 숫자 야구 게임이 나왔습니다. 1주 차 미션을 진행하면서 무엇을 신경 쓰면서 진행했는지 정리해보겠습니다. 무엇을 신경 썼는가 데이터 중심이 아닌 책임에 중심을 둔 설계 캡슐화 객체에서 외부에 공개할 메서드와 내부에 감출 메서드 책임에 중심을 둔 설계 그동안 저는 DB, 애플리케이션을 설계할 때 구현해야 하는 기능을 보고 '이런 데이터가 있어야겠네'라고 생각하면서 설계를 해왔습니다. 그러나 객체 지향적인 설계를 위해선 데이터 중심이 아닌 구현해야 하는 기능을 수행할 적절한 객체를 찾고, 구현 시점에서 필요한 데이터가 무엇인지 생각해야 된다는 내용을 알게 됐습니다. 그래서 저는 구현해야 하는 기능 목록을 정..
개요 stream을 공부하면서 Array를 stream으로 만드는 방법이 2가지가 있는 것을 알았고, 2가지 방법의 차이점에 대해 궁금증이 생겨 알아본 내용입니다. Collection이 아닌 Array를 stream으로 만들 때 2가지 방법이 있습니다. Arrays.stream() Stream.of() 위 2가지 방법은 parameter로 primitive타입의 배열을 넘기느냐, non-promitive타입의 배열을 넘기느냐에 따라 반환 값이 달라집니다. Stream.of() primitive타입 배열로 Stream.of() 호출했을 때 실행되는 코드 public static Stream of(T t) { return StreamSupport.stream(new Streams.StreamBuilderIm..
문제 링크 https://www.acmicpc.net/problem/2170 나의 풀이 가장 핵심 로직은 겹치는 줄 들을 어떻게 합치느냐입니다. 예제 입력 중 (1,3), (2,5), (3,5)는 (1,5)로 합칠 수 있습니다. 합쳐지는 조건 우선 주어진 입력들을 오름차순으로 정렬합니다. 첫 번째 입력 좌표를 start, end변수로 설정합니다. 두 번째 좌표부터 끝까지 탐색하며 합칠 수 있는지 살펴봅니다. 만약 i번 좌표의 시작점이 기존 좌표의 start
문제 링크 https://www.acmicpc.net/problem/14501 나의 풀이 주의점 n + 1일에 퇴사를 하기 때문에 상담이 n+1 일에 끝나는 경우까지 고려해야 합니다. 처음 접근 1일부터 n일까지 해당 날짜의 상담을 진행하는 경우 안하는 경우를 고려해서 점화식을 세우려고 시도해봤습니다. 만약, 1일차 상담에 이틀이 필요할 때 3일차 상담을 진행하는 경우의 점화식을 어떻게 세울지 고민하다 결국 해결하지 못하고 구글링을 했습니다. 구글링 결과 1일 부터 시작하는 것이 마지막 n일부터 시작해서 dp테이블을 갱신합니다. n=7 7일차 상담은 이틀이 필요하기 때문에 7 + 2 > n+1 이므로, 상담을 진행할 수 없습니다. 2일차 상담의 경우 5일이 필요하기 때문에 max(20 + dp[5], d..
문제 링크 https://www.acmicpc.net/problem/5427 나의 풀이 기본적으로 최소시간을 구하는 문제라 BFS를 사용했습니다. 그리고 문제를 '불이 옮겨진 칸 또는 이제 불이 붙으려는 칸으로 이동할 수 없다' 라는 문장이 있습니다. 즉, 불이 먼저 동서남북으로 한 칸씩 번지게 한 다음에 상근이가 동서남북으로 움직일 수 있는지 구별해야 합니다. 구현 기능 불은 동서남북으로 한 칸씩 번져야 한다. 단, 벽에는 불이 붙을 수 없다. 상근이도 동서남북으로 한 칸씩 움직일 수 없다. 역시 벽으로는 이동할 수 없고, 불이 붙으려는 칸으로 이동할 수 없다. -> 불을 먼저 번지게 함으로써 구별 상근이가 x,y 좌표 중 하나라도 map의 가장자리에 도착하게 되면 탈출가능한 경우이다. 막혔던 점 sB..
문제 링크 https://www.acmicpc.net/problem/1941 나의 풀이 잘못된 접근 잘못 세운 점화식 $$ dp[i] = dp[i - (가장 큰 제곱근 ^ 2)] + 1$$ 단순하게 가장 큰 제곱근의 제곱을 빼서 dp 테이블을 갱신하는 것이 최솟값이라고 생각을 했습니다. 예를 들어 i = 26의 경우 가장 큰 제곱근인 5의 제곱 25를 26에서 뺀 뒤 나온 1. 즉, dp[26-25] + 1 이 무조건 최솟값이라고 생각했습니다. $$ 26 = 1^2 + 5^2$$ 올바른 접근 점화식의 경우 위에서 세운 점화식이 아예 틀린 것은 아니지만 가장 큰 제곱근만 생각하는 것이 아닌 1 ~ 가장 큰 제곱근의 경우를 모두 생각해야 합니다. 12를 시도해보면 좋을 거 같습니다. $$ dp[i] = m..
instance method란 class의 instance를 생성하고, 해당 instance를 통해 호출할 수 있는 method입니다. static method란 컴파일 시점에 메모리에 올라갑니다. instance 생성없이 클래스를 통해 호출할 수 있는 method입니다. instance변수를 사용할 수 없습니다. instance변수란 말 그대로 동적으로 생성된 instance의 변수이기 때문에 컴파일 시점에 존재하지 않습니다. static method주의점 GC(Garbage Collector)가 메모리를 해제하지 않기 때문에, 너무 많이 사용하면 메모리 측면에서 문제가 생길 수 있습니다.