문제 상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에는 불이 붙지 않는다. 상근이는 동서남북 인접한 칸으로 이동할 수 있으며, 1초가 걸린다. 상근이는 벽을 통과할 수 없고, 불이 옮겨진 칸 또는 이제 불이 붙으려는 칸으로 이동할 수 없다. 상근이가 있는 칸에 불이 옮겨옴과 동시에 다른 칸으로 이동할 수 있다. 빌딩의 지도가 주어졌을 때, 얼마나 빨리 빌딩을 탈출할 수 있는지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다. 각 테스트 케이스의 첫째 줄에는 빌딩 지도의 너비와 높이 w와 h가 주어진다..
문제 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제일 친한 친구인 비버의 굴로 가능한 빨리 도망가 홍수를 피하려고 한다. 티떱숲의 지도는 R행 C열로 이루어져 있다. 비어있는 곳은 '.'로 표시되어 있고, 물이 차있는 지역은 '*', 돌은 'X'로 표시되어 있다. 비버의 굴은 'D'로, 고슴도치의 위치는 'S'로 나타내어져 있다. 매 분마다 고슴도치는 현재 있는 칸과 인접한 네 칸 중 하나로 이동할 수 있다. (위, 아래, 오른쪽, 왼쪽) 물도 매 분마다 비어있는 칸으로 확장한다. 물이 있는 칸과 인접해있는 비어있는 칸(적어도 한 변을 공유)은 물이 차게 된다. 물..
들어가기에 앞서 책 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'을 참고하여 작성하였다 기본적으로 인텔리제이 프레임워크를 이용했고 자바 8과 gradle 4.5를 기반으로 진행했다. 윈도우를 사용할 경우 문제 없겠지만 저와같이 m1또는 m2기반의 맥북을 사용하고 계시다면 아래 URL참고해주시면 됩니다! 중간에 .zshrc변경사항 적용에서 오타 존재(source ~./zshrc -> source~/.zshrc) 자바 버전별로 설치 및 관리 gradle 관련된 부분은 책에서는 4.1을 사용했지만 현재 스프링 프레임 워크가 진행될 수 있는 최소 gradle 버전 조건이 4.4이상이라 그 이상을 사용해주시면 됩니다. 추후에 더 높은 버전을 요구 할 수도 있는데 그에 맞춰 gradle 버전을 올려주면 됩니다..
문제 IPv6은 길이가 128비트인 차세대 인터넷 프로토콜이다. IPv6의 주소는 32자리의 16진수를 4자리씩 끊어 나타낸다. 이때, 각 그룹은 콜론 (:)으로 구분해서 나타낸다. 예를 들면, 다음과 같다. 2001:0db8:85a3:0000:0000:8a2e:0370:7334 32자리의 16진수는 사람이 읽고 쓰기에 불편하고, 대부분의 자리가 0이기 때문에 아래와 같이 축약할 수 있다. 각 그룹의 앞자리의 0의 전체 또는 일부를 생략 할 수 있다. 위의 IPv6을 축약하면, 다음과 같다 2001:db8:85a3:0:00:8a2e:370:7334 만약 0으로만 이루어져 있는 그룹이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)로 바꿀 수 있다. 2001:db8:85a3::8a..
문제 0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오. 덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다. 입력 첫째 줄에 두 정수 N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)가 주어진다. 출력 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다. 풀이 아래 그림을 참고하면 이해가 쉽다. 그림은 현재 0부터 6까지의 정수 4개르 더해서 그합이 6이 되어야한다. 그것을 표로 표현하면 아래처럼된다. 규칙을 보면 주황칸2개가 빨강칸의 값이 되는것을 알 수 있고 이를 통해서dp식을 짜게되면 map[i][j] = map[i-1][j]+map[i][j-1] 이런식이 ..
추상 팩토리 패턴 정의 객체들을 통째로 묶어서 팩토리 클래스로 만들고, 이들 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴이다. 이전에 팩토리 메서드 패턴을 좀 더 캡슐화한 방식이라고 보면 될 것 같다. 팩토리 메서드와 다른점 팩토리 메서드: 객체 생성을 위임한다 추상 팩토리: 서로 관련이 있는 객체들을 묶어서 새로운 팩토리 클래스를 만든다. 장점 구체적인 제품과 클라이언트 코드 간의 긴밀한 결합을 피한다. 단일 책임 원칙: 제품 생성 코드를 한 곳으로 추출하여 코드를 더 쉽게 지원할 수 있다. 기존 클라이언트 코드를 손상시키지 않고 제품의 새로운 변형을 도입 할 수 있다. 단점 새로운 인터페이스와 클래스가 패턴과 함께 도입되기 때문에 코드가 생각보다 복잡해질 수 있다. 패..
팩토리 메서드 패턴 정의 객체 생성과 관련된 디자인 패턴으로 객체 생성 역할을 담당하면서 각 클라이언트에서 구현 클래스에 직접 의존하지 않도록 분리하는 패턴이다. 물론 새로운 클래스가 추가 되었을때 Facotory클래스를 수정해야하긴 한다. 한마디로, 인스턴스를 생성을 서브 클래스로 책임을 넘겨준다. 장점 확장에 열려있고 변경에 닫혀있게 된다. 중복된 코드가 줄어들고 상속하는 모든 클래스가 동일한 공통 로직을 사용할 수 있다. 객체가 변화할 여지가 있을때 상속하는 클래스를 하나 더 만들어서 구현해주면 된다. 단점 많은 클래스 파일이 생긴다. 패턴 적용전 이미지 표현 코드 간략하게 PizzaStore코드만 보여주겠다 PizzaStore.java public class PizzaStore { Pizza or..
템플릿 메서드 패턴 정의 부모 클래스에서 알고리즘의 골격을 정의하지만, 해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의)할 수 있도록 하는 행동 디자인 패턴이다. 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화할때 유용하다. 또한 동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현할 수 있도록 한다. 예시로 커피와 홍차를 만들때 2개다 물을 끓여야한다고 하면 boiWater을 템플릿 메서드로 정의할 수 있다 장점 알고리즘 구조의 재사용성: 템플릿 메서드는 알고리즘의 일반적인 구조를 부모 클래스에 정의하므로, 여러 하위 클래스에서 이 구조를 재사용할 수 있습니다. 유연성과 확장성: 부..
데커레이터 패턴 정의 데커레이터는 어떤 기능에 추가적으로 기능을 덧붙이고 싶은 경우, 그 기능들을 Decorator로 만들어서 덧붙이는 방식입니다. 예시 토스트를 만들때 일반빵, 밀빵, 버터빵, 우유빵 선택사항이 존재하고 토핑으로 햄, 야채, 치즈, 달걀, 새우 그리고 마지막으로 소스로 마요네즈, 케찹, 칠리가 존재한다고 할때 토핑과 소스가 데커레이터가 됩니다. 왜냐면 보통 토스트는 빵(1개)+토핑(여러개)+소스(여러종류) 로 이루어지기 때문에 빵을 제외한 토핑과 소스를 더 추가 할 수 있는 데커레이터로 표현합니다. 장점 확장성(Extensibility): 데커레이터 패턴은 기존 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있다. 즉 코드의 확정성을 향상시켜 새로운 동작을 간단하게 추가한다. 유연성..
인텔리제이에서 실행(문제 없음) 스프링으로 프로젝트 생성 후에 인텔리제이에서 실행시킨모습이다. 정상적으로 잘 작동하였고 localhost도 잘 띄워진다 터미널에서 실행(문제 생김) 문제 발생 문제는 터미널에서 실행시켰을때 문제가 발생한다. 참고로 윈도우 기준이다 Spring프로젝트 폴더인 hello-spring디렉터리 안에서 gradlew.bat 파일을 명령어 ./gradlew.bat build 를 통해서 실행할려는 순간 오류가 발생한다(참고로 맥은 gradlew파일을 빌드하면 되는걸로 안다) 오류 내용 쉽게 얘기하면, 실행할려는 파일의 자바 버전은 17인데 컴퓨터가 빌드하는데 사용하는 자바 버전은 8이라는 내용이다. 문제는 여기부터다. 버전 관련 내용들 자바 버전이 알맞게 17로 설정되어있는것을 알 수..