코딩 개발/Java

코딩테스트 - [PCCP 기출문제] 1번 / 붕대 감기 (feat. Java)

호소세 2024. 4. 29. 09:44
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/250137

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[PCCP 기출문제] 1번 / 붕대 감기

 

문제는 url 누르면 들어가서 보실 수 있습니다.

충분히 문제를 읽어보고 풀이를 보시면 좋을 것 같습니다.

 

풀이

저의 풀이라서 완벽한 정답인지는 모르겠습니다.

반복문을 실행할 때 시작 index를 공격하는 시간부터 시작했습니다.

불필요한 붕대감기가 필요하지 않다고 생각했습니다. (풀피인데 포션 먹는 낭비)

 

	public int solution(int[] bandage, int health, int[][] attacks) {
		int answer = 0;
		int attackFirstTime = attacks[0][0];
		int attackLastTime = attacks[attacks.length - 1][0];
		int attackIdx = 1;
		int bandDurationTime = 0;
		int initHealth = health - attacks[0][1];
		
		// 죽었을 때
		if (initHealth <= 0)
			return -1;
		
		for (int i = attackFirstTime + 1; i <= attackLastTime; i++) {
			if (attacks[attackIdx][0] == i) { // 공격받을 때
				initHealth -= attacks[attackIdx++][1];
				
				// 죽었을 때
				if (initHealth <= 0)
					return -1;
				
				bandDurationTime = 0;
			} else { // 치료할 때
				bandDurationTime++;
				if (bandDurationTime == bandage[0]) {
					initHealth += bandage[1] + bandage[2];
					if (initHealth >= health)
						initHealth = health;
					bandDurationTime = 0;
				} else if (initHealth > health)
					initHealth = health;
				else {
					initHealth += bandage[1];
					if (initHealth > health)
						initHealth = health;
				}
			}
		}
		answer = initHealth;
		return answer;
	}
}

 

1. 첫 번째 공격 시간과 마지막 공격 시간

int attackFirstTime = attacks[0][0];
int attackLastTime = attacks[attacks.length - 1][0];

 

2. 몇 번째 공격인지 확인하는 index

int attackIdx = 1;

 

3. 붕대감기 연속 시간 및 처음 체력(첫 공격에 먼저 체력 깎기)

int bandDurationTime = 0;
int initHealth = health - attacks[0][1];

 

4. 처음 공격에 체력이 0 이하가 될 수 있습니다.

// 죽었을 때
if (initHealth <= 0)
	return -1;

 

5. 처음 공격시간 ~ 마지막 공격까지의 붕대감기와 공격 맞기 반복문

for (int i = attackFirstTime + 1; i <= attackLastTime; i++) {
	if (attacks[attackIdx][0] == i) { // 공격받을 때
		initHealth -= attacks[attackIdx++][1];
		
		// 죽었을 때
		if (initHealth <= 0)
			return -1;
		
		bandDurationTime = 0;
	} else { // 치료할 때
		bandDurationTime++;
		if (bandDurationTime == bandage[0]) {
			initHealth += bandage[1] + bandage[2];
			if (initHealth >= health)
				initHealth = health;
			bandDurationTime = 0;
		} else if (initHealth > health)
			initHealth = health;
		else {
			initHealth += bandage[1];
			if (initHealth > health)
				initHealth = health;
		}
	}
}

 

(1) 처음 공격시간 + 1부터 시작

(2) 공격을 받았은 시간인지 아닌지 판단

→ 공격을 받았다면 괴물의 공격력만큼 처음 체력 - 괴물의 공격력

→ 공격받고 체력이 0 이하가 되면 -1 return

(3) 붕대감기의 시간일 때

붕대감기 지속시간 + 1

    3-1. 붕대감기 지속시간이 붕대감기 시전시간이 같다면 초당회복 + 추가 회복하기

    3-2. 최대체력과 현재 체력이 같으면 회복하지 않기

    3-3. 붕대감기 지속시간이 붕대감기 시전시간과 같지 않다면 초당 회복만 하기

 

이런 식으로 코드를 작성했는데, 답안지 보니까 더 간단한 풀이가 있더라고요.

여러분도 여러분만의 코드를 작성하고 고수들의 코드를 분석해 보아요.

 

소감

이번 문제는 뭔가 더 재밌었습니다. 왜냐하면 제가 게임할 때 이런 생각을 했거든요. 나도 코드로 이런 함수는 짤 수 있을 텐데 라는 생각을 말이죠.

처음으로 게임 속의 함수를 만들어 본 것 같아서 굉장히 뜻깊었고 오래간만에 코딩 테스트 문제를 풀어서 신났습니다.

반응형