차차로그
[JS] 2020 카카오 인턴십 > 키패드 누르기 본문
레벨1 마지막 문제!!!!
몇 시간동안 잡고 있었는지.....참나 ㅠㅠ
혼자서는 도저히 못 하겠어서 푸는 법 힌트를 봤다..
function solution(numbers, hand) {
var answer = '';
var phone = {
1:[0,0], 2:[0,1], 3:[0,2],
4:[1,0], 5:[1,1], 6:[1,2],
7:[2,0], 8:[2,1], 9:[2,2],
'*':[3,0], 0:[3,1], '#':[3,2]
}
var left = phone['*'];
var right = phone['#'];
for(var i = 0; i < numbers.length; i++){
if(numbers[i] % 3 == 1){
left = phone[numbers[i]];
answer += 'L';
}else if(numbers[i] % 3 == 0 && numbers[i] != 0){
right = phone[numbers[i]];
answer += 'R';
}else{
var cal = calF(phone[numbers[i]][0] - left[0], phone[numbers[i]][1] - left[1],
phone[numbers[i]][0] - right[0], phone[numbers[i]][1] - right[1]);
if(cal == 0){
if(hand == 'left'){
left = phone[numbers[i]];
answer += 'L';
}else{
right = phone[numbers[i]];
answer += 'R';
}
}else if(cal == 1){
right = phone[numbers[i]];
answer += 'R';
}else{
left = phone[numbers[i]];
answer += 'L';
}
}
}
return answer;
}
function calF(x,y,z,a){
var xnum = Math.abs(x) + Math.abs(y);
var ynum = Math.abs(z) + Math.abs(a);
if(xnum == ynum){
return 0;
}else if(xnum > ynum){
return 1;
}else{
return 2;
}
}
var phone = {
1:[0,0], 2:[0,1], 3:[0,2],
4:[1,0], 5:[1,1], 6:[1,2],
7:[2,0], 8:[2,1], 9:[2,2],
'*':[3,0], 0:[3,1], '#':[3,2]
}
var left = phone['*'];
var right = phone['#'];
위치를 배열로 설정해두고 객체에 담아줬다.
왼손과 오른손 초기 위치를 설정해야 해서 각각 변수에 담아줬다.
left는 [3,0], right는 [3,2]의 값을 얻는다.
for(var i = 0; i < numbers.length; i++){
if(numbers[i] % 3 == 1){
left = phone[numbers[i]];
answer += 'L';
}else if(numbers[i] % 3 == 0 && numbers[i] != 0){
right = phone[numbers[i]];
answer += 'R';
//...
numbers 배열의 길이만큼 반복을 돌려서 누를 번호가 1,4,7이면 왼손으로 누르고 3,6,9면 오른손으로 눌러야하니 각각 left, right를 이동시키고(변수에 담아주고) L또는 R을 answer 문자열에 값을 더해준다.
//...
var cal = calF(phone[numbers[i]][0] - left[0], phone[numbers[i]][1] - left[1],
phone[numbers[i]][0] - right[0], phone[numbers[i]][1] - right[1]);
if(cal == 0){
if(hand == 'left'){
left = phone[numbers[i]];
answer += 'L';
}else{
right = phone[numbers[i]];
answer += 'R';
}
}else if(cal == 1){
right = phone[numbers[i]];
answer += 'R';
}else{
left = phone[numbers[i]];
answer += 'L';
}
}
}
return answer;
}
function calF(x,y,z,a){
var xnum = Math.abs(x) + Math.abs(y);
var ynum = Math.abs(z) + Math.abs(a);
if(xnum == ynum){
return 0;
}else if(xnum > ynum){
return 1;
}else{
return 2;
}
}
이 부분이 가장 어려웠는데, 각 숫자끼리의 거리를 구해 왼손이 가까우면 왼손으로 누르고 오른손이 가까우면 오른손으로 누르고..거리가 같으면 왼손잡이인지 오른손잡이인지에따라 누르고..@.@
중복되게 쓰는 내용이 많아서 함수를 하나 만들어줬다.
왼손과 눌러야하는 숫자의 거리와 오른손과 눌러야하는 숫자의 거리를 비교해 각각의 값을 리턴해줬다.
손이 있는 위치와 숫자의 거리는 각 숫자가 phone객체에서 [x,y]와 [a,b]의 값을 가지고 있을 때 (x-a) + (y-b)를 해주면 된다.
단 마이너스가 나올 수도 있기 때문에 반드시 절대값으로 만들어줘야한다!
리턴된 값을 받아 0이면 두 손 모두 같은 거리에 있으니 hand를 확인해 왼손, 오른손으로 누를지 정해준다.
1이면 왼손과의 거리가 더 멀기 때문에 오른손으로 눌러주고 2면 왼손으로 눌러준다.
여담으로..
아무리 문제를 풀어도 계속 틀리길래 코드를 다시 보니까
phone에 좌표값을 넣을 때 5를 [1,1]가 아니라 [1,2]로 넣었었다...ㅠㅠ
이런 실수를 하다니..
초기값을 넣을 때는 조심해야겠다

'코딩테스트' 카테고리의 다른 글
[JS] 연습문제 > 최댓값과 최솟값 (0) | 2022.09.08 |
---|---|
[JS] 월간 코드 챌린지 시즌3 > n^2 배열 자르기 (0) | 2022.09.07 |
[JS] 2019 카카오 개발자 겨울 인턴십 > 크레인 인형뽑기 게임 (0) | 2022.09.06 |
[JS] 2019 KAKAO BLIND RECRUITMENT > 실패율 (0) | 2022.09.05 |
[JS] 2018 KAKAO BLIND RECRUITMENT[1차] > 다트 게임 (0) | 2022.09.02 |