문제가 너무 길어서 그냥 링크로 문제를 넣겠다.
https://programmers.co.kr/learn/courses/30/lessons/67256
코딩테스트 연습 - 키패드 누르기
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"
programmers.co.kr
문제는 이것이고 내 풀이 코드는
public String solution(int[] numbers, String hand) { //키패드 누르기
String answer = "";
int left = 10; //*버튼을 10, #버튼을 12로 가정
int right = 12;
for(int x : numbers){
if(x == 1||x == 4||x == 7){ //1,4,7을 누를 경우 왼손으로 누르고 왼손위치를 그 키패드위치로 바꿔준다.
answer += "L";
left = x;
}else if(x == 3||x == 6||x == 9){//3,6,9를 누를 경우 오른손으로 누르고 오른손위치를 그 키패드위치로 바꿔준다.
answer += "R";
right = x;
}else{ //2,5,8,0을 누를 경우
int ld = length(x,left); //왼손과 누를 키패드까지의 거리
int rd = length(x,right); //오른손과 누를 키패드까지의 거리
if(ld>rd){ //왼손이 더 거리가 멀 경우
answer += "R"; //오른손으로 키패드를 누른다.
right = x;
}else if(ld < rd){ //오른손이 더 거리가 멀 경우
answer += "L"; //왼손으로 키패드를 누른다.
left = x;
}else{ //왼손과 오른손의 거리가 같을 경우
if(hand.equals("left")){//왼손잡이면 왼손으로, 아니면 오른손으로 누른다.
answer += "L";
left = x;
}else{
answer += "R";
right = x;
}
}
}
}
return answer;
}
public int length(int x, int fing){ //왼손이나 오른손과 누를 키패드의 거리를 계산하는 메서드
x = (x == 0) ? 11 : x; //0은 숫자 11이라고 생각하고 계산
fing = (fing == 0) ? 11 : fing;
return Math.abs(fing-x)%3 + Math.abs(fing-x)/3; //숫자들의 차이/3값과 %3값을 해서 return
}
이것이다.
솔직히 이 문제는 1,4,7,3,6,9를 누르는 경우는 쉬운데 2,5,8,0을 누르는 경우가 어려운 경우다.
그래서 2,5,8,0을 누를 때, 왼손과 오른손에서 각각 거리를 재는 메서드 length를 만들었는데
처음에 거리를 재려고 할 때, 솔직히 막막했다.
예를들어, 8에서 4(왼손)까지 거리와 6(오른손)까지 거리는 같은데 이 숫자들의 차는 각각 4,2로 왼손의 차이가 더 컸고
2에서 4(왼손)까지 거리와 6(오른손)까지 거리는 같은데 이 숫자들의 차는 각각 2,4로 오른손의 차이가 더 컸다.
이렇게 단순히 숫자의 차로 거리를 정하려니까 좀 중구난방이어서 고민했었는데
바로 옆 키패드까지의 거리를 1로 잡고 2와5사이의 거리, 5와6사이의거리를 1로 나오게 하려고 각각 숫자들의 차이를 봤다. 그러니까 3,1로 나왔는데 이 3과 1이 어떻게 동시에 1로 나올까...하고 곰곰히 생각해봤다.
그러고 숫자 키패드들을 보니 *,0,#을 각각 10,11,12로 두고 계산하면 윗줄과 밑줄의 차이가 3이 났다.
1 2 3
4 5 6
7 8 9
* 0 #
그래서 여기서 힌트를 얻어서 3을 나누거나 3으로 나눈 나머지를 조합해서 이리저리 해보니까
두 수의 차이/3 + 두 수의 차이%3 = 두 수의 거리가 된 것을 발견하고 그것을 메서드에 적어서 풀었다.
이런 문제는 처음 풀어봐서 좀 처음에 막막했는데 생각보다 쉬웠다!!!
다음에 이런 비슷한 유형이 나오면 이것을 응용해서 잘 풀수 있을 것 같다 ㅎㅎ
'프로그래머스 > Level 1' 카테고리의 다른 글
[프로그래머스][Level1][Java] 푸드 파이트 대회 (0) | 2022.11.04 |
---|---|
[프로그래머스][Level1][Java] 신고 결과 받기 (0) | 2022.03.05 |
[프로그래머스][Level1][Java] 체육복 (0) | 2022.03.04 |
[프로그래머스][Level1][Java] 실패율 (0) | 2022.03.03 |
[프로그래머스][Level1][Java] 다트 게임 (0) | 2022.03.01 |