본문 바로가기
컴퓨터/알고리즘

[SWEA] 11285. 다트 게임

by IT황구 2021. 2. 5.
728x90
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AXZuaLsqz9wDFAST&categoryId=AXZuaLsqz9wDFAST&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
typedef long long ll;
using namespace std;
//가장  바깥에 꽂힌경우 0점인것만 처리. 
int main(void)
{
	int size;
	int len;
	int posx,posy;
	float distance;
	int sum;
	float quot;
	int i_quot; 
	scanf("%d",&size);
	for(int i = 0; i < size; i++)
	{
		scanf("%d",&len);
		sum = 0;
		for(int x = 0; x < len; x++)
		{
			scanf("%d %d",&posx,&posy);
			distance = sqrt((float)(posx*posx) + (float)(posy*posy));	
			if(distance>200) continue;
			quot = distance/20; //실수 
			i_quot = (int)distance/20; // 정수 
			if(i_quot - quot == 0)
			{
				//1.0
				if(quot == 0){
					sum += 10;
					continue;
				}
				sum += 11 - quot;
			}else{
				//1.1
				sum += 10 - quot;
			}
			//0 1 2 3 4 5와 0.1을 구분해야함.. 
		}
		printf("#%d %d\n",i+1,sum);
	}
	return 0;
}

풀이방법은 2가지가 있었다. 풀이방법에 앞서 시행착오 먼저..

시행착오

1. 점수 계산법이 20.0 인 경우 r = 40으로 보는걸로 착각했다.

2. 0~200까지의 숫자에서 다중 if문 없이 실수,정수를 구분하는 방법에 대해서 생각을 하는데 30분이 넘게 걸렸다.

풀이법

1. 실수-정수 하면 되는데.. 하.. 이거때문에 기록을 한다.

20.0 40.0처럼 딱 떨어지는 경우 r = 20, 40으로 보는 코드 하나.

길이가 0 인경우 r = 20으로 보는 예외 하나.

그 외에는 20.1 같은건 r = 40 이런식으로 나오게 했다.

2. 배열에 미리 값을 담아두고 푸는방법.

[200*200,180*180,160*160,140...] 이런식으로 점수들을 담아두고

sqrt없이 그냥 x^2 + y^2 으로 해서

하나하나 비교하면서 찍어주는 방식이 있다.

=====END======

배열 값에 대한 하드 코딩 필요없이 어떤 범위라도 처리할 수 있다는것에 의의를 두고..

실수,정수 구분 완료

 

728x90
반응형