Notice
Recent Posts
Recent Comments
«   2025/05   »
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
Tags
more
Today
Total
관리 메뉴

차차로그

[JS] 2020 카카오 인턴십 > 키패드 누르기 본문

코딩테스트

[JS] 2020 카카오 인턴십 > 키패드 누르기

차차한 2022. 9. 7. 10:03

레벨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]로 넣었었다...ㅠㅠ

이런 실수를 하다니..

초기값을 넣을 때는 조심해야겠다

 

Comments