728x90
tech.kakao.com/2020/07/01/2020-internship-test/
풀이
class Solution {
class Position{
int x;
int y;
Position(){}
Position(int x, int y){
this.x = x;
this.y = y;
}
}
private int [][] position = {{1,2,3},{4,5,6},{7,8,9},{11,0,99}};
public String solution(int[] numbers, String hand) {
String answer = "";
Position left = new Position(3,0);
Position right = new Position(3,2);
for(int n : numbers){
if (n == 1 || n == 4 || n == 7){
answer += "L";
left = getPosition(n);
} else if (n == 3 || n == 6 || n == 9){
answer += "R";
right = getPosition(n);
} else {
Position next = getPosition(n);
int l = distance(left,next);
int r = distance(right, next);
if (l > r){
answer += "R";
right = getPosition(n);
}
if (l < r){
answer += "L";
left = getPosition(n);
}
if (l == r){
if (hand.equals("left")){
answer += "L";
left = getPosition(n);
}else{
answer += "R";
right = getPosition(n);
}
}
}
}
return answer;
}
public Position getPosition(int n){
Position keyPad = new Position();
for (int i = 0; i < position.length; i++) {
for (int j = 0; j < position[0].length; j++) {
if (position[i][j] == n){
keyPad.x = i;
keyPad.y = j;
}
}
}
return keyPad;
}
public int distance(Position now, Position next){
return Math.abs(now.x - next.x) + Math.abs(now.y - next.y);
}
}
해설을 보고 답안을 작성 해 봤는데 코드를 더 깔끔히 적는 방식을 연습해야겠다.
추가로, 2차원 배열에 적응할 필요성도 느꼈다. 1차원 배열만 자주 써서 2차원 배열 나오면 이것저것 헷갈린다.
좀 더 보기쉽게 바꾼 코드
class Solution {
class Position{
int x;
int y;
Position(){}
Position(int x, int y){
this.x = x;
this.y = y;
}
}
// 키패드 위치
private int [][] position = {{1,2,3},{4,5,6},{7,8,9},{11,0,99}};
// 위치 초기화
Position left = new Position(3,0);
Position right = new Position(3,2);
private String hand;
public String solution(int[] numbers, String hand) {
this.hand = (hand.equals("right")) ? "R" : "L";
String answer = "";
for(int n : numbers){
String thumb = pushNumber(n);
answer += thumb;
if (thumb.equals("L")){
left = getPosition(n);
continue;
}
if (thumb.equals("R")){
right = getPosition(n);
continue;
}
}
return answer;
}
// 현재 손가락 위치 얻기
private Position getPosition(int n){
Position keyPad = new Position();
for (int i = 0; i < position.length; i++) {
for (int j = 0; j < position[0].length; j++)
if (position[i][j] == n) {
keyPad.x = i;
keyPad.y = j;
}
}
return keyPad;
}
// 왼손, 오른손 중 누르는 손 return
private String pushNumber(int n){
if (n == 1 || n == 4 || n == 7) return "L";
if (n == 3 || n == 6 || n == 9) return "R";
Position next = getPosition(n);
if (distance(left, next) < distance(right, next)) return "L";
if (distance(left, next) > distance(right, next)) return "R";
// 두 엄지 손가락의 거리가 같다면
return this.hand;
}
// 두 지점 사이의 거리 리턴
private int distance(Position now, Position next){
return Math.abs(now.x - next.x) + Math.abs(now.y - next.y);
}
}
문제 해설
문제의 조건을 확인하고 두 점 사이의 거리를 이용하여 구현하면 되는 문제입니다. 다음과 같이 2차원 배열 형태로 좌표를 미리 만들어 둔다면 숫자별로 눌러야 하는 위치를 간단히 알아낼 수 있습니다.
- [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]
예를 들면 0은 (3, 1) 지점을 누르면 되며, 1은 (0,0) 위치를 누르면 된다는 의미입니다. 다음으로 숫자를 누를 때마다 다음과 같이 조건을 확인합니다.
- 1,4,7을 누를때는 왼손 엄지손가락 위치를 갱신합니다.
- 3,6,9를 누를때는 오른손 엄지손가락 위치를 갱신합니다.
- 2,5,8,0을 누를때는 왼손과 오른손중 더 가까운 손가락의 위치를 갱신합니다.
- 만약, 거리가 같다면 오른손 잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락 위치를 갱신합니다.
오른손 엄지손가락 위치를 (right_x, right_y), 다음으로 눌러야 하는 숫자의 위치를 (next_x, next_y)라고 할 때, 이동 거리는 다음과 같습니다.
- |right_x – next_x| + |right_y – next_y|
왼손 엄지손가락 위치를 (left_x, left_y)라고 한다면, 마찬가지로 다음과 같이 이동거리를 구하면 됩니다.
- |left_x – next_x| + |left_y – next_y|
이제 둘 중 더 가까운 손가락 위치를 갱신하면 되며 거리가 같은 경우에는 오른손잡이, 왼손잡이에 따라 위치를 갱신해 주면 됩니다.
728x90
'코딩테스트' 카테고리의 다른 글
[LeetCode] 460. LFU Cache (0) | 2021.05.17 |
---|---|
[프로그래머스] [카카오 인턴] 크레인 인형뽑기 게임 (0) | 2021.05.12 |
[LeetCode] 141. Linked List Cycle (0) | 2021.05.06 |
[LeetCode] Palindrome Linked List (0) | 2021.05.06 |
[LeetCode] 19. Remove Nth Node From End of List (0) | 2021.05.06 |