반응형
💡문제 설명
- 이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
- 순서대로 누를 번호가 담긴 배열 numbers,
- 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때,
- 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
💡규칙
- 0번 col에 있으면 왼손을 옮기고
- 2번 col에 있으면 오른손을 옮기고
- 중간에 있으면 더 가까운 손가락을 옮긴다.
- 만약 거리가 같다면 본인의 주 손인 오른손을 옮긴다.
💡풀이
class Solution {
Position left;
Position right;
Position numPos;
public String solution(int[] numbers, String hand) {
String answer = "";
//1. 왼손 오른손 위치를 초기화
left = new Position(3, 0);
right = new Position(3, 2);
for(int num : numbers) {
//2. 숫자를 누를 손가락 정하기
//row //column
//예를 들어 6이라는 숫자의 위치를 찾고자 할 때 6-1은 5가 됨. -> 5를 3으로 나누면 1이 나옴.
//row는 1이 나오고 col은 5%3이기 때문에 2가 나옴.
numPos = new Position((num-1)/3, (num-1)%3);
if(num==0)
numPos=new Position(3, 1);
//정해놓은 규칙을 정의할 함수
String finger = numPos.getFinger(hand);
//3. 정해진 손가락을 answer에 담고 손가락 위치 이동
answer += finger;
if(finger.equals("L"))
left = numPos;
else
right = numPos;
}
return answer;
}
class Position{
int row;
int col;
Position(int row, int col) {
this.row=row;
this.col=col;
}
public String getFinger(String hand) {
//본인이 오른손 잡이면 R을 넣어주고 아닌 경우엔 L을 넣어줌.
String finger = hand.equals("right")? "R" : "L";
//col이 0이면 무조건 왼손을 써야 함.
if(this.col == 0)finger = "L";
//2이면 오른손을 써야함.
else if(this.col==2)finger = "R";
else {
//현재 이 숫자의 위치와 왼손의 위치
int leftDist = left.getDistance(this);
//오른손의 위치와 숫자의 위치
int rightDist = right.getDistance(this);
//왼쪽 손가락이 더 가깝다면
if(leftDist<rightDist)
finger = "L";
//오른쪽 손가락이 더 가깝다면
else if(rightDist<leftDist)
finger = "R";
}
return finger;
}
public int getDistance(Position p) {
//row와 row간의 차이, col과 col의 차이를 절댓값으로 변환해서
//그 두 거리들의 합을 반환해주면 됨.
return Math.abs(this.row - p.row) + Math.abs(this.col - p.col);
}
}
}
💡실행 결과
반응형
'💻 my code archive > 🗝️Algorithm' 카테고리의 다른 글
[코딩테스트 연습, 프로그래머스, Java] - 전화번호 목록 (0) | 2022.04.08 |
---|---|
[코딩테스트 연습, 프로그래머스, Java] - 완주하지 못한 선수 (0) | 2022.04.08 |
[코딩테스트 연습, 프로그래머스, Java] - 신규 아이디 추천 (0) | 2022.04.08 |
[코드업/자바] JAVA 기초-종합 수 나열하기:: 1087~1091 (0) | 2022.02.10 |
[코드업/자바] 기초 100제 2.입출력문 및 연산자 :: 1065~1084 (0) | 2022.02.10 |