일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- string
- array
- geometry
- java
- SQL
- implement
- 코테
- database
- bit manipulation
- Method
- 구현
- sorting
- Math
- Class
- Number Theory
- 파이썬
- hash table
- 코딩테스트
- Matrix
- simulation
- Tree
- dynamic programming
- Binary Tree
- Binary Search
- Data Structure
- two pointers
- Counting
- greedy
- Stack
- 자바
- Today
- Total
코린이의 소소한 공부노트
[프로그래머스/Lv.1] 키패드 누르기 본문
1. Input
1) 순서대로 누를 번호가 담긴 배열 numbers
2) 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand
3) 왼손, 오른손 엄지손가락만을 이용해서 숫자 입력
4) 키패드의 모양
1 2 3
4 5 6
7 8 9
* 0 #
5) 왼손 엄지는 *에서, 오른손 엄지는 #에서 시작
2. Output
1) 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열
2) 엄지손가락 사용 규칙
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당한다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용한다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용한다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용한다. 이때 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용한다.
3. Constraint
1) numbers 배열의 크기는 1 이상 1,000 이하
2) numbers 배열 원소의 값은 0 이상 9 이하인 정수
3) hand는 "left" 또는 "right"이고, "left"는 왼손잡이, "right"는 오른손잡이를 의미한다.
4) 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 반환
4. Example
Input: numbers={1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5}, hand=“right” -> Output: "LRLLLRLLRRL"
설명:
5. Code
1) 첫 코드(2022/??)
String answer = "";
int i=0;
int[] lefthand = {3,0};
int[] righthand = {3,2};
int num;
boolean isRight = hand.equals("right") ? true : false;
int[] dright, dleft;
while(i< numbers.length) {
num = numbers[i];
switch(num) {
// 1,4,7은 무조건 왼손
case 1 :
lefthand[0] = 0; lefthand[1] = 0;
answer += "L"; break;
case 4 :
lefthand[0] = 1; lefthand[1] = 0;
answer += "L"; break;
case 7 :
lefthand[0] = 2; lefthand[1] = 0;
answer += "L"; break;
// 3, 6,9는 무조건 오른손
case 3 :
righthand[0] = 0; righthand[1] = 2;
answer += "R"; break;
case 6 :
righthand[0] = 1; righthand[1] = 2;
answer += "R"; break;
case 9 :
righthand[0] = 2; righthand[1] = 2;
answer += "R"; break;
// 2,5,8,0은 거리 계산 후 적용
default :
dright = calDistance(righthand, num);
dleft = calDistance(lefthand, num);
if(dleft[2] > dright[2]) { // 오른손이 가까움
righthand[0] = dright[0]; righthand[1] = dright[1];
answer += "R"; break;
}
else if(dleft[2] < dright[2]) { // 왼손이 가까움
lefthand[0] = dleft[0]; lefthand[1] = dleft[1];
answer += "L"; break;
}
else { // 오른손, 왼손이 같음
if(isRight) {
righthand[0] = dright[0]; righthand[1] = dright[1];
answer += "R"; break;
}
else {
lefthand[0] = dleft[0]; lefthand[1] = dleft[1];
answer += "L"; break;
}
}
} //switch문 끝
i++;
} // while문 끝
return answer;
// 거리 계산 메서드
static int[] calDistance(int[] hand, int n) {
int[] result = {3, 1, 0}; // 다음 입력이 0일때가 기본위치. 거리 기본값은 0
if(n != 0) result[0] = (int)(n/3);
result[2] = Math.abs(result[0]-hand[0]) + Math.abs(result[1]-hand[1]);
return result; // 손이 움직일 위치의 행, 열, 거리
}
'코딩테스트 풀이 > JAVA' 카테고리의 다른 글
[프로그래머스/Lv.1] k번째 수 (0) | 2022.11.22 |
---|---|
[프로그래머스/Lv.1] 모의고사 (0) | 2022.11.22 |
[프로그래머스/Lv.1] 두 개 뽑아서 더하기 (0) | 2022.11.17 |
[프로그래머스/Lv.1] 3진법 뒤집기 (0) | 2022.11.17 |
[프로그래머스/Lv.1] 내적 (0) | 2022.11.17 |