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

이지원·2024년 5월 8일
4

Java Coding Study

목록 보기
3/4

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

공원 산책 (프로그래머스 연습문제)


  • 문제 설명
    이미지와 같은 2차원 배열에서 각 배열에는 시작 지점, 장애물 또는 갈 수 있는 지점을 "S", "X", "O" 로 입력된다. 또한 routes라는 1차원 String 배열에서 "E 2"와 같은 방향과 움직일 수를 입력된다. 출력으로는 마지막에 출력될 결과값으로는 모든 routes 배열의 입력력값을 수행 후 최종 좌표를 리턴하면 된다.
    주의할 점으로는 수행 중 "X"를 만나게 되면 그 전까지 가는 것이 아닌 수행을 하지 않는 것이다!

  • 내가 풀었던 풀이

    • 변수 선언
      변수는 가로와 세로의 길이, 시작지점을 저장하고 움직이는 현재의 상태를 초기화할 변수를 선언하고 초기화 했다.

    • 데이터 전처리
      2차원 String 배열로 입력받은 park 배열을 직접 이용하여 "S"를 움직여서 할 수 있지만 직관적이지 못하다고 생각하여 2차원 int 배열로 전처리를 진행하였다. S는 1, O는 0, 그리고 장애물 X는 -1을 각 배열에 값으로 대입했다. 입력받은 routes 또한 향상된 for문을 통해 route로 반복하였고 route는 split함수를 통해 방향(dir)과 정도(amount)로 나눠서 저장했다.

    • 주요 방향 움직임 로직
      E, S, N, W 4방향의 움직임 중 E 방향 움직임 로직만을 가져왔다. 각 방향은 if, else if, else로 조건에 맞게 각 로직을 수행하도록 했다. 로직은 간단한데 첫 번째 조건은 2차원 배열을 벗어났을 때, break를 걸어주는 것이다. 두 번째 조건은 장애물을 만났을 때, break를 걸어주는 것이고, 마지막 조건은 마지막 i 수행까지 배열을 벗어나지 않고 장애물을 만나지 않았으면 startX 변수를 i만큼 더해주는 것이다.


  • 내 풀이에 대한 고찰
    내가 푼 코드를 봤을 때 로직이 단순해서 이해하는데는 크게 문제가 없지만 반복적으로 if와 else if 그리고 else가 자주 사용되어 한 눈에 담기지 않을 것이라고 생각했다. 따라서 이 풀이를 어떻게 하면 다른 사람이 보고 쉽게 이해할 수 있을까? 라고 고민하다가 자바의 주요 특징인 객체지향 프로그래밍으로 현재 좌표를 나타내는 startX, startY 그리고 주요 로직을 캡슐화로 구현하면 다른 사람이 보고 이해하기 쉽겠다고 생각했다.

    • 데이터 숨기기
      좋은 객체 지향은 데이터와 메서드를 잘 숨겨야 한다고 공부했다. 따라서 다른 개발자가 이 클래스를 가지고 쓸 때 햇갈리지 않기 위해 데이터를 직접 사용하지 못하게 private로 숨겼다. 따라서 마지막에 결과값 반환을 위한 getStartX, getStartY 메서드를 생성하여 반환하도록 했다.

    • 생성자
      생성자는 solution 메서드에서 데이터 전처리하여 가공한 데이터를 입력받게 생성했다.

    • move 메서드
      move 메서드는 방향과 정도(amount)를 매개변수로 받아 클래스 안에 있는 방향 메서드로 가게 안내자 메서드로 작성했다.

    • 방향 메서드
      move메서드가 방향 메서드를 지정해주기 때문에 main 메서드에서는 방향 메서드를 직접 호출할 필요가 없다. 따라서 다른 개발자의 혼돈을 줄이기 위해서 private 접근 제어자를 사용했다. 로직은 이전 풀이에서와 같은 로직을 사용했다.

    • Solution 클래스
      메인 메서드에서의 사용의 다음과 같이 했다. 전처리 부분도 클래스 내부에 넣었어야 했나? 라는 생각이 들었지만, 그래도 기존 코드와 비교했을 때 클래스가 잘 캡슐화 되어있기 때문에 사용하거나 이해하는데 더 쉬울 것이라고 생각했다.


  • 전체 고찰

    이번 문제는 실무에서 하는 것과 같이 클래스를 캡슐화 시켜서 객체지향프로그램으로 구현해보자는 것이 이 문제를 다시 고찰하게 된 이유였는데 확실히 캡슐화를 시키니 캡슐화된 클래스를 보고 본문에 구현하는데 큰 도움을 주었다. 실무에서는 클래스를 만드는 파트, 만든 클래스를 활용하는 파트가 나누어져있다고 알고 있는데 왜 프로젝트를 객체지향프로그래밍으로 해야되는지 이유를 느낄 수 있었다.

전체 코드 : https://github.com/Vryez11/JVCS

profile
백엔드 개발자취

0개의 댓글