멍두의 개발새발
[프로그래머스] - 키패드 누르기 in Java 본문
반응형
📍 문제
https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
📍 문제설명
문제 종류 : 구현
1. 전화번호를 좌표로 처리한다.
2. numbes 배열을 돌면서 매번 검색하므로 빠른 검색을 위해 map을 사용한다
3. 초기 오른손 좌표와 왼손 좌표를 설정한다
4, 1,4,7은 왼손 / 3,6,9는 오른손이 이동한다
5. 2,,5,8,0은 가까운 손이 이동한다
6. 거리 계산은 현재 좌표에서 목표 좌표까지의 ,x y 좌표 차이를 계산하여 더한다 | rx - cx | + | ry - cy |
📍 코드
✔️ 코드
더보기
더보기
import java.util.*;
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder sb = new StringBuilder();
Map<Integer, int[]> map = new HashMap<>();
map.put(1, new int[]{0, 0});
map.put(2, new int[]{1, 0});
map.put(3, new int[]{2, 0});
map.put(4, new int[]{0, 1});
map.put(5, new int[]{1, 1});
map.put(6, new int[]{2, 1});
map.put(7, new int[]{0, 2});
map.put(8, new int[]{1, 2});
map.put(9, new int[]{2, 2});
map.put(0, new int[]{1, 3});
//1. 초기 상태
int rx = 2;
int ry = 3;
int lx = 0;
int ly = 3;
for(int i = 0; i < numbers.length; i++){
//2. 이동하려는 곳의 좌표값을 구함
int[] current = map.get(numbers[i]);
int cx = current[0];
int cy = current[1];
//3. 1,4,7 이면 왼손 / 3,6,9 면 오른손
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
lx = cx;
ly = cy;
sb.append("L");
continue;
}
if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
rx = cx;
ry = cy;
sb.append("R");
continue;
}
//4. 그 외의 경우
//오른손 이동 거리, 왼손 이동 거리 계산
int rightMove = Math.abs(rx - cx) + Math.abs(ry - cy);
int leftMove = Math.abs(lx - cx) + Math.abs(ly - cy);
//이동 거리가 더 짧은 손이 이동
//만약 이동 거리가 같다면 hand에 따라 결정
if(rightMove == leftMove){
if(hand.equals("right")){
rx = cx;
ry = cy;
sb.append("R");
}
else{
lx = cx;
ly = cy;
sb.append("L");
}
}else if(rightMove > leftMove){
lx = cx;
ly = cy;
sb.append("L");
}else{
rx = cx;
ry = cy;
sb.append("R");
}
}
return sb.toString();
}
}
📍 틀린이유
rx, ry, cx, cy, lx, ly가 너무 자주 나오다 보니 오타가 있었고, 다 비슷하게 생기니 찾기가 힘들었다.
📍 기억할 것
중복이 많이 되는 부분인 rx, ry, lx, ly를 갱신하는 부분에서 변수를 전역변수로 선언 한 뒤 함수를 만들어 처리할까 싶기도 한데 전역변수는 쓰면 뭔가 마음이 불편..해서 잘 안하게 된다.
어떤게 가장 좋은 방법일지 ..
이런 코드에서는 변수명을 더 명확하게 짓기 / 디버깅 꼼꼼하게 자주해보기가 정답인 것 같다
반응형