-
프로그래머스 (Level 1) - 키패드 누르기Coding Test/Coding Test 문제 풀이 2021. 12. 24. 21:05
문제 설명
코딩테스트 연습 - 키패드 누르기
[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
풀이
숫자 1, 4, 7은 무조건 왼손 엄지손가락을 이용해야 하고, 숫자 3, 6, 9는 오른손 엄지손가락만을 이용해야 한다.
숫자 2, 5, 8, 0은 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용해야 하고, 키패드와 두 엄지손가락의 거리가 같다면 오른손잡이는 오른손 엄지손가락을 왼손잡이는 왼손 엄지손가락을 사용해야 한다.
이 문제에서 가장 중요한 점은 다음의 사항이라고 생각한다.
숫자가 2, 5, 8, 0일 경우 현재 키패드의 위치와 두 엄지손가락 사이의 거리를 어떻게 측정할 것인가?이다.
우선, 키패드를 2차원 배열이라고 생각을 하고 위 사진과 같이 표현할 수 있다.
두 위치 사이에 거리를 구하기 위해서는 두 위치의 x좌표 차이의 절댓값과 y좌표 사이의 절댓값을 더함으로써 구할 수 있다.
예를 들어서 키패드 숫자 2와 7 사이의 거리를 구하기 위해서는 0(2의 x좌표) - 2(7의 x좌표) = -2 즉 절댓값인 2가 되고, 1(2의 y좌표) - 0(7의 y좌표) = 1이 된다. 2 + 1 = 3이 곧 2와 7 사이의 거리가 되는 것이다.
전체 소스코드
import java.io.*; import java.util.*; public class Main { static int leftX = 3; // 왼손 엄지손가락의 x좌표 static int leftY = 0; // 오른손 엄지손가락의 y좌표 static int rightX = 3; // 오른손 엄지손가락의 x좌표 static int rightY = 2; // 오른손 엄지손가락의 y좌표 static int[][] locations = { { 3, 1 }, { 0, 0 }, { 0, 1 }, { 0, 2 }, { 1, 0 }, { 1, 1 }, { 1, 2 }, { 2, 0 }, { 2, 1 }, { 2, 2 } }; // 각 키패드의 좌표 정보 public String solution(int[] numbers, String hand) { String answer = ""; for (int i = 0; i < numbers.length; i++) { int number = numbers[i]; /** 키패드의 숫자가 1, 4, 7인 경우 */ if (number == 1 || number == 4 || number == 7) { leftX = locations[number][0]; leftY = locations[number][1]; answer += "L"; } /** 키패드의 숫자가 3, 6, 9인 경우 */ else if (number == 3 || number == 6 || number == 9) { rightX = locations[number][0]; rightY = locations[number][1]; answer += "R"; } /** 그 외 숫자인 경우 */ else { int leftDistance = Math.abs(locations[number][0] - leftX) + Math.abs(locations[number][1] - leftY); // 왼손 엄지손가락과의 거리 int rightDistance = Math.abs(locations[number][0] - rightX) + Math.abs(locations[number][1] - rightY); // 오른손 엄지손가락과의 거리 if (leftDistance > rightDistance) { rightX = locations[number][0]; rightY = locations[number][1]; answer += "R"; } else if (leftDistance < rightDistance) { leftX = locations[number][0]; leftY = locations[number][1]; answer += "L"; } else { if (hand.equals("right")) { rightX = locations[number][0]; rightY = locations[number][1]; answer += "R"; } else { leftX = locations[number][0]; leftY = locations[number][1]; answer += "L"; } } } } return answer; } }
728x90'Coding Test > Coding Test 문제 풀이' 카테고리의 다른 글
프로그래머스 (Level 1) - 없는 숫자 더하기 (0) 2021.12.26 프로그래머스 (Level 1) - 음양 더하기 (0) 2021.12.26 프로그래머스 (Level 1) - 로또의 최고 순위와 최저 순위 (0) 2021.12.26 프로그래머스 (Level 1) - 다트 게임 (0) 2021.12.25 프로그래머스 (Level 1) - 숫자 문자열과 영단어 (0) 2021.12.24