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
- inner class
- Interface
- 자바 재귀 조합
- 자바 조합 재귀
- 후위표기
- jquery 속성선택자
- 순열코드
- 자바스크립트 이벤트처리
- jquery 이벤트 처리
- char to str
- 자바
- 자바스크립트 이벤트중지
- Java
- 상속
- 자바입출력
- jquery dom 계층 선택자
- 순열 재귀
- 자바 순열 코드
- 알고리즘
- 재귀함수
- parseInt()
- jquery 필터선택자
- 재귀
- java lambda
- 조합 재귀
- java Collections.sort()
- java 내부 클래스
- 서로소
- 알고리즘 그래프
- str to char array
Archives
- Today
- Total
유블로그
[프로그래머스] 조이스틱 본문
탐욕법 level2 조이스틱
처음에 그리디 접근을 이용해 while문만 사용했다.
왼쪽으로 갈 때와 오른쪽으로 갈 때 이동횟수가 똑같으면 오른쪽으로 가게 했는데 그렇게 하니 안되는 케이스가 있어서
재귀로 바꾸었다.
왼쪽으로 갈 때 이동횟수가 더 적으면 왼쪽으로 가고, 오른쪽으로 갈 때 이동횟수가 더 적으면 오른쪽으로 가고
같으면 왼쪽, 오른쪽 둘 다 가보고 총 이동횟수가 더 적은 방법을 출력하도록 했다.
public class Solution {
static int N;
static int[] word;
public static int solution(String name) {
N = name.length();
word = new int[N];
int[] me = new int[N];
for (int i = 0; i < N; i++) {
me[i] = 65;
}
for (int i = 0; i < N; i++) {
word[i] = name.charAt(i);
}
dfs(me, 0, 0);
return MIN;
}
static int MIN = Integer.MAX_VALUE;
static void dfs(int[] curWord, int cur, int cnt) {
if(90 - word[cur]+1 < word[cur]-65) {
cnt += 90 - word[cur]+1;
}
else cnt += word[cur]-65;
curWord[cur] = word[cur];
boolean isEnd = true;
for (int i = 0; i < N; i++) {
if(curWord[i] != word[i]) {
isEnd = false;
break;
}
}
if(isEnd) {
if(MIN > cnt) MIN = cnt;
return;
}
int rIdx = cur+1;
int rCnt = 1;
while(true) {
if(rIdx >= N) rIdx -= N;
if(word[rIdx] != curWord[rIdx]) break;
rIdx++;
rCnt++;
}
int lIdx = cur-1;
int lCnt = 1;
while(true) {
if(lIdx < 0) {
lIdx += N;
}
if(word[lIdx] != curWord[lIdx]) break;
lIdx--;
lCnt++;
}
if(rCnt < lCnt) {
int[] copy = new int[N];
for (int i = 0; i < N; i++) {
copy[i] = curWord[i];
}
dfs(copy, rIdx, cnt+rCnt);
}
else if(rCnt > lCnt) {
int[] copy = new int[N];
for (int i = 0; i < N; i++) {
copy[i] = curWord[i];
}
dfs(copy, lIdx, cnt+lCnt);
}
else {
int[] copy = new int[N];
for (int i = 0; i < N; i++) {
copy[i] = curWord[i];
}
dfs(copy, rIdx, cnt+rCnt);
int[] copy2 = new int[N];
for (int i = 0; i < N; i++) {
copy2[i] = curWord[i];
}
dfs(copy2, lIdx, cnt+lCnt);
}
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 구명보트 (0) | 2020.12.14 |
---|---|
[프로그래머스] 큰 수 만들기 (0) | 2020.12.14 |
[알고리즘] Next Permutation : 순열 시간 줄이기 (0) | 2020.10.04 |
[컴퓨팅사고력] 알고리즘에 필요하거나 도움될 수 있는 것들 (0) | 2020.10.04 |
[알고리즘] 동적계획법(Dynamic Programming) (0) | 2020.10.03 |