반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42860
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 분석
[제한 사항]
- name은 알파벳 대문자로만 이루어져 있습니다.
- name의 길이는 1 이상 20 이하입니다.
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동 (마지막 위치에서 오른쪽으로 이동하면 첫 번째 문자에 커서)
위와 같이 조이스틱을 조작하며 주어진 name을 만들기 위해 최소한의 조작 횟수를 구하는 문제이다.
초기 문자 상태는 모두 A 이다.
문제 접근
우선 해당 문자를 만들기 위한 조작 횟수를 계산하여 해당 문자에 도달하기 위해 필요한 조작 횟수를 담은 배열을 만들어 주었다.
JAZ -> [9, 0, 1]
이것 저것 시도해 보면서 name 의 길이가 충분이 작기 때문에 완전탐색을 시도하였다.
dfs 를 이용한 완전탐색을 이용해 문제를 해결하였다.
코드
import java.util.*;
class Solution {
static int answer = Integer.MAX_VALUE;
public int solution(String name) {
char[] nameArr = name.toCharArray();
int[] distanceArr = new int[nameArr.length];
for(int i=0; i<distanceArr.length; i++){
distanceArr[i] = nameArr[i] - 'A' < 26 - (nameArr[i] - 'A') ? nameArr[i] - 'A' : 26 - (nameArr[i] - 'A');
}
dfs(Arrays.stream(distanceArr).sum(), 0, 0, distanceArr, 0);
System.out.println(Arrays.toString(distanceArr));
return answer;
}
public static void dfs(int sum, int cost, int cur, int[] distanceArr, int depth){
if(sum == 0){
answer = Math.min(answer, cost);
return;
}
if (depth == distanceArr.length) {
return;
}
if (depth == 0) {
cost += distanceArr[cur];
sum -= distanceArr[cur];
distanceArr[cur] = 0;
}
int front = cur + 1 < distanceArr.length ? cur +1 : 0;
int back = cur - 1 >= 0 ? cur - 1 : distanceArr.length - 1;
// 앞으로 이동
int frontCost = distanceArr[front];
distanceArr[front] = 0;
dfs(sum - frontCost, cost + 1 + frontCost, front, distanceArr, depth+1);
distanceArr[front] = frontCost;
// 뒤로 이동
int backCost = distanceArr[back];
distanceArr[back] = 0;
dfs(sum - backCost, cost + 1 + backCost, back, distanceArr, depth+1);
distanceArr[back] = backCost;
}
}반응형
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 산 모양 타일링 (실패) (0) | 2024.03.22 |
|---|---|
| [프로그래머스] 숫자 블록 (0) | 2024.03.22 |
| [프로그래머스] 시소 짝궁 (0) | 2024.03.21 |
| [프로그래머스] 양과 늑대 (0) | 2024.03.15 |
| [프로그래머스] 거리두기 확인하기 (3) | 2024.03.14 |