[Java] 프로그래머스 문제4 고찰

이지원·2024년 5월 12일
3

Java Coding Study

목록 보기
4/4

풀었던 문제 중에 다시 생각해 볼만한 문제에 대한 고찰

키패드 누르기 (2020 카카오 인턴쉽)


  • 문제 설명

numbers 라는 int형 배열에 0 ~ 9 까지의 정수가 주어지고 이 정수를 휴대폰 키패드에서 왼손으로 터치할 것인가 오른손으로 터치할 것인가 결정하여 String result를 반환하면 되는 문제이다.

1, 4, 7은 왼손으로 터치 후 누른 자리 유지, 3, 6, 9는 오른손으로 터치 후 누른 자리 유지, 마지막으로 2, 5, 8, 0은 왼손의 위치와 오른손의 위치 중 가까운 손으로 터치 후 누른 자리 유지하면 되는 방식이다.

2, 5, 8, 0에서 왼손의 거리와 오른손의 거리가 같다면 주어진 String hand에서 right(오른손 잡이)이면 오른손으로 터치, left이면 왼손으로 터치하면 된다.


  • 내가 풀었던 풀이

    • 변수 선언
      왼손과 오른손의 현재 위치를 저장하는 변수를 int형 배열로 선언 후 초기화했다.

    • 로직 설명
      반복문의 인덱스는 필요없다고 판단하여 for-each문으로 반복을 실행했다.

      • number가 1, 4, 7 일 때
        1, 4, 7 일 떄는 왼손으로 터치해야 되기 때문에 먼저 현재 왼손의 위치를 숫자 패드의 위치에 맞게 왼손 위치 배열의 값을 변경해줄 때 향상된 switch 문을 통해 간단하게 대입해주고 String answer 변수에 "L"를 더해주었다.

      • number가 3, 6, 9 일 때

        3, 6, 9 일 때도 1, 4, 7 때와 마찬가지로 향상된 switch 문을 통해 키패드의 위치를 오른손 위치 배열에 대입해주었다.

      • number가 2, 5, 8, 0 일 때

        왼손의 위치와 오른손의 위치를 저장할 int형 변수를 선언해주고 Math.abs 메서드를 통해 정수의 절댓값을 반환하게 해주고 매개변수로는 왼손과 number의 x좌표와 y좌표의 차를 대입을 통해 거리 측정후 대입해주었다. 따라서 왼손의 거리가 작으면 "L", 오른손이 크면 "R", 같으면 주 손을 answer에 더하게 작성하였다. 나머지 5, 8, 0도 else if 조건문으로 똑같이 작성하여 문제를 해결하였다.


  • 문제 고찰

사실 이 문제에 대해서 다시 고찰하게 된 이유는 위의 문제는 맨해튼 거리 공식을 이용해서 문제를 풀어야지 답으로 되고 유클리드 거리 공식으로 문제를 풀게 되면 오답이 나오기 때문에 무엇이 다른지 궁금하여 문제를 다시 생각해보게 되었다.

물론, 나의 풀이를 중복되는 부분이 많기 때문에 메서드를 추출하여 모듈화를 하면 깔끔하게 다시 풀었다. 문제를 다시 풀면서 메서드 추출 반환 타입을 좀 더 유연하게 하는 것이 부족하다는 것을 깨달았다.

  • 유클리드 거리 공식, 맨해튼 거리 공식

    • 유클리드 거리 공식
      유클리드 거리는 두 점 사이의 직선 거리를 계산하는 방법이다. 피타고라스의 정리를 기반으로 하여, 2차원의 두 점의 좌표를 java 에서는 Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2, y1), 2)로 Math 클래스를 이용하여 구현할 수 있다.

    • 맨해튼 거리 공식
      맨해튼 거리는 두 점사이의 수평 및 수직 거리의 합을 계산하는 방법이다. 2차원의 두 점의 좌표를 java에서는 Math.abs(x2 - x1) + Math.abs(y2 - y1)로 Math 클래스를 이용하여 구현할 수 있었다.

    • 위의 문제에서 유클리드 거리가 오답인 이유
      유클리드는 직선의 거리를 구하는 것이고 문제에서는 손이 이동할 때 직선으로 이동하는 것이 상하좌우로 이동하기 때문에 왼손이 4에 있고 오른손이 8에 있을 때 number가 2로 주어지면 유클리드 거리는 sqrt(2)이고 맨해튼은 2이기 때문에 거리에 차이가 있기 때문에 문제에서 원하는 거리 방식인 맨해튼을 통해 거리를 구했어야 했다. 문제를 볼 때 문제의 의도를 정확하게 파악해야겠다고 느꼈다.

profile
백엔드 개발자취

0개의 댓글