Algorithm/Java

프로그래머스 - 키패드 누르기 java :: 2020 카카오 인턴십

고고마코드 2022. 7. 8. 15:56
반응형
67256번

코딩테스트 연습 - 키패드 누르기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


풀이

📌키패드의 위치 중 left, mid, right를 기준으로 행의 위치를 알고 있으면 답을 구하기 쉬워요.

예를 들어 키패드를 그대로 행의 인덱스 값을 부여하면 아래와 같습니다.

0 0 0

1 1 1

2 2 2

3 3 3

 

📌거리 계산이 핵심인데, 거리 계산을 하기 위해서는 손가락의 위치를 먼저 알아야 해요.

그래서 3개의 핵심이 있는 것 같아요.

🎈누르려는 엄지의 방향 (L / R)

🎈누르려는 키의 위치

🎈각 엄지와 키의 거리 계산

 

📝풀이1

public String solution(int[] numbers, String hand) {
	StringBuilder sb = new StringBuilder();
	hand = hand.equals("left") ? "L" : "R";
	
	// 0 ... 9 행 번호
	int[] rowKey = { 3, 0, 0, 0, 1, 1, 1, 2, 2, 2 }; 
	
	Thumb thumb_l = new Thumb("L", 3); // 왼손
	Thumb thumb_r = new Thumb("R", 3); // 오른손
	
	for (int number : numbers) {
		int row = rowKey[number]; // 행 번호
		String[] pressWithThumb = new String[2]; // [0]=누르는 엄지, [1]=키의 위치
		
		switch(number) {
		case 1: case 4: case 7:
			pressWithThumb[0] = "L"; pressWithThumb[1] = "L";
			break;
		case 3: case 6: case 9:
			pressWithThumb[0] = "R"; pressWithThumb[1] = "R";
			break;
		default:
			int dist = thumb_l.getMidDist(row) - thumb_r.getMidDist(row); // 거리 계산
			pressWithThumb[0] = (dist == 0) ? hand : ( (dist < 0) ? "L" : "R" ); 
			pressWithThumb[1] = "M";
			break;
		}
		
		sb.append(pressWithThumb[0]);
		if(pressWithThumb[0].equals("L")) thumb_l.setThumb(pressWithThumb[1], row);
		else thumb_r.setThumb(pressWithThumb[1], row);
	}
	
	return sb.toString();
}

public class Thumb {
	String position; // 엄지의 위치
	int row;
	
	public Thumb(String position, int row) {
		this.position = position;
		this.row = row;
	}
	
	private void setThumb(String position, int row) {
		this.position = position;
		this.row = row;
	}
	
	private int getMidDist(int mid) {
		return Math.abs(mid - this.row) - (this.position.equals("M") ? 1 : 0);
	}
}

먼저 Thumb 클래스를 봐야 되겠네요.

🔨getMidDist(int mid) 

현재 엄지의 위치와 눌러야하는 키의 위치 사이의 거리를 계산합니다.

예를 들어볼게요.

눌러야 하는 키 : 5

왼손 엄지의 위치 : 7, 오른손 엄지의 위치 : 2 

5의 행번호는 1

왼손 7의 행번호는 2으로 ➡ abs(1-2) = 1

오른손 2의 행번호는 0으로 ➡  abs(1-0) - 1 = 0 

오른손의 경우 '2'는 중앙에 있는 키이므로 더 가깝기 때문에 -1 을 해야 합니다.

 

🔨int[] rowKey = { 3, 0, 0, 0, 1, 1, 1, 2, 2, 2 };

0부터 9까지의 행번호를 배열로 만들었어요.

행번호를 가지고 메소드 getMidDist()를 활용해 거리계산을 할 수 있어요.

 

🔨String[] pressWithThumb

String배열을 하나 만들었는데, 크기는 2로 고정이고

인덱스 0에는 어떤 엄지 손가락으로 누를 건지 ("L", "R") 중 하나를 저장합니다.

인덱스 1에는 누르려는 키의 위치가 어디에 있는지 ("L", "M", "R") 중 하나를 저장합니다.

 

⚡테스트 케이스 처리속도: 0.18ms ~ 0.78ms

 

반응형