[코딩테스트] 2020 kakao 인턴십

채림·2022년 6월 30일
0

2020 카카오 인턴십

키패드 누르기

level1인데 푸는데 삼일 걸림.......ㅋㅋㅋㅋ 이 속도로 코테를 어떻게 본담
남의 코드 많이 보고 감을 잡자!

function solution(numbers, hand) {
    var answer = '';
    let lLocation = [3,0];
    let rLocation = [3,2];
    let numberLocation=[];
    numbers.forEach(number => {
        if(number === 0){number = 11}
        if (number % 3 === 0){
            numberLocation.push([number/3 - 1, 2])
        } else {
            numberLocation.push([Math.floor(number/3), Math.round(number%3)-1])
        } 
    })
    //console.log(numberLocation);
    numberLocation.forEach((location, index) => {
        if(location[1] === 0){
            answer += "L";
            lLocation = location;
        }else if(location[1] === 2){
            answer += "R";
            rLocation = location;
        }else{
            let lDistance = distance(lLocation, location);
            let rDistance = distance(rLocation, location);
            //console.log(`[${lLocation}](${lDistance}path) or [${rLocation}](${rDistance}path) to ${numbers[index]}[${location}]`);
            if(lDistance < rDistance) {
                lLocation = location;
                answer += "L";
            }else if(lDistance > rDistance) {
                rLocation = location;
                answer += "R";
            }else if(hand === "right"){
                rLocation = location;
                answer += "R";
            }else if(hand === "left"){
                lLocation = location;
                answer += "L";
            }
        }   
    })
    return answer;
}

function distance(start, end) {
    return Math.abs(start[0]-end[0]) + Math.abs(start[1]-end[1])
}



풀이과정

  1. 키패드 숫자에 집착해서 상하좌우를 ±1 ±3으로 놓고 재귀호출로 이동 거리 계산했다가 이틀만에 음수+Math.min() 콤보로 계산이 안 된다는걸 깨닫고 뒤집어 엎었다....

  2. 키패드 숫자%3 하면 3, 6, 9는 0이 남기 때문에 가운데 줄(2 남음)과의 이동 거리가 계산이 안되는 걸 하루 종일 고민함...

  3. 좌표나 배열로 놓을 생각 못하고 일일이 if문 돌려서 엄청난 하드코딩을 만들었다가 주현님 조언 듣고 좌표계로 방향 틀음

  4. 좌표 로직 짜는데도 한참 걸림.. 논리력 혹은 계산력이 부족한가? 다시 한번 다짐하지만 메인 로직 짤 때는 맞는지 검증까지 하고 코딩 들어가자!! 뒤집어 엎으면 헛수고다.......


올바른 풀이를 보고

  1. 입력값 “right”과 리턴값 “R”을 연동을 못 시켜서 다 if문으로 판별했는데 맨 앞 글자 하나만 떼오고 L, R로 선택할 수 있게 객체 키 값을 L, R로 두면 왼손 오른손 거리 같을 때 안 나눠도 된다! 그동안 입력 받은 문자열과 배열 값을 매치하는 걸 매번 다른 객체를 만들어서 for문 도느라 바빴는데 object[input(string)] 방법 꼭 기억하기
    ex) hand = hand[0] === "r" ? "R" : "L” 이랑 let h = { L: [1, 1], R: [1, 1] }로 세팅하면 h[hand] = [location, 0] 가넝!

  2. 어렵게 /3 %3 이용할 생각 하지 말고 그냥 임의로 지정해도 되는 거였다! 어차피 숫자는 10개로 고정돼 있고 더 늘어날 일도 없기 때문에...
    ex) 0~9 세로위치 지정: let position = [1, 4, 4, 4, 3, 3, 3, 2, 2, 2]

  3. 정규표현식은 컴구때 배우긴 했는데 쓸 줄을 모르네.. 정규표현식 쓸 줄 알면 훨씬 편해질 듯!
    ex)if (/[147]/.test(x))

  4. L/R 도출 함수를 .map에 보내고 .join('')으로 묶은 걸 리턴하면 매번 answer+=L/R 안해도 된다
    ex) return numbers.map(L/R 판별함수).join("")

profile
나는 말하는 감자... 감자 나부랭이....

0개의 댓글