본문 바로가기

# 프로그래밍 개발/04. 알고리즘 문제풀이

백준 알고리즘 12756번 [고급 여관] 문제 풀이 코드 공개

반응형
백준 12756번 여관 문제 풀이코드 공개

문제

"럭키스톤"은 카드를 통해 대결하는 게임이다. 창식이는 럭키스톤을 자주 한다.

이 게임의 카드에는 공격력과 생명력이 표시되어있다. 왼쪽에는 공격력이, 오른쪽에는 생명력이 숫자로 적혀있다.

서로 꺼낸 카드를 비교하여 남길 카드를 결정하는 데, 카드의 비교는 다음과 같이 이루어진다.

  • 비교하는 카드의 공격력만큼 동시에 서로 상대 카드의 생명력을 깎는다. 줄어든 생명력은 다시 회복되지 않는다.
  • 생명력이 0 이하인 경우에는 카드는 죽은 상태로 전환된다.
  • 카드가 두 장 모두 남아있다면 비교를 계속한다.

요즘 따라 게임이 안 풀리는 창식이는 대전 전에 가능한 수를 미리 계산하여 최대한 이득을 챙기고 싶어 한다.

카드 2개의 공격력과 생명력이 주어지면 어떤 플레이어의 카드가 남아있을지 출력하는 프로그램을 작성해주자.

입력

첫째 줄에 플레이어 A가 꺼낸 카드의 공격력과 생명력이 주어진다.

둘째 줄에 플레이어 B가 꺼낸 카드의 공격력과 생명력이 주어진다.

카드의 공격력과 생명력은 100,000 이하의 자연수이다.

출력

플레이어 A의 카드가 남아있다면 "PLAYER A"를, 플레이어 B의 카드가 남아있다면 "PLAYER B"를 출력한다.

모두 죽은 상태라면 "DRAW"를 따옴표 없이 출력한다.

예제 입력과 출력 결과 이미지

출처

University > 전북대학교 > 2016 전북대 프로그래밍 경진대회 B번

  • 문제를 만든 사람: joonas

알고리즘 분류

 

전북대학교 경진대회에서 출시된 문제라니 새롭네요. 아. 새롭지는 않은가.. 옛날에 풀었던 문제이기 때문에 새롭지는 않은 것 같습니다. 하하.. 아무튼 요즘도 학교에서 프로그래밍 경진대회를 여는지는 잘 모르겠어요. 코딩 테스트가 기본 취업 준비 과정에 포함되니 아마도 포함되겠죠? 

문제 풀이 코드 제출 결과 이미지
흐음.. 이게 무슨 일인고.. 왜 이렇게 많이 틀렸을까요..?

#include<stdio.h>
#include<stdlib.h>
int main(){
  int a,b,c,d;
  scanf("%d %d %d %d",&a,&b,&c,&d);
  

  while(1){
	  b = b - c;
	  d = d - a;
	  if(b <0 || d < 0)
		  break;

  }

  if(b <0 && d <0)
	  printf("DRAW\n");
  else if(d == 0)
	  printf("PLAYER B\n");
  else 
	  printf("PLAYER A\n");
  
}

일단 틀린 코드입니다. 사칙연산 문제라서.. 쉬운 문제였을텐데 딱히 이상한 점은 보이지 않네요. 무엇이 틀렸던 것일까요? 이제 정답 코드를 보여드리겠습니다. 

#include<stdio.h>
#include<stdlib.h>
int main(){
  int a,b,c,d;
  scanf("%d %d %d %d",&a,&b,&c,&d);
  

  while(1){
	  b = b - c;
	  d = d - a;
	  if(b <=0 || d <= 0)
		  break;

  }

  if(b <=0 && d <=0)
	  printf("DRAW\n");
  else if(d <= 0)
	  printf("PLAYER A\n");
  else if(b <= 0)
	  printf("PLAYER B\n");
  
}

음... 0이 계산에 포함되는지 안 되는지 였네요. 제출 코드를 보니 같은 코드를 여러번 제출했네요. 아무래도 5년전의 저는 이 코드가 틀렸다는 것을 인정하고 싶지 않았던 것으로 보입니다. 

반응형