일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Brute-force
- 운영체제
- lambda
- 모던자바
- backtracking
- baekjoon
- DFS
- algorithm
- 네트워크
- BFS
- 프로그래머스
- 자료구조
- java
- TDD
- 스프링
- LEVEL2
- Java8
- kotlin
- 그래프
- back-end
- 프로젝트
- DP
- 코틀린
- Spring
- 알고리즘
- 백준
- programmers
- 자바
- 백트래킹
- OS
- Today
- Total
목록알고리즘 (63)
요깨비's LAB
방향그래프인 것을 생각하고, DFS를 이용하여 해결하였습니다. 로직은 아래와 같이 생각했습니다. 행렬에 값을 넣을때 1일 경우 해당 위치 값 x,y를 이용하여 Element객체를 만들어 Queue에 넣는다. Queue에서 Element를 하나 꺼낸다. 해당 위치를 Root로 두고 y는 현재 위치 x는 다음 위치로 DFS 연산을 진행한다. -> DFS 연산은 가리키는 곳이 값이 1이면서 방문하지 않은 곳이면 Root의 next 위치에서 다음 next 값들을 1로 바꿔준다.(이동 가능함을 체크한다는 의미) 그렇지 않으면 종료 -> 만약 Root값과 가리키는 값이 같으면 종료. 그려진 맵을 출력 아래에는 코드입니다. import java.util.LinkedList; import java.util.Queue;..
예... 이번 문제도 나름의 아이디어를 써봤으나 메모리 초과로 다른 아이디어로 접근해서 해결했습니다.. 우선 문제 접근 자체는 크게 어렵지 않았습니다. 일단 이전에 제가 실패 했던 아이디어입니다. 첫 번째 문자는 일단 아무거나 다 선택한다. 현재 문자열의 길이가 초기값과 같은지?(완성 여부) 같으면 해당 값이 이미 있는지? 두번째부터 문자를 선택한다 2번째 문자부터 분기 조건을 부여하는데 (1) 바로 직전 문자와 선택한 문자가 같으면 안됨 (2) 이미 방문한 문자 위치면 안됨 2번으로 다시 재귀 실행... 여기에서 2번을 제외하면 그냥 재귀함수랑 기본적인 분기처리를 그대로 따라가면서 짜면 됩니다. 하지만 2번을 구현하기 위해서는 이전에 완성된 문자열을 저장해주는 공간이 필요한데 저는 자료구조의 Set을 ..
저의 DFS로 풀려는 아이디어로는 시간 초과와 1000 이상의 값에서는 절대 돌아가지 않을 것 같다는 판단에 다른 분들의 아이디어를 보고 이해한 후에 배껴서 풀었습니다. 아이디어 잘 생각 하시는 분들 보면 정말 부럽... 하지만 재능이 나무에서 뚝 떨어지신 분들도 많겠지만 저에게는 그러한 재능이 없기에.. 꾸준히 높이 뛰기해서 쟁취해야겠죠 잡설이 길었습니다. 조건 두 개를 주었습니다. 표의 가로나 세로 크기가 1일 경우 => 이 경우, 정사각형의 원리에 의해 1인 값이 하나라도 있으면 넓이는 1일 수 밖에 없습니다. 모두 0 이면 당연히 0을 출력하겠죠 가로 세로 모두 2 이상일 경우, 1,1에서 부터 시작한다. => 정사각형의 한변의 크기를 구하는 원리에 의해 출처: https://blog.sonim1..
위 문제는 자바 컬렉션인 Map을 활용하여 해결하였습니다. 옷의 종류를 Key값으로, 각 옷들을 Key값의 List배열에 담아주었습니다. 아래는 코드입니다. import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; class Solution { HashMap clothMap; int result = 1; public int solution(String[][] clothes) { clothMap = new HashMap(); ArrayList clothList; for (int i = 0; i < clothes.length; i++) { // clothMap.putIfAbsent(clothes[i][0], new Arr..
이번에도.. 오지게 오래 걸렸습니다... 순수 완벽하게 푼것이 아닌.. 백준 질문하기에서 반례들을 이용하면서 풀었구요.. 아직도 분기 처리 조건 생각하는거랑 로직을 제대로 생각 않하고 무작정 문제에 돌입하는 것... 참 안고쳐집니다. 좀만 풀이가 생각날 것 같으면 무조건 키보드에 손이 올라가는 이 흑우.. 처음 아이디어는 자료구조 Set 2개를 이용해서 DFS를 돌면서 각 방문 노드들을 Set에 넣어주면서 indexSet(첫째 줄 배열)이랑 valueSet(두번째 줄 배열)에 값들을 비교하면서 하려고 했는데 빛 좋은 개살구 마냥 아이디어만 좋았지 실제적으로 제 머리가 그걸 구현할 정도로 호환이 안되더군요.. 다음번에 다시 도전해서 올리겠습니다. 그냥 함수 재귀를 이용해서 풀었습니다. 여기에서 통과 조건은..
어후;; 20번 틀리고 21번째에 드디어 해결했네요... 알고보니 로직은 그럭저럭 맞는것 같았으나 BFS에 대한 공부 부족과 객체 지향 활용을 못한 원인이 가장 컸던 것 같습니다.. 차근차근 어떤 문제 상황에 부딪혔고 해결했는지 끄적여 보겠습니다. 저는 고수분들이랑 다르게 간단하고 명료하게 추상화해서 몇줄 안되는 코드로는 못짜서 코드가 길고 좀 보기 싫습니다.. 그냥 저만의 회고시간입니다.. 클래스 정의 우선 Vertax 클래스를 설계했습니다. class Vertax { private int index; private int color; // -1 색없음, 0 빨 1 파 private HashSet connectedEdges; // 해당 정점과 연결된 정점들을 저장 하기 위한 자료구조 public Ver..
1. 개념 "하나의 문제는 한번만 풀도록 하는 알고리즘" - 핵심 다이나믹 프로그래밍은 문제의 답이 이용되는 구조를 이용한 알고리즘이다. 큰 문제를 작은 문제로 나눈다는 측면에서 분할정복(divide and conquer)알고리즘과 비슷하지만 다음과 같은 차이점이 존재한다. DAC DP 문제가 절반으로 줄어듬 문자게 -1로 줄어듬 Function problem 최적화 문제 결과가 한번 사용 결과가 여러번 사용됨 분할이 성능 향상 결과 재사용이 성능 향상 다이나믹 프로그래밍 알고리즘을 적용하기 위해서는 두가지 조건을 만족해야 한다.- 큰 문제를 작은 문제로 쪼갤 수 있으며, 작은 문제도 큰 문제와 같은 방법으로 풀 수 있고, 작은 문제들이 겹치는지? (Overlapping SubProblem) 문제를 작은..