티스토리 뷰
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
카카오 코딩 테스트 당시 이 문제를 풀지 못했다. 요즘 알고리즘을 공부하면서 너무 복잡하게 생각하고 어렵게 코딩하려던 게 원인이 아닐까 싶다. 문제를 보면 이해를 하고 먼저 단순하게 풀 수 있는지 확인 먼저 해야겠다.
이 문제를 마지막으로 level 1 문제를 완료했다. 백준 알고리즘 기초 강의를 마무리하고 level 2 문제 도전!!
[문제 풀이]
1. 0 ~ 9까지의 숫자만 누를 수 있다는 제약 조건이 있다.
2. 현재 숫자가 1, 4, 7이면 왼손으로 누른다.
3. 현재 숫자가 3, 6, 9이면 오른손으로 누른다.
4. 현재 숫자가 2, 5, 8, 0이면 왼손과 오른손 중 가까운 손으로 누른다. 단, 거리가 같다면 주 손잡이로 누른다.
5. 거리 계산 (double로 하지 말고 int로 하자)
5-1. 현재 누르고 있는 숫자가 2, 5, 8, 0이면 x는 1이고 아니라면 0(1, 4 7을 누르든 3, 6, 9를 누르던 2, 5, 8, 0과 거리를 계산할 때 최대 길이는 1이기 때문이다.)을 넣는다.
5-2. 현재 숫자가 0이라면 4 아니라면 1, 2, 3은 1을 4, 5, 6은 2를, 7, 8, 9라면 3을 반환해야 한다.
5-3. x의 거리 차이와 y의 거리 차이의 합을 반환한다.
[소스 코드]
public class PressKeypad {
private static StringBuilder answer = new StringBuilder();
public static void main(String[] args) {
int[] numbers = {1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5};
String hand = "right";
System.out.println(solution(numbers, hand));
}
private static String solution(int[] numbers, String hand) {
int leftHand = 10;
int rightHand = 12;
for (int number : numbers) {
if (number == 1 || number == 4 || number == 7) {
leftHand = number;
answer.append("L");
} else if (number == 3 || number == 6 || number == 9) {
rightHand = number;
answer.append("R");
} else {
int leftDistance = calculateDistance(leftHand, number);
int rightDistance = calculateDistance(rightHand, number);
int calculate = leftDistance - rightDistance;
if (calculate == 0) {
if ("right".equals(hand)) {
rightHand = number;
answer.append("R");
} else {
leftHand = number;
answer.append("L");
}
} else if (calculate > 0) {
rightHand = number;
answer.append("R");
} else {
leftHand = number;
answer.append("L");
}
}
}
return answer.toString();
}
private static int calculateDistance(int current, int number) {
int x = 0;
int y = calculateY(current);
int numberX = 1;
int numberY = calculateY(number);
if (current == 2 || current == 5 || current == 8 || current == 0) {
x = 1;
}
return numberX - x + Math.abs(y - numberY);
}
private static int calculateY(int number) {
return number == 0 ? 4 : (number - 1) / 3 + 1;
}
}
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 다트 게임 (lv.1) (0) | 2020.07.31 |
|---|---|
| [프로그래머스] 비밀지도 (lv.1) (0) | 2020.07.31 |
| [프로그래머스] 예산 (lv.1) (0) | 2020.07.31 |
| [프로그래머스] 직사각형 별찍기 (lv.1) (0) | 2020.07.28 |
| [프로그래머스] x만큼 간격이 있는 n개의 숫자 (lv.1) (0) | 2020.07.28 |
- Total
- Today
- Yesterday
- Algorihtm
- 이것이 코딩테스트다
- programmers
- 깃
- git
- 정렬
- 알고리즘
- 단계별로 문제풀이
- repository
- 저장소
- 그리디
- 코틀린
- Python
- bfs
- dfs
- 열혈강의
- 2020 카카오 인턴십
- 그래프
- spring boot 2.3.1
- binary search
- 백준
- DP
- Algorithm
- 2019 카카오 개발자 겨울 인턴십
- BOJ
- 자료구조
- 구현
- Summer/Winter Coding(~2018)
- OS
- Idempotent
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
