문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
알고리즘
없음
풀이
아래와 같이 각 숫자에 해당하는 2차원 좌표를 계산해 거리를 계산할 것이므로 *, 0 , # 를 10, 11, 12 로 바꿔 생각하고 구현한다.
따라서 왼손의 시작 위치 left = 10, 오른손의 시작 위치 right = 12가 된다.
int[][] pos = { {-1,-1},
{0,0}, {0,1}, {0,2},
{1,0}, {1,1}, {1,2},
{2,0}, {2,1}, {2,2},
{3,0}, {3,1}, {3,2} };
이제 pos[num] 을 통해 num에 해당하는 좌표를 구할 수 있다.
main 함수
1. numbers를 탐색하며 각 숫자를 누를 손을 구하는 getHand() 함수를 호출한다.
2. getHand()로 구한 결과를 정답 문자열에 저장하고, 손의 위치에 해당 숫자를 대입한다.
getHand 함수
1. 수가 1, 4, 7 이라면 "L" 반환
2. 수가 3, 6, 9 이라면 "R" 반환
3. 1, 2가 아니라면 getDist() 함수를 호출해 왼손과의 거리와 오른손과의 거리를 구함
(3-1) 왼손과의 거리가 더 가깝다면 "L" 반환
(3-2) 오른손과의 거리가 더 가깝다면 "R" 반환
(3-3) 두 거리가 동일하다면 hand에 따른 결과 반환
getDist 함수
(a의 y좌표와 b의 y좌표의 차이) + (a의 x좌표와 b의 x좌표의 차이) 를 반환한다.
코드
class Solution {
String handed;
int[][] pos = { {-1,-1},
{0,0}, {0,1}, {0,2},
{1,0}, {1,1}, {1,2},
{2,0}, {2,1}, {2,2},
{3,0}, {3,1}, {3,2} };
public String solution(int[] numbers, String hand) {
StringBuilder sb = new StringBuilder();
handed = "left".equals(hand) ? "L" : "R";
int left = 10;
int right = 12;
for(int number : numbers) {
if(number == 0) number = 11;
String result = getHand(number, left, right);
sb.append(result);
if("L".equals(result)) left = number;
else if("R".equals(result)) right = number;
}
return sb.toString();
}
public String getHand(int num, int left, int right) {
if(num == 1 || num == 4 || num == 7) return "L";
if(num == 3 || num == 6 || num == 9) return "R";
int leftDist = getDist(num, left);
int rightDist = getDist(num, right);
if(leftDist < rightDist) return "L";
else if(leftDist > rightDist) return "R";
else return handed;
}
public int getDist(int a, int b) {
return Math.abs(pos[a][0] - pos[b][0]) + Math.abs(pos[a][1] - pos[b][1]);
}
}
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 내적 (Java) (0) | 2022.10.30 |
---|---|
[프로그래머스] 3진법 뒤집기 (Java) (0) | 2022.10.29 |
[프로그래머스] 크레인 인형뽑기 게임 (Java) (0) | 2022.10.29 |
[프로그래머스] 모든 레코드 조회하기 (SQL) (0) | 2022.10.28 |
[프로그래머스] 실패율 (Java) (0) | 2022.10.28 |