목록프로그래머스 (8)
소소한 개발이야기
📄 더 맵게 🔗 문제 풀러가기 문제의 접근은 Min-Heap을 이용해 해결할 수 있습니다. 문제의 조건을 보면 주어진 원소들 중 가장 작은 값 과 두 번째로 작은 값 을 연산하여 새로운 값을 생성 합니다. 여기서 새로운 값이 항상 작다는 보장이 없습니다. 따라서 새로운 값을 생성한 뒤 다시 오름차순으로 정렬을 해야합니다. Min-Heap을 이용하면 가장 작은 작은 값이 항상 맨 앞에 있으므로 문제를 푸는데 쉽게 접근할 수 있습니다. 문제의 풀이 순서는 다음과 같습니다. Java에서 문제의 풀이는 PriorityQueue를 사용하였습니다. 주어진 모든 원소(scoville)를 우선선위 큐에 넣는다 첫 번째 원소의 값이 K값 이상인지 확인한다. K값 이하일 경우 첫 번째 원소와 두 번째 원소를 꺼내 새로운 ..
📄 쇠막대기 🔗 문제 풀러가기 스택을 이용해서 문제를 해결 할 수 있습니다. 처음 문제를 접했을 때 쇠막대기가 끝나는 시점에서 해당 쇠막대기가 포함하고 있는 레이저만큼 조각을 생성하는 방법을 생각하였습니다. 하지만 이렇게 접근하다 보니 겹쳐 있는 쇠막대기에 대해 처리해야 할게 너무나 많아져 간단하게 처리 할 방법을 생각하였습니다. 문제의 풀이 방식은 아래와 같습니다. 먼저 레이저가 나오면 무조건 지금까지 쌓인 쇠막대기 만큼의 조각이 생깁니다. 따라서 레이저가 나오면 스택에 있는 쇠막대기의 개수 만큼 조각을 추가 해줍니다. 문제의 예시에서 첫 번째 레이저를 만났을 때를 가정해본다면 다음과 같습니다. "(((()" 이렇게 첫 번째 레이저를 만나게 된다면 총 3개의 조각이 무조건 생기게 됩니다. 그 다음 레이..
📄 기능개발 🔗 문제 풀러가기 문제의 조건을 살펴보면 모든 작업은 동시에 개발 됩니다. 하지만 이전의 작업이 마무리 되지 않으면 현재 작업은 이전의 작업이 마칠때 까지 기다려야 합니다. 즉, 모든 작업은 순서대로 이루어 진다고 볼 수 있습니다. 따라서 모든 작업을 Queue에 넣고 Queue의 가장 첫 번째 작업이 끝났다면 Queue에서 제거 한 뒤 다음 작업들 중 동시에 끝낼 수 있는 작업도 같이 Queue에서 제거해주면 됩니다. 문제 풀이 접근 순서는 다음과 같습니다. 작업의 정보(현재 진행률, 진행속도)를 Queue에 넣는다. Queue가 비기 전까지(모든 작업이 끝날 때까지) 작업들을 진행 시킨다. 만약 Queue의 가장 첫 번째 작업(선행작업)이 종료 되었다면 Queue에서 제거한다. 선행작업 ..
📄 다리를 지나는 트럭 🔗 문제 풀러가기 Queue를 이용하여 문제를 해결하였습니다. 문제의 조건은 다음과 같습니다. 트럭은 일차선 다리를 정해진 순으로 건넌다. 트럭은 1초에 1만큼씩 이동한다. 다리가 견딜 수 있는 무게가 정해져 있다. 트럭이 다리에 완전히 오르지 않은 경우, 트럭의 무게는 고려하지 않는다. 먼저 정해진 순서대로 다리를 건너기 때문에 주어진 트럭들을 Queue에 넣습니다. 이때 각 트럭에 대한 상태(무게 및 이동 거리)를 관리하기 위하여 Truck이라는 클래스를 생성합니다. 그리고 현재 다리 위에 올라와 있는 트럭들을 관리하기 위하여 List을 생성합니다. 모든 트럭이 다리를 건너는 시간을 구하는 절차는 다음과 같습니다. 대기중인 트럭들과 다리 위에 올라와 있는 트럭이 비어 있다면 모..
📄 소수 찾기 🔗 문제 풀러가기 문제를 접근하는 방법은 2 가지가 존재 합니다. (더 많을 수도..) 첫 번째로, 숫자 조각으로 만들 수 있는 모든 숫자를 만들고 그 숫자들 중 소수의 개수를 세는 방법. 두 번째로, 숫자 조각으로 구할 수 있는 최대 수 까지 소수를 모두 구한 뒤 모든 소수를 검사하며 해당 소수가 숫자 조각들로 이루어 질 수 있는지 확인하는 방법 이 풀이에서는 두 번째 방법을 사용하여 문제를 해결하였습니다. 문제 풀이의 접근은 다음과 같습니다. 숫자 조각들로 구할 수 있는 가장 큰 값을 구한다. 가장 큰 값까지 소수를 구한다. (에라토스테네스의 체 이용) 구해진 소수들 중 숫자 조각들로 만들 수 있는지 확인한다. 여기서 소수를 구하는 방법은 크게 문제가 되지 않습니다. 하지만 구해진 소수..
📄 탑 🔗 문제 풀러가기 2중 for문으로 쉽게 문제를 해결할 수 있습니다. 모든 탑은 왼쪽으로 레이저 신호를 발사하기 때문에 가장 오른쪽 탑부터 검사를 시작합니다. 현재 탑의 위치에서 왼쪽으로 이동하며 자신보다 높은 탑의 index 번호를 answer배열에 저장하면 문제를 해결할 수 있습니다. 🌱 Solution 함수 public int[] solution(int[] heights) { int len = heights.length; int[] answer = new int[len]; for (int i = len - 1; i > 0; i--) { for (int j = i - 1; j >= 0; j--) { if (heights[j] > heights[i]) { answer[i] = j + 1; bre..
📄 주식가격 🔗 문제 풀러가기 이중 for문을 이용하면 쉽게 문제를 해결할 수 있습니다. i번째 값을 기준으로 이 후 값이 내려가기 전까지 카운트 해주면서 몇 일 동안 가격이 유지되는지 세어주기만 하면 됩니다. 🌱 Solution 함수 public int[] solution(int[] prices) { int len = prices.length; int[] answer = new int[len]; int cnt = 0; for (int i = 0; i prices[j]) { break; } } answer[i] = cnt; } return answer; }
📄 스킬트리 🔗 문제 풀러가기 문제에서 주어진 조건은 생각보다 단순합니다. 먼저 모든 문자열은 알파벳 대문자로만 이루어져 있습니다. 그리고 스킬의 총 길이는 최대 26이며 중복 또한 없습니다. 완전 탐색으로 진행해도 쉽게 문제를 해결할 수 있는 유형입니다. 문제 풀이 접근 방식은 다음과 같이 할 수 있습니다. 스킬트리 안에 스킬 순서에 포함되는 스킬이 있을 시 선행 스킬을 배웠는지 확인합니다. 여기서 문제를 조금 단순화 시킬 수 있는데 현재 스킬을 배우기 위해 이전의 모든 선행 스킬을 다 확인 할 필요가 없습니다. 바로 이전의 선행 스킬만 확인하면 됩니다. 만약 이전의 선행 스킬을 배우지 않았다면 이미 이루어 질 수 없는 조합이기 때문입니다. 여기서 주의해야 할 점은 스킬의 index가 0번째라면 out..