https://school.programmers.co.kr/learn/courses/30/lessons/42860
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
저는 구현을 통해 해당 문제를 해결하였습니다.
저는 위 아래 조작과 좌 우 조작을 나누어 구하였습니다.
위 아래 조작은 A로 부터 위로 올라가는 것이 빠른지, A에서 밑으로 (Z에서 밑으로) 가는게 더 빠른지를 판단하였습니다.
좌 우 조작은 min을 길이로 초기화하였습니다. 최소한 한 방향으로 한바퀴 돌면 모두 변경할 수 있기 때문입니다.
그리고 각각의 문자를 돌면서 해당 문자에서 다음으로 A가 아닌 문자를 찾습니다. 그리고 min과 (2*i) + size - nextIndex과 비교합니다.
이는 i까지 갔다가 다시 반대로 가서 해당 A가 아닌 문자까지 가는 경로입니다.
또한 반대로도 고려해야합니다. (size - nextIndex)*2 + i
반대로 A가 아닌 문자까지 갔다가 현재 i번째까지 오는 경로입니다.
class Solution {
public int solution(String name) {
int answer = 0;
int size = name.length();
int min = size -1;
for(int i = 0 ; i < name.length() ; i++){
answer += cal(name.charAt(i));
int nextIndex = i + 1;
while(nextIndex < size && name.charAt(nextIndex) == 'A'){
nextIndex++;
}
min = Math.min(min, (i*2) + size - nextIndex);
min = Math.min(min,(size - nextIndex)*2 + i);
}
answer += min;
return answer;
}
private int cal(char nameCh){
return Math.min(Math.abs(nameCh - 'A'), Math.abs(nameCh - 'Z') + 1);
}
}
참조
'알고리즘' 카테고리의 다른 글
프로그래머스 문자열 내 P와Y의 개수 (0) | 2022.07.12 |
---|---|
백준 1726번 로봇 (JAVA) (0) | 2022.07.11 |
프로그래머스 시저 암호 (JAVA) (0) | 2022.07.09 |
백준 1388번 바닥 장식 (JAVA) (0) | 2022.07.08 |
백준 2151번 거울 설치 (JAVA) (0) | 2022.07.07 |