일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 반효경교수님
- 재귀
- 정렬
- 프로그래머스
- microflow
- 알고리즘
- 트리
- SQL
- git
- Recursion
- Mendix
- Sort
- MySQL
- 가중치없는그래프
- 스택
- 매개변수 탐색
- 백트래킹
- lcap
- domain model
- Bruteforce
- 이분탐색
- algorithm
- 그래프
- 해시맵
- dfs
- 자바
- 자료구조
- 멘딕스
- 완전탐색
- 집합
- Today
- Total
목록자바 (7)
mondegreen
어떤 자료 구조를 써야할지 고민을 좀 했다. 최악의 경우 십만 개의 도시를 처리해야 하기 때문에 한 번의 반복문 순회로 끝내야 한다고 생각했다. 배열이나 리스트를 사용하기에는 recently used를 처리하기 위해 배열의 인덱스를 당겨줘야 하는 비효율이 있었다. 반대로 링크드리스트를 활용한다면 인덱슬 당기는 처리는 효율적이겠으나 해당 도시가 어느 인덱스에 있는지 처음부터 다 순회해봐야 하는 것이라 또 비효율이 발생했다. 해시맵과 큐를 사용하고자 했으나 큐도 마찬가지로 순서를 당기기 어려웠다. 이를 해결하기 위한 자료구조는 트리맵이라고 생각했고 키에 순서(인덱스)를 넣고 값에 도시이름을 넣어서 존재하는 경우 해당 키를 삭제하고 다시 인덱스와 도시를 map에 넣어줬다. 이를 활용해서 캐시가 다 찼을 경우 ..
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..
스택을 deque로 활용함으로써 자료구조를 양껏 활용한 풀이이다. 다만 값을 빼고 넣는 순서를 헷갈리기 쉽다. import java.util.*; class Solution { public int solution(String s) { char[] target = s.toCharArray(); // 기본 문자열 스택에 담아 놓기 Deque base = new ArrayDeque(); for(int i = 0; i
Vector를 상속받아 구현되어 있는 Stack 대신 Deque로 stack을 구현해서 문제를 풀었다. import java.util.*; class Solution { boolean solution(String s) { char [] str = s.toCharArray(); Deque stk = new ArrayDeque(); for(char i : str){ if(i == '(') stk.push(i); else{ if(!stk.isEmpty() && stk.peek()=='(') stk.pop(); else return false; } } return stk.isEmpty(); } }
문제 분석을 진행하면서 배열을 만들까 고민했었다. 논리값 배열을 만들고 지나간 여부를 true / false로 처리하려고 했는데 생각해보니 이 문제는 좌표가 아니라 선분(길, 양 끝의 좌표 세트)을 확인해야 하는 문제였다. 따라서 배열을 사용하지 않고 두 개의 좌표를 필드로 가지고 있는 클래스를 생성해서 그 클래스를 타입으로 하는 해시 셋으로 처리하고자 했다. 하지만 여기서 간과한 것은 내가 클래스의 필드와 생성자만 만들고 set에서 contains로 같다고 확인할 수 있도록 equals 매서드를 만들지 않았기 때문에 각각의 클래스가 new 생성자로 생성된다면 각기 다른 주소값을 가지게 되어 equals로 판별할 수가 없게된다. 그래서 생각한 것은 Set의 타입을 String으로 설정하는 것이다 Stri..