Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- docker
- 스프링 부트
- spring
- 구현
- 해결
- 배열
- 인텔리제이
- dfs
- 구름LEVEL
- 프로그래머스
- 스프링부트
- 해시맵
- IntelliJ
- 스프링
- 명령어
- 문자열
- spring boot
- 백엔드
- 코딩테스트
- Linux
- bfs
- Java
- 이직
- 자료구조
- 주니어
- 개발자
- 도커
- HTTP
- 스타트업
- HashMap
Archives
- Today
- Total
마이의 개발 블로그
[프로그래머스] 피로도 (Java) 본문
반응형
접근 방식
모든 던전을 탐색하면서 던전 진입이 가능한지 여부(최소 피로도를 충족하는가)를 체크하고, 그에 따라 발생하는 두 가지 선택지를 고려해야하는 문제이다. 두 가지 선택지는 다음과 같다:
1) 최소 피로도 충족: 던전에 진입해 던전을 탐험 후 소모피로도를 감소시킨 후에 다음 던전을 탐험
2) 최소 피로도 미충족: 현재까지의 탐험 횟수와 최대 탐험 횟수(max)를 비교하여 큰 쪽을 최대 탐험횟수로 변경
이러한 접근 방식을 고려하면 모든 경우의 수를 탐색해야하는데, 던전의 개수가 8개 이하이기 때문에 DFS로 접근하여 문제를 해결했다. 또한 한 번 방문한 던전을 재방문하지 않도록 visited[] 배열을 선언하여 방문여부를 체크했다.
로직 설명
- 방문여부를 체크할 배열 int[] visited 선언
- explore 메서드 내부:
1) 모든 던전에 대해 반복문 실행 (이번 던전을 방문한 적이 없고 던전의 최소 피로도가 k를 넘지 않을때만 실행)
2) 던전의 방문여부 1로 변경, 소모피로도를 k에서 뺀 후 explore() 메서드 다시 실행, 방문여부 0으로 변경
-> 방문여부를 다시 0으로 만드는 이유는 이전 회차의 방문여부가 다음 회차에 영향을 주게 하지 않기 위함
3) 모든 탐험을 마치고 나서 count를 max와 비교하여 더 큰 쪽을 max로 변경
4) max값 반환
class Solution {
public int solution(int k, int[][] dungeons) {
int[] visited = new int[dungeons.length];
explore(dungeons, visited, k, 0);
return max;
}
private int max = 0;
private void explore(int[][] dungeons, int[] visited, int k, int count){
for(int i = 0; i < dungeons.length; i++){
if(visited[i] == 0 && k >= dungeons[i][0]){
visited[i] = 1;
explore(dungeons, visited, k - dungeons[i][1], count + 1);
visited[i] = 0;
}
}
if(max < count){
max = count;
}
}
}
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 달리기 경주 (Java) (0) | 2023.04.11 |
---|---|
[프로그래머스] 게임 맵 최단거리 (Java) (2) | 2023.04.04 |
[프로그래머스] 두 큐 합 같게 만들기 (Java) (0) | 2023.03.20 |
[프로그래머스] 주식가격 (Java) (2) | 2023.03.15 |
[프로그래머스] 뒤에 있는 큰 수 찾기 (Java) (0) | 2023.03.15 |
Comments