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 |
Tags
- 2206번
- BOJ
- Adapater Pattern
- 냄새와 휴리스틱
- 코딩테스트
- 9장
- programmers
- 가장 긴 증가하는 부분 수열2
- 프로그래머스
- 자바의 정석
- Spring
- 클린코드
- 백준
- springboot
- 10830번
- 2166번
- 1300번
- 17장
- Design Patterns
- Dxerr.h
- 2156번
- 11286번
- SerialDate 리펙터링
- 1043번
- java
- Design Pattern
- 코딩 테스트
- DxTrace
- java의 정석
- 11758번
Archives
- Today
- Total
Don't give up!
[프로그래머스] 조이스틱 (java) 본문
코딩테스트 연습 - 조이스틱 | 프로그래머스 (programmers.co.kr)
코딩테스트 연습 - 조이스틱
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다
programmers.co.kr
어떻게 생각하고 문제를 풀었는가?
좌/우 방향을 결정하는 요소는 '어디서 다음 상/하 버튼을 눌러야하는가?'입니다.
만약 다음 위치까지 좌측버튼을 누르는 횟수가 우측 버튼을 눌러야 하는 횟수보다 작다면 좌측버튼을 눌러 이동하여야 합니다.
이동한 후에도 탐색방향을 결정해야 하는데, 이는 탐색해야할 문자의 수를 통해 결정할 수 있습니다.
전체적으로 누르게 될 상/하 버튼은 입력 받은 문자열에 의해서만 결정됩니다.
따라서 상/하 버튼과 좌/우 버튼을 별개의 반복문으로 작성할 수 있습니다.
코드
class Solution {
public int solution(String name) {
int upDown=0, len=name.length();
for(int charAt : name.toCharArray()){ //상-하 이동은 좌-우 이동에 상관없이 저장된다.
upDown += (charAt> 78)? 91-charAt: charAt-65;
}
int leftRight = len-1;
for(int i=0;i<len;i++){
int next=i+1;
while(next<len && name.charAt(next)=='A') next++;
//i+len-next : 좌측으로 갔을때 상-하 버튼을 눌러야하는 위치까지 이동하는 거리
//min(i,len-next) : 다음 상-하 버튼위치에서 좌측버튼을 눌러 위치i까지 탐색하는 횟수와 우측버튼을 눌러 탐색하는 횟수를 비교
leftRight = Math.min(leftRight,i+len-next +Math.min(i,len-next));
}
return upDown+leftRight;
}
}
생각한 내용을 바탕으로 코드를 작성하였습니다.
우측 버튼만 누르는 것을 디폴트 값으로 설정한 후 현재 위치에서 좌측으로 이동한 경우 눌러야 하는 좌/우 버튼의 수와 비교하여 최소값을 좌/우 버튼의 최소값을 계산합니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 행렬 테두리 회전 (java) (0) | 2021.05.12 |
---|---|
[프로그래머스] 멀쩡한 사각형 (java) (0) | 2021.05.09 |
[프로그래머스] 게임 맵 최단거리 (java) (0) | 2021.05.08 |