목록공부 (77)
빠에야는 개발중
싱글톤을 사용하는 이유 싱글톤 패턴은 인스턴스를 어플리케이션 내에서 단 한번 생성하여 계속 사용하는 패턴이다.(동일한 객체) 이렇게 하면 우선 메모리를 아낄 수 있고, 전역 객체인 싱글톤 객체를 여러 메소드에서 공유 자원으로 사용하도록 할 수도 있다. 이는 주로 DBCP 같은 공통된 객체를 여러개 사용해야하는 상황에서 많이 사용한다. 문제점 싱글톤을 과도하게 사용하면 다른 인스턴스 간의 결합도가 높아져 OCP를 위반할 가능성이 있다. 이에 따라 수정 하기도 어렵고, 테스트도 어려워진다.멀티 쓰레드 환경에서 동기화 처리를 제대로 해주지 않으면 여러개의 인스턴스가 생기는 등의 문제가 발생할 수 있다.그래서 꼭 필요한 경우가 아니라면 사용을 지양하는 것이 좋다. (아니면 시스템에 맡겨버리던가) 싱글톤을 구현하..
템플릿 메소드 패턴이란 같은 이름의 추상 메소드를 다른 클래스에서 상속받아 각자 다르게 구현하는 패턴이다. 즉 상위 클래스에서 메소드의 "틀"을 제공하는 것인데, 그야말로 추상화 자체라고 할 수 있겠다. 아래의 코드에서 여러 교복 회사들이 같은 상위 클래스 UniformFactory를 상속하여 같은 이름의 메소드 makeUniform()을 사용하지만 그 구현 내용은 각자 다르다.1234567891011121314151617181920212223242526public abstract class UniformFactory { public void makeUniform() { button(); } abstract void button();} public class Smart extends UniformFact..
팩토리 메소드 패턴이란, “어떤 인스턴스의 생성을 하위 클래스에서 담당하도록 하는 패턴”이다. 팩토리 메소드 패턴을 사용하면 조건에 따라 다른 종류의 구상 인스턴스를 생성해줄 수 있기 때문에 추상화의 효과를 볼 수 있다. 더불어 팩토리 메소드에 static을 사용하면 인스턴스를 싱글톤으로 관리할 수도 있다. 예를 들어 다음 코드를 보자. 치킨 가게에서 여러 종류의 치킨을 판매하고 싶다. 그런데 들어가는 재료의 차이를 빼고는 모든 공정이 동일하다. 그렇다면 각각의 메뉴별로 하위 클래스를 만들어줘서 그 속에서 인스턴스를 생성하면 추가되는 작업들은 팩토리 메소드만 수정할 뿐 다른 공통의 작업들은 수정할 필요가 없어진다(OCP). 또한 각각의 메소드들을 분리하였고 객체를 생성하는 메소드도 따로 존재하기 때문에 ..
N명의 사람이 있을 때, N명의 사람을 서로 다른 방법으로 줄을 세우는 방법은 N!개가 존재합니다.이 때 각각의 사람들에게 번호를 매겨서 줄을 서는 방법을 표시합니다. 예를들어 [1,2,3,4]는 1번 사람이 제일 앞에, 2번 사람이 2두번째에... 서 있는 상태를 나타냅니다.이러한 각각의 방법을 사전순으로 정렬했을때 K번째 방법으로 줄을 세우는 방법을 찾아 보려고 합니다.예를 들어 3명의 사람이 있다면 총 6개의 방법은 다음과 같이 정렬할 수 있습니다.1번째 방법은 [1,2,3]2번째 방법은 [1,3,2]3번째 방법은 [2,1,3]4번째 방법은 [2,3,1]5번째 방법은 [3,1,2]6번째 방법은 [3,2,1]이 때 K가 5이면 [3,1,2]가 그 방법입니다.사람의 수 N과 순서 K를 입력받아 K번째 ..
N개의 원판은 총 2N -1 번의 과정을 거쳐 이동할 수 있습니다. 하지만 어떠한 과정으로 원판을 옮겨야 2N -1 번만에 옮길 수 있는지는 아직 모릅니다. 원판이 N개 있을 때, Hanoi 함수에서 어떠한 과정으로 2N -1 번만에 옮길 수 있는지 과정을 리턴하세요.리턴값의 표기 방법은 다음과 같습니다.3개의 기둥은 순서대로 각각 1, 2, 3번으로 표기합니다.원판을 기둥1에서 기둥3으로 이동했다면 [1, 3]으로 표기합니다.원판을 기둥3에서 기둥1로 이동했다면 [3, 1]로 표기합니다.이러한 이동 순서를 담는 배열을 리턴하면 됩니다. 예를들어 N이 2라면 아래 그림과 같이 옮길 수 있으므로 리턴값은 [ [1,2], [1,3], [2,3] ]입니다. 기본적인 하노이탑 문제인데, 재귀를 사용한다는건 알았..
1x1 정사각형 2개가 붙어 있는 타일이 있습니다. 이 타일을 이용하여 총 2xN 의 보드판을 채우려고 합니다. 타일은 가로, 세로 두 가지 방향으로 배치할 수 있습니다.보드판의 길이 N이 주어질 때, 2xN을 타일로 채울 수 있는 경우의 수를 반환하는 tiling 함수를 완성하세요.예를들어 N이 7일 경우 아래 그림이 타일을 배치할 수 있는 한 경우입니다. 단, 리턴하는 숫자가 매우 커질 수도 있으므로 숫자가 5자리를 넘어간다면 맨 끝자리 5자리만 리턴하세요.예를 들어 N = 2일 경우 가로로 배치하는 경우와 세로로 배치하는 경우가 있을 수 있으므로 2를 반환해 주면 됩니다. 하지만 만약 답이 123456789라면 56789만 반환해주면 됩니다. 리턴하는 숫자의 앞자리가 0일 경우 0을 제외한 숫자를 ..
1,2,4 세 개의 숫자만 쓰는 124나라가 있습니다.124나라에서 사용하는 숫자는 다음과 같이 변환됩니다.10진법의 1 → 110진법의 2 → 210진법의 3 → 410진법의 4 → 1110진법의 5 → 1210진법의 6 → 1410진법의 7 → 2110진법의 수 N이 입력될 때, 124나라에서 쓰는 숫자로 변환하여 반환해주는 change124 함수를 완성해 보세요. 예를 들어 N = 10이면 “41”를 반환해주면 됩니다.리턴 타입은 문자열입니다. 어렴풋이 떠오른 풀이 방법은 3으로 나누는 것이었다. 실제로 예시는 마치 3진수를 0을 3으로 바꾸고 3을 4로 바꾼 모습이기 때문이다. 그런데 한가지 문제가 있었는데, 그것은 1, 2, 4로만 숫자를 표시해야하기 때문에 3으로 나누어 떨어졌을 때 자리수를 ..
영희는 땅따먹기 게임에 푹 빠졌습니다. 땅따먹기 게임의 땅은 총 N행 4열로 나누어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 땅을 밟으면서 한 행씩 내려올 때, 영희는 각 행의 4칸 중 1칸만 밟으면서 내려올 수 있습니다. 땅따먹기 게임에는 같은 열을 연속해서 밟을 수가 없는 특수 규칙이 있습니다. 즉, 1행에서 (5)를 밟았다면, 2행의 (8)은 밟을 수가 없게 됩니다. 마지막 행까지 모두 내려왔을 때, 점수가 가장 높은 사람이 게임의 승자가 됩니다. 여러분이 hopscotch 함수를 제작하여 영희가 최대 몇 점을 얻을 수 있는지 알려주세요. 예를 들어 1 2 3 5 5 6 7 8 4 3 2 1 의 땅이 있다면, 영희는 각 줄에서 (5), (7), (4) 땅을 밟아 16점을 최고점으로 받을 수 있으..
1보다 큰 N개의 도시 중 한 곳에 공항을 지을 예정입니다. 사람들의 편의를 위해 공항으로부터 각 사람들까지의 도시간 이동 거리가 최소가 되는 도시에 짓기로 하였습니다. 편의상 도시는 일직선상에 놓여있다고 가정하며 좌표의 범위는 음수가 포함됩니다. 또한 좌표는 정렬되어 있지 않습니다. 직선상의 위치와 그 도시에 사는 사람들의 수가 주어질 때, 공항을 지을 도시의 위치를 반환해주는 함수 chooseCity 함수를 완성하세요. 거리가 같은 도시가 2개 이상일 경우 위치가 더 작은 쪽의 도시를 선택하면 됩니다. 예를 들어 다음과 같은 정보의 도시가 있다고 가정해 봅시다.위치123인구수523이 살 경우, 각각의 도시에 공항을 지었을 때의 사람들의 이동 거리는 8, 8, 12 이므로 1번 또는 2번에 지을 수 있..
O와 X로 채워진 표가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 O로 이루어진 가장 큰 정사각형을 찾아 넓이를 반환하는 findLargestSquare 함수를 완성하세요. 예를 들어12345XOOOXXOOOOXXOOOXXOOOXXXXX가 있다면 정답은12345XOOOXXOOOOXXOOOXXOOOXXXXX가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다. 처음에는 "모든 칸에서 각 길이만큼 가능한 정사각형을 구해서 최대값을 저장한다."라는 생각으로 n중 for문을 사용했는데 보기좋게 타임아웃이 났다. 그래서 좀 더 생각해보니 d[n,m]이 (n,m)의 최대 정사각형 크기라면 d[i-1,j-1], d[i, j-1], d[i-1, j]의 최소값 + 1이 d[i,j]값이 된..