전체 글

코딩 테스트

(Java) 프로그래머스 - 리코쳇 로봇

BFS + 조건이 붙은 문제였다. 문제를 읽고 예전에 했던 게임이 생각나서 재미있게 풀었다. 로직 먼저 board를 순회하며 아직 계산되지 않은 노드를 INF로 초기화 하고, 시작 지점과 도착 지점의 좌표를 저장한다. 시작지점에서 BFS 탐색을 시작하는데, 다른 점은 우선순위 큐를 사용한다는 것이다. 우선순위 큐를 이용하면 상하좌우 중 지금까지 가장 적은 방문 횟수를 가진 노드를 먼저 방문하게 되기 때문이다. 상하좌우를 선택하였다면, D를 만나거나 배열에 끝에 다다를때까지 계속 같은 방향으로 진행한다. 그리고 도착한 노드에 횟수를 더해주고 계속 탐색하면 된다. 최종 코드 import java.util.*; class Solution { static int[] dRow = {1, -1, 0, 0}; sta..

코딩 테스트

(Java) 프로그래머스 - 디펜스 게임

입력값이 매우 큰 편이었기 때문에 O(n) 이내에 끝내야겠다는 생각을 했다. 처음에는 내림차순으로 정렬을 하고 k를 우선적으로 사용하고, 나머지는 n을 사용하는 로직을 생각했다가 잘못된 로직이라는 것을 깨닫고 우선순위 큐를 이용하여 풀었다. 어떻게 생각하냐에 따라 엄청 간단한 문제일 수도 있지만, 내가 배배 꼬아서 생각했던지 풀이에 오랜 시간이 걸렸다. 로직 먼저 enemy 배열을 순회하며 n을 빼주고 우선순위 큐에 삽입한다. 만약 n이 음수로 내려간다면, 지금까지 지나왔던 라운드에 가장 큰 값이 우선순위 큐에 첫 번째 값으로 들어 있으니 그 값을 빼서 다시 n에 더해준다. 이렇게 하면 지나온 라운드 중 가장 큰 값에만 무적권을 쓰게 된 것과 같다. 더 이상 쓸 수 있는 무적권이 없다면 순회를 종료하면 ..

코딩 테스트

(Java) 프로그래머스 - 광물 캐기

문제를 읽고 입력값이 크지 않아 완전탐색을 생각했었다. 백트래킹을 이용하면 어찌어찌 구현할 수 있겠다고 생각했지만, 그리 끌리지는 않았다. 주어진 순서대로 탐색을 해야 하고 가중치가 있기 때문에 그리디로 해결할 수 있다고 생각하여 도전한 결과 풀이에 성공했다. 로직 곡괭이가 없거나, 더 캘 광물이 없다면 종료해야 하므로 매 순회마다 종료 조건을 설정했다. 하나의 곡괭이는 5번을 사용할 수 있으므로 미네랄 배열을 5개씩 그룹을 만들어 탐색한다. 하나의 그룹을 각각 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이로 채굴했을 때의 피로도를 객체로 만들어 list에 넣는다. list안의 객체를 돌 곡괭이를 사용했을 때의 피로도를 기준으로 내림차순 정렬하고 가장먼저 다이아몬드 곡괭이부터 사용하고, 철 곡괭이를, 돌 곡..

코딩 테스트

(Java) 프로그래머스 - 미로 탈출

오랜만에 푸는 BFS 문제였다. 기본적인 BFS 문제에서 약간 더 생각을 해야했는데, 로직을 생각하는데 그리 오래 걸리지는 않았다. 로직 먼저, 탈출을 하기 위해서는 레버까지 가야한다. 그렇기 때문에 레버까지 BFS를 통해 최단거리 탐색을 진행한다. 레버에 도착하고 다시 한번 탈출지점까지 BFS 탐색을 하는데, 여기서 중요한것은 왔던길을 다시 갈 수도 있다는 것이다. 따라서 방문 배열을 초기화 하고 BFS 탐색을 진행해야 한다. 탈출 조건이 (시작지점에서 레버에 도달 && 레버에서 탈출지점까지 도달) 이므로 둘중 하나라도 만족하지 못하면 -1을 리턴해야 한다. 최종 코드 import java.util.*; class Solution { static int[] dRow = {-1, 1, 0, 0}; sta..

로승리
로이의 개발노트