1. 문제

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

2. 접근방법

왼손 오른손 두 손가락으로 숫자를 누를 때 어떤 손으로 누를지 순서를 출력하는 문제

 

기본적인 구현 문제로 좌표의 개념만 있다면 쉽게 해결이 가능하다.

왼손과 오른손의 좌표를 계속해서 저장해두고

비교가 필요할 경우

|x1-x2| + |y1-y2| 를 했을 때 더 가까운 손으로

거리가 같으면 왼손잡이 인지 오른손 잡이 인지로 판단하여

누르는 손을 결정하면 된다.

3. 자바 코드

import java.awt.Point;

public class P67256키패드누르기 {

	public String solution(int[] numbers, String hand) {
		String answer = "";
		Point left = new Point(3, 0);
		Point right = new Point(3, 2);
		Point numPoint[] = new Point[11];
		boolean isLeft = false;
		if (hand.equals("left")) {
			isLeft = true;
		}
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++)
				numPoint[i * 3 + j + 1] = new Point(i, j);
		numPoint[0] = new Point(3, 1);

		for (int i : numbers) {
			Point target = numPoint[i];
			if (i == 1 || i == 4 || i == 7) {
				answer += 'L';
				left = target;
			} else if (i == 3 || i == 6 || i == 9) {
				answer += 'R';
				right = target;
			} else {
				int leftDis = Math.abs(target.x - left.x) + Math.abs(target.y - left.y);
				int rightDis = Math.abs(target.x - right.x) + Math.abs(target.y - right.y);
				if (leftDis > rightDis) {
					answer += 'R';
					right = target;
				} else if (leftDis < rightDis) {
					answer += 'L';
					left = target;
				} else {
					if (isLeft) {
						answer += 'L';
						left = target;
					} else {
						answer += 'R';
						right = target;
					}
				}
			}

		}

		return answer;
	}
}

4. 마치며

.

 

 

+ Recent posts