티스토리 뷰
programmers.co.kr/learn/courses/30/lessons/67256?language=java
import java.util.Arrays;
import java.util.List;
class Solution {
public String solution(int[] numbers, String hand) {
List<Integer> leftPushList = Arrays.asList(1,4,7);
List<Integer> rightPushList = Arrays.asList(3,6,9);
List<Integer> anyPushList = Arrays.asList(2,5,8,0);
StringBuilder builder = new StringBuilder();
// * : 10
// # : 12
int nowLeftFinger = 10;
int nowRightFinger = 12;
for(int num : numbers) {
if(leftPushList.contains(num)) {
builder.append("L");
nowLeftFinger = num;
}
if(rightPushList.contains(num)) {
builder.append("R");
nowRightFinger = num;
}
if(anyPushList.contains(num)) {
if(num == 0) {
num = 11;
}
int leftTemp = Math.abs(nowLeftFinger - num);
int rightTemp = Math.abs(nowRightFinger - num);
int distanceByLeftFinger = leftTemp / 3 + leftTemp % 3;
int distanceByRightFinger = rightTemp / 3 + rightTemp % 3;
if(distanceByLeftFinger > distanceByRightFinger) {
nowRightFinger = num;
builder.append("R");
} else if (distanceByLeftFinger < distanceByRightFinger) {
nowLeftFinger = num;
builder.append("L");
} else {
if(hand.equals("left")) {
nowLeftFinger = num;
builder.append("L");
} else {
nowRightFinger = num;
builder.append("R");
}
}
}
}
return builder.toString();
}
}
키패드를 하나의 표로 생각해서 문제를 해결했다.
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
* | 0 | # |
맨 아래 행은 *, 0, # 이라서 계산이 어려우니 10, 11, 12로 거리계산 전에 치환해줬다.
1행부터 보면 아래로 갈수록 +3씩 되는 것을 볼 수 있다.
따라서 +3 혹은 -3은 한칸의 행 움직임이 된다.
예를들면, 9번 -> 3번으로 이동시
9 - 3 = 6
6 / 3 = 2
아래로 2칸 이동이라는 결과가 나온다.
3번 -> 9번 이동시에는 음수가 되는데 어디로 이동했는지는 알 필요없으니 절대값으로 음수 양수 구분을 없애준다.
그럼 열에 대한 구분은 어떻게 해야할까?
열은 나머지로 구하면 된다.
같은 행 숫자의 차이는 +3 / -3 이므로 3으로 나누면 나머지는 항상 0이 된다.
다른 열로 이동하면 나머지는 1, 두번이동하면 나머지는 2가 된다.
예를들어 9번 -> 2번으로 이동시 9 - 2 = 7 % 3 = 1... 옆으로 한칸 이동했다고 나온다.
행과 열의 거리를 계산했으니 이를 비교해 가운데 라인의 숫자(2,5,8,0)를 어떤 손꾸락으로 누를지만 구분해주면 끝!
'기초CS > 알고리즘' 카테고리의 다른 글
[프로그래머스] 알고리즘 연습 문제 : 카펫(자바/JAVA) (0) | 2020.12.16 |
---|---|
[프로그래머스] 알고리즘 연습 문제 : 괄호 변환(자바/JAVA) (0) | 2020.12.11 |
[프로그래머스] 알고리즘 연습 문제 : 주식가격 (자바/JAVA) (0) | 2019.12.01 |
[프로그래머스] 알고리즘 연습 문제 : 프린터 (자바/JAVA) (0) | 2019.11.28 |
[프로그래머스] 알고리즘 연습 문제 : 타겟 넘버 (자바/JAVA) (0) | 2019.09.07 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 더 나은 내일
- 알고리즘
- codility
- 최솟값
- 예매 알림
- 문자열 내 마음대로 정렬하기
- 카카오인턴
- 프로그래머스
- Spring
- 124 나라의 숫자
- 파이팅코리아
- 쇠막대기
- 안드로이드 스튜디오
- API
- 완주하지 못한 선수
- 타겟 넘버
- AWS
- java
- json
- 텔레그램
- 맵 api
- cgv
- FrogJmp
- 다음 맵 api
- 스프링 부트
- 노션트렐로광고X
- 자바
- K번째수
- 객체지향과 디자인패턴
- 기능개발
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
글 보관함