붕대감기 (PCCP 기출문제 1번)
붕대 감기 문제는 3개의 로직을 가지고 있다.
이렇게 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문을 사용하여 반복하도록 구현하였다.
결과값 리턴
내 풀이에 대한 고찰
고찰을 하게 된 이유
이 문제는 사실 그렇게 어려운 문제는 아니었다. 하지만 이 문제를 다시 생각해보고 고찰한 이유는 풀 때에는 몰랐으나 코드에 중복되는 부분이 많고 잘못된 조건이 있어 문제를 다시 생각하게 되었다.
중복되는 부분 제거
코드를 보면 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