4장은 클래스와 인터페이스를 사용할 때 주의할 점과 유용한 팁을 알려준다. 15. 클래스와 멤버 접근 권한 최소화 잘 설계된 컴포넌트는 내부 구현 정보를 완벽하게 숨겨, 구현과 API를 깔끔하게 분리한다. 다른 컴포넌트와 소통할 때에는 오직 API만 사용하고 서로의 내부 동작 방식은 알 필요가 없다. 이 개념은 정보 은닉 또는 캡슐화로, 소프트웨어 설계의 근간이 되는 원리다. 정보 은닉 장점 정보 은닉을 잘 하면 컴포넌트들을 서로 분리해 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해준다. 여러 컴포넌트 병렬로 개발해 개발 속도 높임 컴포넌트 파악이 쉽고 교체 부담도 적어 시스템 관리 비용 낮춤 성능 최적화에 도움을 줌 소프트웨어 재사용성 높임 개별 컴포넌트 동작을 검증할 수 있..
문제 https://www.acmicpc.net/problem/22251 22251번: 빌런 호석 LED를 2개까지 바꿀 수 있을 때, 5층에서 3층, 6층, 8층, 그리고 9층으로 바꿔버릴 수 있다. www.acmicpc.net 치르보기 빌딩의 엘리베이터 디스플레이의 숫자를 변경할 수 있는 경우의 수를 계산하는 문제였다. 아래는 각각의 숫자가 보이는 방식이다. 문제 풀이 0~9까지의 숫자들의 7개의 표시등을 모두 저장하고 각각의 숫자가 다른 숫자로 바뀔 때 필요한 반전 횟수를 계산해 저장했다. 그리고 숫자를 변경할 때 K자리의 LED이기 때문에 12라는 숫자를 0012라고 표기해야 하기 때문에 string 으로 변환해준 후, 백트래킹을 하며 앞자리부터 계속해서 바꿔줬다. 처음에 아무리 생각해도 로직상 ..
3장은 모든 Object를 상속받는 객체가 공통적으로 가지는 equals와 hashcode, tostring과 같은 final이 아닌 메서드를 구현할 때 주의할 점에 대해 다룬다. 10. equals 재정의 java에서는 객체 식별성을 확인해 동치성을 확인한다. 이때 논리적인 동치성을 확인해야 할 때 equals를 재정의해야 한다. equals를 재정의하지 않는 상황 각 인스턴스가 본질적으로 고유할 때 동작하는 개체를 표현하는 클래스 (Thread) 인스턴스의 논리적 동치성을 검사할 일이 없을 때 상위 클래스에서 재정의한 equals가 하위 클래스에 딱 맞을 때 대부분의 Set 구현체 : AbstractSet이 구현한 equals를 상속받아 사용 클래스가 private, package-private이고 ..
이전부터 이펙티브 자바 책을 보고 싶었는데, 2월 한 달 동안 이 책을 보려고 한다. 원래는 클린 코드를 마저 보려고 했으나 자바를 깊이 있게 이해하고, 공부한 후에 클린 코드 책을 보는 것이 더 도움이 될 것 같아 이펙티브 자바를 먼저 보게 되었다. 그동안 깊게 생각하지 않고 권장되는 방법으로 사용하던 것들도 있고, 지양해야 하는 방법을 사용한 적도 있다. 앞으로 짜게 될 코드들은 모두 이유가 있는 코드들이길 바란다. 2장은 객체를 생성하고 파괴하면서 주의해야 할 점들에 관한 내용이다. 객체를 어떻게 생성하는지, 어떤 객체를 생성해야 하는지, 파괴를 언제 어떻게 하는지 등과 같이 알고 사용하면 너무 좋은 내용들로 구성되어 있었다. 싱글톤이면 어떤 것이 좋은지 모르고 싱글톤으로 만들어 사용하거나, 의존 ..
문제 https://www.acmicpc.net/problem/12851 12851번: 숨바꼭질 2 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 www.acmicpc.net 수빈이가 움직일 수 있는 방법은 3가지이고 동생이 있는 위치까지 갈 수 있는 가장 빠른 시간과 그 시간으로 찾는 방법의 개수를 구하는 문제였다. 수빈이는 1초 후에 다음과 같이 이동할 수 있다. X-1 X+1 X*2 문제 풀이 처음에는 DP만을 가지고 이 문제를 풀려고 했는데, 방법의 개수를 구하는 것이 너무 어려웠다.. 직전에 갱신한 방법이 무엇인지도 ..
문제 https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변 www.acmicpc.net 주어진 맵에서 각각의 테트로미노를 회전, 대칭해서 최댓값을 찾는 문제였다. 문제 풀이 500x500의 맵이고 회전과 대칭을 한 테트로미노의 총 개수가 19개였다. 대략 5,000,000 정도가 나왔고, 각각의 합을 더해줄 때 각 테트로미노마다 4번의 연산이 필요하기 때문에 20,000,000 정도가 나왔다. 제한 시간이 2초로 아주 넉넉했기 때문에 완전 탐색으로 풀었다. 처음에는 회전하는 메..
문제 https://school.programmers.co.kr/learn/courses/30/lessons/49189 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1번 노드에서 가장 멀리 떨어진 노드의 개수를 구하는 문제였다. 문제 풀이 n이 최대 20000이어서 플루이드 워셜 알고리즘을 사용하면 시간 초과가 날 것 같아서 BFS로 각 노드까지의 거리를 구했다. BFS는 레벨 별로 탐색하기 때문에 탐색할 때마다 dist 배열을 갱신했다. 그리고 탐색할 때마다 최대 dist를 계속 갱신해줬다. 마지막에 최대 dist와 dist가 같은 노드들의 개수를 세..
문제 https://school.programmers.co.kr/learn/courses/30/lessons/12927# 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 야근을 하고 남은 일의 제곱의 합의 최솟값을 구하는 문제였다. 문제 풀이 남은 일의 제곱의 합을 구해야 하기 때문에 큰 수를 최대한 줄여야 했다. 만약 works가 [10, 10, 8, 6, 4]가 있고 N이 5라면 합이 최소가 되기 위해서는 일을 한 결과가 [8,8,7,6,4]가 되어야 한다. 이렇게 하기 위해서 먼저 works를 내림차순으로 정렬했고, N만큼 반복하면서 현재 work에서..