반응형
1. 문제 정의
2. 문제 접근
탐욕법에 속해 있으니 greedy방식으로 풀면 될 것 같다.
3. 문제 풀이
- 처음 알파벳부터 시작하여 끝까지 위아래 몇번 움직이는지를 upDown에 더해준다.
- 순방향과 역방향 이동 중 적은 것을 구해서 갱신해준다.
- 마지막에 더해준다.
4. 코드
import java.util.*;
class Solution {
// int minLeft, minRight; // 역방향 최솟값, 순방향 최솟값
public int solution(String name) {
int l = name.length();
int idx = 0; // 다음 값 확인 사용
int upDown = 0; //위아래 움직임
int leftRight = name.length()-1; //초깃값을 최댓값으로 설정, 좌우 움직임
// 위아래 움직이는 횟수와 좌우 움직이는 횟수 별도로 두고 풀기!
for(int i = 0 ; i < l; i++){
upDown += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
idx = i + 1;
//연속되는 A 확인
while(idx < l && name.charAt(idx) == 'A'){
idx++;
}
//좌우 이동
leftRight = Math.min(leftRight, i+(l-idx)+Math.min(i,l-idx));
}
return upDown+leftRight;
// int idx = 0;
// // 순방향
// while(idx < name.length()){
// char ch = name.charAt(idx);
// int cnt = ch - 'A';
// if(cnt != 0 && cnt > 13) cnt = 26-cnt;
// minRight += cnt;
// // 마지막에 이동을 안하므로
// if(idx != name.length()-1) minRight++;
// // 마지막이 A일 경우 빼주기
// if(cnt == 0 && idx == name.length()-1) minRight--;
// idx++;
// }
// System.out.println(minRight);
// //역방향
// idx = name.length()-1;
// while(idx >= 0){
// char ch = name.charAt(idx);
// int cnt = ch - 'A';
// if(cnt != 0 && cnt > 13) cnt = 26-cnt;
// minLeft += cnt;
// // 마지막에 이동을 안하므로
// if(idx != 0) minLeft++;
// // 마지막이 A일 경우 빼주기
// if(cnt == 0 && idx == 1) minLeft--;
// idx--;
// }
// // minLeft--; // 처음 시작점이 마지막이니 -1 해주기
// System.out.println(minLeft);
// return Math.min(minLeft, minRight);
}
}
5. 회고
내가 제일 약한게 dp 와 greedy다. 그래서 다른 사람이 한걸 보고 따라했다.... 다시 이해될때까지 계속 반복해서 해봐야겠다.
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
99클럽 코테 스터디 23일차 TIL, 그래프(순위) (0) | 2024.06.13 |
---|---|
99클럽 코테 스터디 10일차 TIL, DFS,BFS(게임 맵 최단 거리) (0) | 2024.05.31 |
99클럽 코테 스터디 9일차 TIL, DFS,BFS(타겟 넘버) (0) | 2024.05.30 |
99클럽 코테 스터디 8일차 TIL, 완전탐색(소수 찾기) (0) | 2024.05.29 |
99클럽 코테 스터디 7일차 TIL, 완전탐색(카펫) (0) | 2024.05.28 |