코테 키패드 누르기

이종호·2021년 4월 5일
0

알고리즘

목록 보기
7/10
post-thumbnail

내 풀이

function solution(numbers, hand) {
  var answer = '';
  const keypad = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    [-1, 0, -1]
  ];

  let lx = 0;
  let rx = 2;
  let ly = 3;
  let ry = 3;

  for (let index = 0; index < numbers.length; index++) {
    for (let i = 0; i < keypad.length; i++) {
      for (let j = 0; j < keypad.length; j++) {
        let d_l = Math.abs(lx - j) + Math.abs(ly - i);
        let d_r = Math.abs(rx - j) + Math.abs(ry - i);
        if (numbers[index] == keypad[i][j]) {
          if (j == 0) {
            lx = j;
            ly = i;
            answer += 'L';
          } else if (j == 2) {
            rx = j;
            ry = i;
            answer += 'R';
          }
          else {
            if (d_l < d_r) {
              lx = j;
              ly = i;
              answer += 'L';
            } else if (d_l > d_r) {
              rx = j;
              ry = i;
              answer += 'R';
            } else {
              if (d_l == d_r && hand == 'left') {
                lx = j;
                ly = i;
                answer += 'L';
              } else {
                rx = j;
                ry = i;
                answer += 'R';
              }
            }
          }
        }
      }
    }
  }
  return answer;
}

접근 방법

문제 자체가 어려워 보이지 않았기 때문에 금방 할 수 있을 줄 알았다.
문제를 잘못 파악해서 두 세번 다시 코드를 뜯어 고쳤다.

중간에 key를 누르게 될 경우 해당 위치에서 다음 key의 거리를 계산해야 했는데, 그러질 못했고

전체적으로 문제를 완전히 파악하는데 시간이 오래걸린 느낌이다.

다른 사람 풀이

1위인 사람의 코드는 27줄 밖에 되지 않았고,

regex와 map을 적절히 잘 사용하여 코드 가독성 또한 뛰어났다.

아직 position배열의 의미는 잘 이해 못하겠지만, 대충 이해 될 것 같고, js의 활용도 뛰어나고 코드도 깔끔한 것 같다.

2위인 사람의 코드는 기능별로 함수를 나누었다.

거리를 측정하는 함수
가장 가까운 key를 찾는 함수
정답 함수

나쁘지 않지만, 코드를 27줄로 줄일 수 있다면 줄이는 방식이 더 나아보인다.

3위인 패터쓴님 코드


grid방식을 이용해서 풀으셨다는데, 미숙한 눈으로 봤을 땐 한 눈에 이해하기 어려운 코드가 아닌가 싶습니다.(제가 미숙하여 그렇습니다. 죄송합니다..)

내 코드의 순위는..

내 코드는 55줄로 변수명(lx, d_l 등)이 좀 덜 직관적이다.
불필요한 코드가 있는가..?
반복되는 부분이 있지만 일단은 이걸 한 번만 호출하는 것은 불가능해 보인다.
코드는.. 꽤나 직관적이라 생각하는데, 사람들은 어떻게 생각하는지 모르겠다.

오히려 너무 직관적이라 유아적이라 생각된다.

내가 선임이라면

내가 만약 신입을 뽑을 개발자라면 당근 1위를 뽑을 것 같다.
map과 regex활용이 자유자제라는 점을 어필할 수 잇을 것 같고,
코드의 가독성도 다른 코드 못지 않으며, 일단 가장 짧기 때문이다.

그래서?

그래서 나는 1위 코드를 분석하여 이해하고 안보고 다시 짤 수 있도록 노력할 것이다.

"돌아가기만 하면 되는 것 아니야? 적당히 가독성도 좋잖아?"

내가 백엔드를 관둔 이유도 이것 때문이라고 할 수 있겠다.

내 코드는 "돌아가고", "적당히 가독성도 있는 것" 처럼 보인다.

그 결과 나는 내 코드를 부끄러워 하게 되었고, 숨기기 급급한 코드로 전락했다.

모든 사람이 그래야 하는 것이라 생각하진 않는다.
다만 본인이 그렇게 느낀다면 일이 더 진행되기 전에 고쳐야 한다.

profile
코딩은 해봐야 아는 것

0개의 댓글