programmers. 조이스틱 이번 문제를 풀면서 고민되었던 부분은 앞으로 진행하다가 다시 돌아서 뒤로 가는 경우였습니다. 예를들어 "JIAAAZ"의 경우 "JI"를 지나고 나서 그 사이 "AAA"을 지나가는 것보다 지났던 길을 다시 지나가더라도 되돌아가는게 더 효율적이기 때문입니다. 그래서 처음엔 이러한 경우를 위해서 dfs를 고려했습니다. 하지만 재귀로 호출되는 부분에서 어디서 어떻게 재귀적으로 호출하는지 저 스스로도 잘 몰라 에러가 발생하였고 더 문제인 것은 어디에서 에러가 발생했는지 모른다는 것이었습니다. 그 주된 이유가 dfs에서는 재귀적 호출을 계속 새로 만들고 또 새로 만들어진 것이 끝날 때까지 진행되는데 그 과정을 못 쫒았습니다. 그래서 뒤로 갈 수 있을 때 지금까지의 정보를 Job 이라..
programmers. 조이스틱 힘겹게 풀었네요. 오늘은 너무 늦어서 내일 리팩토링도 하고 좀더 상세하게 정리해볼게요. 간략하게 어려웠던 점은 '여러방면으로 흩어지는 경우의 수를 어떻게 관리할 것인가?' 였구요. 각각의 경우에 Queue를 통해 관리했습니다. StringBuilder가 reference참조였다는 점!! 이 때문에 많은 실수가 있었네요.. 아 그리고 문제를 다 풀든 말든 알고리즘 블로그 글을 남겨 계속 그 끈을 잡아보려합니다. 알찬 내용은 아니겠지만 지속적인 관심가질 수 있도록 하려고합니다.
programmers. 디스크 컨트롤러 자료구조를 만들고 그것을 이용하여 제가 원하는 데이터를 찾는 과정이 쉽지 않았습니다. 왜냐하면 첫째로 제가 만든 자료구조가 복잡했고, 그 사이에서 또 정렬이 필요하였기 때문입니다. 우선 제가 만든 자료구조는 2개였습니다. Map : 각 시간에 해당하는 작업들을 모아두었습니다. Queue : 현재 대기중인 작업들을 모아두었습니다. 그럼 이러한 자료구조를 기반으로 풀이과정을 설명해볼게요. 먼저 jobs 가 주어지면 init() 메서드에서 위의 map 자료구조를 만듭니다. 경과 시간을 재는 elapsedTime 과 각 작업의 남은 시간을 재는 remainingTime 라는 변수를 만들고 반복문을 돌립니다. 반복문은 map과 queue가 모두 비워질 때 그만두고 그 외엔 ..
programmers. 이중우선순위큐 이 문제는 PriorityQueue 를 두 개를 쓰면서 삽입할 때는 동시에 넣고, 최대값 삭제할때는 maxheap을 삭제하고, 최소값을 삭제할 때는 minHeap을 삭제하면 쉽게 해결할 수 있는 문제였습니다. 하지만 PriorityQueue 를 두 개를 사용함에 따라 두 개의 큐 안에 있는 값을 잘 파악해야 하는데요. 그 이유는 다음과 같은 상황들 때문입니다. maxHeap, minHeap 두 개의 큐 중 하나가 비워질 경우 → 모두가 꺼내어졌을 때입니다. 다 꺼내고 나서 의미없는 꺼내는 행위가 행해졌을 때 → 이 행위는 전혀 의미없는 것으로 데이터에 영향을 미쳐서는 안됩니다. 실제 위 두 개의 상황은 코드를 최초 구현하고 나서 제가 미비했던 부분이었습니다. 그럼 이..
programmers. 라면공장 다음 공급날까진 충분히 양이 남았지만 그 다음 공급날, 그 다다음 공급날까지 버텨내지 못하는 경우는 어떻게 처리해야할까요? 그래서 dfs로 현재 상황에서 공급량이 충분히 되더라도 공급을 받는 경우, 그리고 공급을 받지 못하는 경우를 모두 실행하도록 구성하였습니다. class Solution { int answer; int k; public int solution(int stock, int[] dates, int[] supplies, int k) { this.k = k; this.answer = supplies.length; dfs(stock, dates, supplies, 0, 0, 0); return answer; } public void dfs(int stock, in..
'자료구조' 수업을 최근 계속 들어왔는데 오늘 처음으로 정리해보네요! 오늘은 수업시간에 정렬을 구현해보는 실습을 했는데요. 생각보다 쉽지 않더라구요. 주어진 미션은 다음과 같습니다. 배열 생성하기 그 배열 무작위로 섞기 본인이 구현하고 싶은 정렬방법으로 정렬하기 배열 생성하기 배열을 생성하는 방법은 어렵지 않죠. 보통은 for문의 인덱스를 이용하여 만드는데요. 이번엔 IntStream 을 이용하여 만들어보았습니다. public int[] genArray(int size) { return IntStream.range(0, size).toArray(); } 배열 무작위로 섞기 Collections.shuffle() 를 사용하지 않고 배열을 무작위로 섞는 방법을 생각해봤는데요. 생각보다 쉽지 않..