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

이지원·2024년 5월 4일
4

Java Coding Study

목록 보기
2/4

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

붕대감기 (PCCP 기출문제 1번)

  • 문제 설명

붕대 감기 문제는 3개의 로직을 가지고 있다.
  1. 1초 마다 회복을 주어진 량 만큼 한다.
  2. 시전시간이 t 연속으로 힐을 하면 y만큼 추가로 한다.
  3. 입력된 시간에 attack을 하고 연속된 힐은 멈추게 된다.

이렇게 3개의 로직을 가지고 있으며 입력되는 방식은 int[시전 시간, 초당 회복량, 추가 회복량] bandage, health(현재 체력), int[공격 시간, 피해량] attacks로 입력된다. 마지막으로 결과값은 마지막 공격이 끝났을 때 현재 체력을 반환하면 되는 문제이다.


  • 내가 풀었던 풀이
    • 코드 구현에 필요한 변수 선언

         int initHealth = health;  //초기 체력을 현재 채력으로 저장할 변수 설정
          int endTime = attacks[attacks.length-1][0]; //attacks의 배열의 크기를 통해 끝나는 시간 저장
          int[] attackTime = new int[endTime+1]; //attack 하는 시간 만을 attscks 2차원 배열에서 추출해서 저장
          int healTime = 0; //연속적인 회복 시간을 알기 위해 변수 설정
          int attackTemp = 0; //배열의 카운트를 위한 변수
      
    • 데이터 전처리

           //for문을 통해 tempTime 변수에 공격 시간을 저장하고 attackTime 인덱스에 1로 표현
           for (int i = 0; i < attacks.length; i++) {
               int tempTime = attacks[i][0];
               attackTime[tempTime]++;
           }

      int형 변수에 공격시간을 받아 attackTime 배열의 인덱스에 증감을 함으로써 공격시간을 확인

    • 주요 로직
      기본적으로 공격시간을 배열로 저장한 attackTime의 크기 동안 for문을 사용하여 반복하도록 구현하였다.

      • 공격안할 때
      • 공격할 때 생각나는 조건을 다 구현하다 보니 중복되는 부분이 많았다.
    • 결과값 리턴

      • 결과값을 0보다 작을 때와 클 때를 나누어 결과값을 if-else를 사용하여 리턴

  • 내 풀이에 대한 고찰

    • 고찰을 하게 된 이유

      이 문제는 사실 그렇게 어려운 문제는 아니었다. 하지만 이 문제를 다시 생각해보고 고찰한 이유는 풀 때에는 몰랐으나 코드에 중복되는 부분이 많고 잘못된 조건이 있어 문제를 다시 생각하게 되었다.

    • 중복되는 부분 제거
      코드를 보면 if (최대 채력이 현재 채력보다 작을 때)와 else (최대 체력과 현재 채력이 같을 때)에 중복으로 있어서 else 문 뒤에 한 번만 적으면 되겠다고 생각했다.
      위와 마찬가지로 if문과 else문에서 모두 사용되기 때문에 연속시간을 판단하기위한 변수 healTime을 if 문 앞에 한 번만 작성하면 되겠다고 생각했다.
      현재 상태보다 작을 때에는 return -1을하는 구문이다. 이는 for문 시작하자마와 return할 때 두 곳에 중복되어 사용되었는데 공격 받을 때에는 else문에 공격할 때 뿐이기 때문에 이는 else문에 넣어 중복을 피할 수 있다고 생각하여 수정했다.

    • 잘못된 조건 제거
      위에서 if 문의 조건으로 힐 할 때 힐량 보다 남은 힐량 보다 적을 때와 클 때를 나누어 실행하도록 하였지만 마지막 if에서 현재 체력이 최대 채력보다 클 때 현재 채력과 최대 채력을 같게 해주는 조건문이 있기 때문에 굳이 나눌 필요가 없다고 생각하여 위와 같이 줄일 수 있었다.


  • 실행 시간 비교 및 느낀점

    • Before

    • After

    코드 수정 전과 후의 차이는 미미하였지만 전코드는 코드 길이가 56줄이었던 반면에 수정 후 코드의 길이는 42줄로 14줄이나 줄일 수 있었다. 또한 수정 전 코드는 중복되는 부분이 많아 코드를 처음 본 사람이 이해하는데 어려움이 있었을 것이라고 생각되는 반면에 수정 후 코드는 한 번에 눈에 들어오는 코드라고 생각했다. 이렇게 같은 로직이지만 코드를 더 보기쉽게 짜는 것은 실무에서 큰 역량이라고 생각하기 때문에 앞으로도 코드를 간단하게, 한번에 보기 쉽게 짜기 위해 노력해야겠다고 느낀 문제였다.

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

profile
백엔드 개발자취

0개의 댓글