반응형
문제 정보는 아래 링크를 확인해주세요!
[조이스틱]
문제 접근 방법
- name의 길이만큼 'A'로 구성된 문자열을 만듭니다.
- name의 문자열의 요소가 'A'가 아닌 곳을 찾고
- 해당 요소를 위,아래로 움직인 횟수중 더 작은 값을 결과값에 추가해줍니다.
- 해당 요소에서 왼쪽과 오른쪽을 탐색해주면서 더 적은 이동으로 'A'가 아닌 곳을 찾는 방향을 선택합니다.
- 이 때, 유의해야할 점은 왼쪽과 오른쪽 검사에서 오른쪽 검사를 먼저해줍니다.
- 그 이유는 왼쪽을 먼저 검사할 때, 테스트 11번에서 뭔지모를 오류가 났습니다.
- (테스트 11번의 오류는 추후 알게 되면 수정하겠습니다.)
[소스 코드]
package algorithm.programmersLevel2;
import java.util.*;
/*
* 프로그래머스
* 조이스틱
* */
public class Pro42860 {
public static int solution(String name) {
int answer = 0;
StringBuilder nameBuilder = new StringBuilder(name);//name
StringBuilder aBuilder = new StringBuilder("");//A문자열
//A문자열 생성
for (int i = 0, loop = name.length(); i < loop; i++) aBuilder.append('A');
int start = 0;//문자열의 A를 탐색하기 위한 인덱스
while(true) {
int left = start;
int right = start;
//A가 아닌 문자일 때,
if (nameBuilder.charAt(start) != 'A') {
answer += getMin(nameBuilder.charAt(start));//위,아래중 더 적은 이동을 찾는다.
nameBuilder.setCharAt(start,'A');//name의 문자를 A로 바꿔준다.
}
//name의 모든 문자가 A로 바꼈을 때 종료한다.
if (aBuilder.toString().equals(nameBuilder.toString())) break;
//이동 횟수
int move = 0;
while(true) {
left--;
right++;
move++;
//왼쪽이 구간을 넘어서면 오른쪽 끝으로 만들어줌
if (left < 0) left = nameBuilder.length()-1;
//오른쪽이 구간을 넘어서면 왼쪽 끝으로 만들어줌
if (right == nameBuilder.length()) right = 0;
//문자 요소가 A가 아니라면
if (nameBuilder.charAt(right) != 'A') {
answer += move;//결과 값에 이동 횟수 추가
start = right;//다음 탐색 인덱스를 결정
break;
}
//문자 요소가 A가 아니라면
if (nameBuilder.charAt(left) != 'A') {
answer += move;
start = left;
break;
}
}
}
return answer;
}
//위,아래 이동 최솟값
public static int getMin(char ch) {
return Math.abs(ch - 'A') < Math.abs('Z' - ch)+1 ? Math.abs(ch - 'A') : Math.abs('Z' - ch)+1;
}
}
[정확성 테스트]
반응형
LIST
'알고리즘 > 연습문제' 카테고리의 다른 글
백준 - 1202 보석 도둑 (0) | 2020.06.01 |
---|---|
백준 - 암호코드 (feat. Java) (0) | 2020.05.31 |
2017 카카오코드 예선 - 카카오프렌즈 컬러링북 (feat. Java) (0) | 2020.05.21 |
프로그래머스 - 다리를 지나는 트럭 (feat. Java) (0) | 2020.05.21 |
프로그래머스 - 주식가격 (feat. Java) (0) | 2020.05.21 |