Java

· Books
"오브젝트: 코드로 이해하는 객체지향 설계" 책의 기록입니다. 협력 협력이란, 어떤 객체가 다른 객체에게 무엇인가를 요청하는 것 메시지 전송: 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단 메시지를 수신한 객체는 메서드를 실행해 요청에 응답 객체가 메시지를 처리할 방법을 스스로 선택! → 자신의 일을 스스로 처리하는 자율적인 존재 객체를 자율적으로 만드는 기본적인 방법은 내부 구현을 캡슐화하는 것 협력이 설계를 위한 문맥을 결정 객체의 행동을 결정하는 것은 객체가 참여하고 있는 협력 객체의 상태를 결정하는 것은 행동 결론적으로, 협력이 객체를 구성하는 행동과 상태를 모두 결정 → 객체 설계에 필요한 문맥을 제공 책임 협력에 참여하기 위해 객체가 수행하는 행동 무엇을 알고 있는가(kno..
· Books
"오브젝트: 코드로 이해하는 객체지향 설계" 책의 기록입니다. 객체지향 설계 설계란 코드를 배치하는 것이다. 설계를 구현과 떨어트려서 이야기하는 것은 불가능하다. 좋은 설계란, 오늘 요구하는 기능을 온전히 수행하면서 내일의 변경을 매끄럽게 수용할 수 있는 설계 왜? 요구사항이 항상 변경되기 때문임. 개발을 시작하는 시점에 구현에 필요한 모든 요구사항을 수집하는 것은 불가능에 가까움 코드를 변경할 때 버그가 추가될 가능성이 높기 때문 변경에 유연하게 대응할 수 있는 코드를 짜자.ᐟ 객체지향 프로그래밍을 향해 다음 두 가지에 집중하자 첫째, 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민하라. 클래스의 윤곽을 잡기 위해서는 어떤 객체들이 어떤 상태와 행동을 가지는지 먼저 결정 둘째, 객체..
· Algorithm
문제 링크 1. 종만북 어려워서 힐링차 오랜만에 solved 들어가서 풀어본 문제 아이디어는 떠오르는데 코드 써 내려가는 게 귀찮았다. 조금 더 깔끔하게 풀 수 있을 것 같은데, 현재 코드는 조금 난잡한 느낌이 없지 않아 있다. 2. 입출력을 어떻게 처리할지 많이 고민했다. input[]은 n개의 수로 이루어진 수열이다. op_num[]은 덧셈, 뺄셈, 곱셈, 나눗셈의 개수를 나타낸다. op_num[]의 index 번호를 각각의 연산자로 간주하였다. 즉, 0은 덧셈, 1은 뺄셈 이런 식으로 말이다. opArr[]에 연산자를 숫자로 표현하여 집어넣었다. 예를 들면, op_num[0]=2, op_num[1]=1, op_num[2]=1, op_num[3]=2 이라면 opArr = {0, 0, 1, 2, 3, ..
· Algorithm
문제 링크 1. 분할 정복 문제 입력의 최대 크기가 20,000이므로 완전 탐색으로 풀기에는 시간 초과가 날 것. 2. 자세한 풀이는 책 참고 (p.196) $n$개의 판자를 절반으로 나눠 두 개의 부분 문제를 만들자. 최대 직사각형은 다음 세 가지 중 하나에 속할 것 1. 왼쪽 부분 문제에 존재 2. 오른쪽 부분 문제에 존재 3. 왼쪽과 오른쪽 부분 문제에 걸쳐서 존재 1번과 2번은 어렵지 않으나 3번의 경우 왼쪽, 오른쪽 부분을 높이가 높은 쪽으로 한 칸씩 확장하면서 찾자. 3. import java.util.Scanner; public class FENCE { static int[] h; public static void main(String[] args) { Scanner sc = new Scan..
· Algorithm
문제 링크 1. 분할 정복 문제 완전탐색으로 풀 수 있지만, 효율적으로 문제를 풀기 위한 방법을 고안하자. 2. 자세한 풀이는 책 참고 (p.193) 무식한 방법은 쿼드 트리 압축을 풀어 실제 그림을 만들고 이를 반전하고 다시 압축하는 것 그러나, N이 엄청 클 때 점 하나만 다른 색이라면 매우 비효율적 압축을 다 풀지 않고 뒤집는다면? 1, 2, 3, 4분면이 3, 4, 1, 2사분면으로 바뀌는 아이디어 문자열 입력 부분에서 에러가 나서 뭐가 문제인지 고민을 많이 했다. sc.nextInt()에서 정수를 입력받은 뒤 엔터를 입력하면 개행 문자가 다음 sc.nextLine()의 입력으로 들어가 버린다. 이를 해결하기 위해 정수를 입력받고 나서 sc.nextLine()을 한번 실행 해주자. 3. impor..
· Algorithm
문제 링크 1. 완전탐색(브루트포스) 문제 이것으로 완전탐색 문제는 마무리가 되는데, 뭔가 대략적인 틀이 보이는 것 같으면서도 여전히 어렵다. 2. 자세한 풀이는 책 참고 (p.170) 스위치를 누르는 횟수의 모든 조합을 열거하면 무한할 것이다. 12시간 지나면 제자리로 돌아온다는 점을 이용해 유한하게 한정시키기 각 스위치를 누르는 횟수는 0에서 3번 사이이므로 전체 경우의 수는 $4^{10}=1,048,576$개 문제의 조건을 문자열로 표현하는 방법도 익히자 3. import java.util.Scanner; public class CLOCKSYNC { static final int INF = 9999, SWITCHES = 10, CLOCKS = 16; static final String linked[..
· Algorithm
문제 링크 1. 완전탐색(브루트포스) 문제 2. 자세한 풀이는 책 참고 (p.161) 블록 한 개를 내려놓고 남은 흰 칸들을 재귀 호출을 이용해 덮도록 하기 빈칸 중 좌상단을 기준으로 블록을 두기 (즉, 기준점 위와 왼쪽은 검은 칸) 그렇게 되면 기준 점에서 블록을 놓을 수 있는 경우의 수는 4가지 3. import java.util.Scanner; public class BOARDCOVER { static int height, weight, wall; static int dir[][][] = { { { 0, 0 }, { 0, 1 }, { 1, 0 } }, { { 0, 0 }, { 0, 1 }, { 1, 1 } }, { { 0, 0 }, { 1, 0 }, { 1, -1 } }, { { 0, 0 }, { ..
· Algorithm
문제 링크 1. 종만북 초반 4장까지 개념만 보면서 지루했었는데, 드디어 문제 풀이에 들어갔다. 근데 난이도 '하'인데 뭐가 이렇게 어렵지.. 종만북 완독 가능할지 모르겠다. 완전 탐색 기법을 재귀적으로 풀어보라는 문제여서 그렇게 풀어보려고 노력했다. 그런데, 잘 떠오르지 않아 나만의 방식으로 조합 등을 써서 풀어보려고 했으나, 풀지 못했다. 2. 자세한 풀이는 책 참고 (p.157) 각 답을 만드는 과정을 여러 개의 조각으로 나누기. 서로 친구인 배열을 만드고 거기서 친구인 두 학생을 찾아 짝짓고, 남은 학생들을 짝짓자. 중복 체크! 3. import java.util.Scanner; public class PICNIC { static int n, m; static boolean[][] areFrien..
squareyun
'Java' 태그의 글 목록