일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 알고리즘
- 스택
- Sort
- 정렬
- 매개변수 탐색
- Bruteforce
- lcap
- Recursion
- Mendix
- MySQL
- algorithm
- 멘딕스
- 완전탐색
- 자바
- git
- 집합
- domain model
- 가중치없는그래프
- microflow
- 반효경교수님
- SQL
- 재귀
- dfs
- 이분탐색
- 프로그래머스
- 그래프
- 해시맵
- 백트래킹
- 자료구조
- 트리
- Today
- Total
목록전체 글 (144)
mondegreen
1부터 n까지의 수를 오름차순 및 내림차순으로 출력하도록 재귀를 구현하자. - 백준 2747 피보나치 수 위 문제는 중복 연산이 많기 때문에 메모이제이션을 활용해야만 시간 초과가 발생하지 않는다. package BaekJoon.recursion; import java.util.Scanner; public class BJ2747 { public static int[] arr; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); arr = new int[n + 2]; arr[0] = 0; arr[1] = 1; pibo(2, n); System.out.println(arr[n]); }..
앞쪽과 뒤쪽으로 방향으로 순회하면서 각 인덱스 별로 몇개의 종류를 가지는지 set에 담고 set의 크기를 새로운 배열에 각각 넣어줬다. 그리고 경계가 되는 연속되는 두 인덱스의 값이 같을 경우 answer에 더해주는 방식으로 구현했다. 처음에는 앞쪽으로만 토핑의 수를 세고 매번 남은 토핑 종류를 세려고 했지만 인덱스 옮길 때마다 반복문을 최악의 경우 백만번의 인덱스를 매번 돌아줘야 하기 때문에 시간 초과가 발생한다. 따라서 아래 코드 처럼 미리 양방향으로 토핑 수를 세어주자. import java.util.*; class Solution { public int solution(int[] topping) { int answer = 0; int len = topping.length; int [] order ..
연결되어 있는 좌표의 수를 모두 더하는 문제였고 BFS를 구현했으며 연결되어 있는 여부를 Queue를 활용해서 해결했다. 그 외에는 경계를 벗어나거나 char 를 int로 변환해서 더해주는 것 정도 고려하면 될 것 같다. import java.util.*; class Solution { public static char[][] map; public static boolean[][] visited; public int[] solution(String[] maps) { int rLen = maps.length; // 행 int cLen = maps[0].length(); // 열 map = new char[rLen][cLen]; for(int i = 0; i
지문에서 보조 컨테이너 벨트는 스택으로 구현해야 함을 파악할 수 있었다. 앞에 위치한 상자와 보조 컨테이너 벨트를 모두 체크해야 했고 두 곳에서 찾을 수 없는데 앞에 위치한 상자보다 실어야 할 상자 수가 더 작다면 더 실을 수 있는 가능성이 없기 때문에 바로 return 처리 했다. import java.util.*; class Solution { public int solution(int[] order) { int answer = 0; Deque stk = new ArrayDeque(); // index는 1부터 시작하는데 int index = 1; // order 반복문을 돌면서 for(int i = 0; i
기본적으로 재귀의 방식으로 구현하면 된다. 다섯가지의 문자로 길이 5의 문자열을 만드는 경우의 수가 5000가지 이하이므로 시간을 고려하지는 않았다. 그래도 글자에 + 하는 건 비효율이라고 생각해서 스트링빌더를 사용했다. 그리고 오래 가지 않도록 답을 찾으면 return 하도록 구현했다. import java.util.*; class Solution { public static char [] arr = {'A', 'E', 'I', 'O', 'U'}; public static String target; public static int tmp, answer; public int solution(String word) { tmp = 0; answer = -1; target = word; StringBuilde..
IoC(Inversion of Control) 프로그램의 제어의 흐름을 직접 하는 것이 아니라 외부에서 관리하는 경우 제어의 역전이라고 한다. 여기서 프레임워크와 라이브러리의 차이도 알 수 있는데 만약 내가 작성한 코드가 직접 제어를 담당한다면 라이브러리이고 그렇지 않다면 프레임워크라고 할 수 있다. DI(Dependency Injection) 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성한고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존 관계가 연결되는 것을 의존관계 주입이라고 한다. 객체 인스턴스를 생성하고 그 참조값을 전달해서 연결되는데 의존관계 주입을 사용함으로써 클라이언트 코드를 변경하지 않고 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다. "정적인 클래스 의존관계..
1. SRP 단일책임의 원칙 기능을 변경했을 때 연계되는 변경이 많다면 단일 책임 원칙을 지키지 못한 것 -> 하나의 클래스는 하나의 책임만 가져야 한다. 2. OCP 개방폐쇄의 원칙 소프트웨어 요소는 확장에는 열려있고 변경에는 닫혀 있어야 한다. 즉, 다형성 특징을 활용해서 확장은 가능한 반면 변경은 없는 것을 말한다. 단, 스프링의 DI(컨테이너)를 함께 활용해야 가능하다. 3. LSP 리스코프 치환의 원칙 자동차의 경우 엑셀을 밟으면 앞으로 가는 기능을 구현해야 한다. 하위 클래스도 엑셀이라는 인터페이스를 상속받았을 때 앞으로 가는 기능을 구현해야 한다. 뒤로 가게 구현한다면 LSP 위반 -> 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 4...
스프링이란, 객체 지향 언어인 자바의 강력한 특징을 살려냄으로써 좋은 객체 지향 애플리케이션을 개발할 수 있게 돕는 프레임워크 (EJB로 개발할 당시에는 EJB에 의존적이었기 때문에 자바의 객체 지향 특성을 다 잃어버리는 한계가 있었음) 따라서 인터페이스(역할)을 안정적으로 잘 설계해야 클라이언트에게 영향을 주지 않고 기능을 다양하게 변경할 수 있다(구현) => 즉, 확장 가능한 설계라고 말할 수 있다.
10진법의 수를 3진법으로 바꾸며 나머지는 진법의 수로 몫은 0이 될 때까지 다시 나누는 몫으로 처리하여 구한다. 기존 3진법의 0,1,2 대신 1,2,4를 쓰는 방식의 풀이이다. import java.util.*; class Solution { public String solution(int n) { StringBuilder sb = new StringBuilder(); while(n > 0){ int remainder = n % 3; if(remainder == 0) sb.insert(0, "4"); else if(remainder == 1) sb.insert(0, "1"); else if(remainder == 2) sb.insert(0, "2"); n = (n - 1) / 3; } return s..
[정답코드] 인접리스트에 매몰되었음... 해시 맵을 우선순위 큐와 조합해서 유사하게 구현 가능하며 정렬까지도 한 번에 해결해 줌. 재귀가 끝나는 순서대로 답에 담기기 때문에 역순처리 해주기 import java.util.*; class Solution { public static ArrayList answer; public static HashMap tks; public String[] solution(String[][] tickets) { answer = new ArrayList(); tks = new HashMap(); for(String[] ticket : tickets){ tks.putIfAbsent(ticket[0], new PriorityQueue()); tks.get(ticket[0]).ad..