0. 개요

콘솔 화면에서 게임을 만들기 위해서는 콘솔 화면에 원하는 위치에 대상을 그릴 수 있어야 합니다.

 

이를 위해 만들 기본적인 함수 중 하나가 이번에 소개할 gotoxy 함수입니다.

 

 

1. 동작

gotoxy 활용

gotoxy함수를 사용하여 위와 같은 연출을 낼 수 있습니다.

 

1. 프로그램이 시작되고 아무 키나 입력 받는다

2. HELLO!, NICE!를 두줄에 걸쳐 출력한다.

3. 화살표를 통하여 H를 소문자로 바꾼다

4. HELLO!를 지우고 :) 이모티콘을 출력한다.

 

아래에 코드를 살펴보면서 위의 네가지의 동작을 분석해보겠습니다.

 

3. 코드 및 분석

#include<iostream>
#include<windows.h> //gotoxy를 위한 헤더 
#include<conio.h>   //_getch()를 위한 헤더

using namespace std;

void gotoxy(int x, int y) {
	COORD pos = { x, y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

int main(void) {
	printf("Press Any Key...");
	_getch();//키 입력을 대기합니다.
    
    /* HELLO!, NICE! 문자열을 출력 */
	gotoxy(10, 10);
	printf("HELLO!\n");
    
	gotoxy(10, 11);
	printf("NICE!\n");
    
	Sleep(1000); // 잠시 쉬었다가..
	gotoxy(8, 10); // HELLO 앞에 화살표 출력
	printf("→");
    
	Sleep(1000); //잠시 쉬었다가..
	gotoxy(10, 10); // 소문자로 변경
	printf("h"); // 문자열 위에 출력하면 덮어쓰기가 됨을 확인 가능.
    
	Sleep(1000);
    /* 공백을 활용하여 문자를 지움 */
	for (int x = 15; x > 9; x--) {
		gotoxy(x, 10);
		printf(" ");
		Sleep(500);
	}
    
    /* :) 이모티콘 출력 */
	gotoxy(10, 10);
	printf(":");
	Sleep(500);
	printf(")");
	Sleep(1000);
	gotoxy(20,20);
}

 

* COORD 구조체

 : short x, short y를 구조체 멤버로 가진 좌표 구조체 입니다.

 

* SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

 : 콘솔 마우스 커서의 위치를 조절하는 함수, 표준 출력 핸들을 통하여 x,y좌표를 가진 pos 구조체 위치로 이동합니다.

   표준 출력은 화면(콘솔)에 해당됩니다.

 

1. 프로그램이 시작되고 아무 키나 입력 받는다

-> _getch()를 활용하여 키 입력을 대기합니다.

-> _getch()는 입력받은 키의 값을 반환하는 함수입니다.

 

2. HELLO!, NICE!를 두줄에 걸쳐 출력한다.

-> gotoxy를 통하여 위치를 지정하여 출력합니다.

 

3. 화살표를 통하여 H를 소문자로 바꾼다

-> 출력된 화면 위에 출력한다면 교체된다.

 

4. HELLO!를 지우고 :) 이모티콘을 출력한다.

-> 연출의 방법 중 하나로 사용된다.

 

 

4. 정리

커서 이동 함수를 통하여 콘솔화면에 원하는 위치에 출력할 수 있는 gotoxy함수를 작성해 보았습니다.

또한 키의 입력을 대기 위하여 getch() 함수를 활용할 수 있는 것까지 확인했습니다.

0. 작업환경 준비

책에서는 아나콘다 배포판을 활용하여 강의를 진행합니다.

따라서 아나콘다 3버전을 설치하여 파이썬을 이용할 것입니다.

 

또한 파이참 에디터를 이용하여 이 책의 내용을 다루고자 합니다.

 

아나콘다 설치 : www.anaconda.com/

파이참 설치 : www.jetbrains.com/pycharm/download/#section=windows

 

파이참은 커뮤니티 버전을 이용했습니다.

 

0-1. cmd에서 python 입력하여 버전 확인

* cmd에서 python을 입력했는데 버전이 나오지 않고 MS 스토어가 나오는 경우가 있습니다.

( cmd에서 python을 입력했을 때 정상적으로 동작한다면 스킵하셔도 됩니다.)

 

 

이경우 다음과 같이 진행하면 해결이 됩니다.

 

1.  앱 실행 별칭에서 앱 설치 관리자 두개를 꺼줍니다.

 

2. 아나콘다가 설치된 경로를 확인하여 환경변수의 path값에 다음을 추가해줍니다.

저의 경우 로컬C에 anaconda 폴더를 만들어서 설치를 진행했기 때문에,

 

anaconda의 설치폴더 C:\anaconda

anaconda 폴더 안의 두개의 폴더 C:\anaconda\Library, C:\anaconda\Scripts

 

위의 세개의 경로를 환경변수에 추가합니다.

 

그러면 cmd에서도 정상적으로 python이 동작합니다.

 

0-2. 파이참 작업환경 셋팅

파이참 에디터를 사용하지 않으신다면 이부분은 넘어가도 괜찮습니다.

 

1. 먼저 File - Settings 순서로 들어갑니다.

 

2. 왼쪽 project : 프로젝트명 항목에서 python Interpreter를 선택합니다

3. 오른쪽 톱니바퀴를 눌러줍니다

그 후 선택항목중 add를 눌러줍니다.

 

4. 아나콘다를 추가합니다.

5. 위의 new environment를 선택하고 ok를 통하여 새로운 환경을 만들어준다면 셋팅 끝입니다.

 

 

1. 파이썬 인터프리터

파이참을 사용하신다면 하단의 터미널을 이용하여 쉽게 파이썬 인터프리터를 이용할 수 있습니다.

python을 입력하여 터미널에서 인터프리터를 실행시킵니다.

 

1-1. 파이썬은 산술연산을 지원합니다.

**은 거듭제곱 연산입니다.

3**2는 3^2와 같은 의미입니다.

 

1-2. type() 함수로 데이터의 자료형을 얻을 수 있습니다.

 

1-3. 파이썬은 변수의 자료형을 명시하지 않아도 됩니다.

동적 언어의 특성을 가지고 있는 모습입니다.

 

1-4. 리스트

다른 언어의 배열과 비슷한 자료형입니다.

다만 파이썬은 슬라이싱을 지원합니다.

[ : ] 를 통하여 원하는 범위 내의 값만 가지고 올 수 있습니다.

재미있는건 a[::-1]를 통하여 배열을 뒤집을 수도 있다는 점입니다.

 

1-.5 딕셔너리

key와 value가 한쌍으로 묶인 딕셔너리 또한 지원합니다.

 

1-6. bool

참과 거짓을 가지는 자료형 bool을 지원합니다.

재미있는 사실은 파이썬에서는 논리 연산을 기호가 아닌 문자로 표현한다는 점입니다.

&& -> and

|| -> or

! -> not

 

1-7. if문

비슷하게 if문을 지원합니다.

조건에 괄호를 치지 않아도 되고 if의 몸체 부분은 중괄호가 아닌 : 와 들여쓰기로 구분됩니다.

터미널은 들여쓰기를 자동으로 안해주니까 들여쓰기를 한번 해주셔야합니다..

 

1.8 for문

for문입니다.

다른 언어와 다르게 리스트에서 뽑아쓰는 반복문을 자주 사용하는 듯 합니다.

이때 유용하게 사용되는 range 또한 알고 계시면 좋겠습니다.

 

 

1.9 함수

파이썬은 자료형을 명시하지 않기때문에 함수 또한 반환형을 명시하지 않습니다!

def 키워드를 이용하여 함수를 정의해줍시다.

위와 동일하게 중괄호는 : 와 들여쓰기로 대체됩니다.

 

2. 스크립트 파일 작성

긴 작업을 하게 된다면 인터프리터로는 한계가 있습니다.

따라서 파일을 작성하는 것을 한번 해보고자 합니다.

 

2-1. 파일 작성 및 실행

1. hungry.py 파일을 먼저 작성합니다.

 

2. 터미널로 이동하여 python 명령어를 이용하여 hungry.py 파일을 실행시킵니다.

 

2-2. 클래스

클래스는 사용자 정의 자료형이라고 생각할 수 있습니다.

1. 다음과 같이 man.py 파일을 만들어 클래스를 작성합니다.

파이썬은 특이하게도 클래스 안의 메서드에 대하여 첫 번째 인자는 무조건 self로 고정되게끔 되어 있습니다.

 

또한 __init__ 함수는 클래스의 생성자로써 클래스가 생성될 때 처음 실행하는 함수입니다.

 

 

실행하면 다음과 같은 결과를 얻을 수 있습니다.

3. 넘파이

3-0. 넘파이 라이브러리 설치

넘파이를 다루기 앞서 파이참의 터미널 환경에서 인터프리터를 실행시킬 때에는 numpy 라이브러리가 없습니다.

파이참은 아나콘다를 사용하고 있으나 터미널 환경에서는 그렇지 않기 때문입니다.

 

따라서 간단한 명령어를 통하여 터미널 환경에서도 numpy를 활용할 수 있도록 해줍시다.

 

 

pip를 이용하여 설치할 것입니다.

다음의 명령어를 입력한다면 numpy 라이브러리가 설치 됩니다.

 

pip install numpy

 

이제 터미널 환경에서도 numpy를 사용할 준비가 되었습니다.

3-1. 넘파이 import 및 생성

넘파이를 가지고 오기 위해서는 import문이 필요합니다.

다음과 같은 코드를 활용하여 넘파이 라이브러리를 import 합니다.

 

import numpy as np

 

as는 C에서의 typedef와 같은 맥락입니다.

numpy가 너무 기니까 np로 표현하겠다는 것입니다.

 

넘파이는 다음과 같은 방식으로 생성할 수 있습니다.

 

x = np.array([1.0, 2.0, 3.0])

 

print와 type을 통하여 numpy 배열이 잘 생성됨을 확인할 수 있습니다.

 

3-2. 넘파이 산술 연산

넘파이 배열 y를 추가로 선언해주고 사칙연산을 실행해봅니다.

각 원소별로 연산이 이루어지는 것을 확인할 수 있습니다.

 

또한 배열과 배열 뿐만 아니라 배열과 스칼라 값으로 조합된 산술 또한 가능합니다.

 

이 기능을 브로드캐스트 기능이라고 부릅니다.

 

3-3. 넘파이의 N차원 배열과 브로드캐스트

넘파이 배열은 다차원 배열을 지원합니다.

2차원 배열로써 선언을 한다면 행렬로써 취급됩니다.

데이터 타입을 살펴볼 수도, 행렬의 모양을 볼 수도 있습니다.

또한 * 연산을 살펴보면 행렬 곱의 형태로 연산이 진행되는 것을 확인할 수 있습니다.

 

넘파이는 형상이 다른 배열끼리의 계산 또한 지원합니다.

이를 브로드캐스트 기능이라고 합니다.

 

[ 1, 2 ]           [ 10, 20 ]

[ 3, 4 ]     *     [ 10, 20 ]

 

위와 같은 형태로 형상이 다르더라도 배열이 확장되어 계산이 이루어지는 것을 확인할 수 있습니다.

 

3-4. 원소 접근

 

원소 접근에 대하여 재미있는 기능이 존재합니다.

X[0]과 같은 식으로 해당 row에 대하여 접근이 가능합니다.

또한 반복문을 사용하여 출력하는 것 또한 가능합니다.

flatten을 이용하여 1차원 배열화 시킬 수 있고,

X의 인덱스 값으로 다시 numpy 배열을 줌으로 배열값에 해당하는 인덱스의 값을 가져올 수도 있습니다.

 

4. matplotlib

4-1. matplotlib?

matplotlib 라이브러리는 그래프를 그려줍니다.

데이터의 시각화를 위하여 사용합니다.

 

4-2. 단순한 그래프 그리기

 

matplotlib.pyplot을 import하여 sin 함수를 그려봅시다.

범위는 0에서 6까지, 0.1의 간격을 가지는 범위를 설정합니다.

이후 y값을 x의 sin함수값으로 설정한 뒤 plot을 활용하여 sin 함수를 띄웁니다.

 

4-3. pyplot의 여러가지 기능

sin 함수 뿐만 아니라 cos 함수 또한 표현을 했습니다.

각각의 그래프에 label을 달아 구분 가능하도록 하였으며 선의 모양 또한 다르게 설정했습니다.

왼쪽 하단을 보면 legend를 통하여 각 그래프의 라벨 이름이 표시되는 것을 알 수 있습니다.

x, y축에도 각각 라벨을 달고 sin & cos이라는 이름까지 붙여줬습니다.

당장에는 쓸일이 없어보여 필요하게 된다면 다시 한번 보지 않을까 싶습니다.

 

4-4. 이미지 표시

 

matplotlib.image 모듈의 imread() 메서드를 활용하면 이미지를 띄울 수 있습니다.

 

* 들어가는말

 

컴퓨터 시스템의 시작의 마지막 포스팅이다.

 

1장에서는 컴퓨터에 대한 전반적인 이해를 서술하기 때문에 복잡한 면이 있을것이라 생각한다.

 

하지만 시작부터 모든것을 배운다기보다는 그냥 이런게 있다 싶은 정도로만 이해하고 넘어가면 될 듯 하다.

 

나머지 부분은 뒤에서 세세하게 다룰 수 있기 때문이다.

 

8. 네트워크

 

네트워크는 상당히 복잡하다.

 

외부 요인이 상당히 얽혀있고 어느부분이 문제점인지 쉽사리 판별하기 힘든 분야이다.

 

하지만 네트워크 또한 컴퓨터의 입장에서 보면 입출력 장치의 하나로 볼 수 있다.

 

네트워크의 간략화

 

  • 우리가 가진 컴퓨터의 메인메모리에서 바이트 정보를 네트워크를 통하여 전달한다.
  • 네트워크를 통하여 다른 컴퓨터의 메인메모리에 바이트 정보가 복사된다.
  • 이러한 과정이 네트워크이다.

간단하게 살펴보니 네트워크라는 것도 별 어려움이 없다고 생각들지 않는가?

 

컴퓨터가 표현하는 0과 1의 정보를 그저 입출력 장치를 활용하여 복사하여 전달할 뿐이다.

 

우리는 이런 과정을 통하여 e-mail, web 등 많은 서비스를 이용하고 있다.

 

9. Amdahl의 법칙

 

Amdahl 법칙은 다음과 같은 내용을 답고 있다.

 

  • 시스템의 개선은 성능에 얼마나 큰 영향을 미치는가?

이를 위하여 'Gene Amdahl'이 직관적인 계산식을 제시했다.

먼저 정의를 짚고 넘어가보자.

Told : 기존 시스템에서 소요되는 시간

알파 : 개선하고자 하는 것이 전체 시스템에서 담당하는 비율

k : 개선 비율

 

여기서 특정한 부분을 개선한다고 생각하고 계산식을 짚어 넘어가보자.

1. Told * a : 특정 부분이 기존에 소모되는 시간이다.

2. Told * a / k : 개선을 하고 난 뒤의 소모되는 시간이다.

3. Tnew : 아직 개선되지 않은 (1-a)Told와 개선된 a*Told/k를 더한 값이 최종적으로 수정된 소모시간이다.

4. S : Told와 Tnew를 나누어 개선된 비율을 살펴본다.

 

 

여기서 눈여겨 볼 사항은 다음과 같다.

전체 시스템에서 60%의 영향력을 미치는 부분의 성능을 3배 향상시켰다고 가정해보자.

위의 계산식을 이용하면 단지 1.67배 정도의 성능 향상이 이루어졌다.

 

생각보다 큰폭으로 향상되지 않음을 의미한다.

 

즉, 어떠한 시스템의 성능을 대폭 향상시키기는 상당히 어려움을 보여준다고 할 수 있다.

 

10. 동시성과 병렬성

 

성능 개선을 위하여 대표적으로 가지는 특징들이 동시성과 병렬성이다.

 

동시성 : 여러개를 한번에 처리하는 능력

병렬성 : 동시성을 이용하여 빠르게 동작을 수행한다.

 

이는 멀티프로세서 시스템으로 컴퓨터에 구현이 되었으며

최근에는 하이퍼 쓰레딩이라는 기법을 이용하여 성능이 더 좋아졌다.

 

이러한 동시성과 병렬성을 직관적으로 확인할 수 있는것이 윈도우이다.

 

윈도우에서 우리는 웹서핑을 하면서 노래를 듣고 때로는 게임도 틀어놓는다.

 

이렇듯 한 윈도우에서 여러개의 작업이 이루어지도록 하는 것이 동시성과 병렬성의 예시이며, 

컴퓨터 성능에 큰 영향을 미치는 요인이다.

 

 

11. 컴퓨터 시스템의 추상화

 

컴퓨터 시스템에서는 추상화가 매우 중요하다.

 

이는 복잡한 문제를 단순화 시킬 수 있는 도구이다.

 

예를 들자면,

 

우리는 파일을 통하여 입출력장치를 추상화하고,

가상 메모리를 통하여 프로그램 메모리를 추상화하고,

실행중인 프로그램을 통하여 프로세스를 추상화한다.

 

이렇듯 컴퓨터에 있어서 중요한 개념중 하나가 추상화이다.

 

 

12. 정리

우리는 다양한 정보들을 훑어봤다.

 

컴퓨터는 하드웨어와 시스템 소프트 웨어로 구성되었다.

컴퓨터는 정보를 비트들의 그룹으로 표현한다.

컴파일러와 링커를 통하여 실행파일이 생성된다.

컴퓨터는 계층적인 구조를 이루고 있다.

운영체제는 하드웨어와 응용프로그램 사이의 중간자 역할을 수행한다.

 

이제 한번씩 훑어봤으니 좀 더 자세한 컴퓨터의 세계로 나아가보자.

 

 

 

'Computer System' 카테고리의 다른 글

1. 컴퓨터 시스템의 시작(2)  (0) 2021.01.04
1. 컴퓨터 시스템의 시작(1)  (0) 2020.12.28
더보기

(문제보기)

동전 0 성공분류

 

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초 256 MB 42623 22717 17971 53.129%

문제

준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.

동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)

둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

출력

첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

예제 입력 1 복사

10 4200 1 5 10 50 100 500 1000 5000 10000 50000

예제 출력 1 복사

6

예제 입력 2 복사

10 4790 1 5 10 50 100 500 1000 5000 10000 50000

예제 출력 2 복사

12

 

1. 문제 분석

 

주어진 동전으로 최소한의 동전 갯수를 활용하여 주어진 금액을 맞추는 문제이다.

 

이 문제는 간단하게 주어진 금액을 가장 큰 수부터 계속해서 빼내면 해결된다.

 

 

2. 소스코드

#include<iostream>
using namespace std;

int main(void){
    int N, K;
    int arr[N];
    cin>>N>>K;
    int count = 0;
    
    for(int i=0; i<N; i++)
        cin>>arr[i];
    
    int cur = N-1;
    
    while(K != 0){
        if(arr[cur]>K) cur--;
        else{
            count++;
            K -= arr[cur];
        }
    }

    cout<<count<<endl;
        
    return 0;
}        

0. 들어가기

 

 

우리는 앞선 시간에 스택과 큐에 대해서 공부했다.

이를 구현하기 위하여 배열과 연결리스트에 대해서 배웠고, 우리는 스택, 큐 구조를 구현했다.

 

스택과 큐의 경우 데이터를 한줄로 표현이 가능한 선형 구조에 해당했다.

 

이제 우리가 배워볼것은 계층을 가진 비선형구조, 트리에 대하여 배워 볼 것이다.

 

1. 트리의 기본 개념

 

 

 

트리의 경우 위와 같이 생겼다.

각 노드가 계층에 따라 갈라지는 모습을 하고있는 것이 나무를 반대로 세워놓은 것과 비슷해서 트리라는 이름이 붙여졌다.

그렇기 때문에 최상위에 있는 노드를 root node라고 부른다. 이와 마찬가지로 최하위에 있는 노드를 leaf node라고 부른다.

  • tree 구조의 이름은 나무를 뜻하는 tree에서 가져왔다.
  • 최상위 노드를 root node, 최하위 노드를 leaf node라고 부른다.

 

그럼 이번에는 각 노드간의 관계를 살펴보자.

같은 level에 존재하는 노드들을 형제노드(sibling)이라 부르고 자신의 하위에 있는 노드를 자식노드(children)이라고 부른다. 같은 맥락으로 자신의 상위에 있는 노드를 부모노드(parent)라고 부른다. 또한 자신의 상위에 있는 노드'들'을 조상(ancestor)이라 부른다. 

 

  • 자신과 같은 레벨의 노드를 형제노드(sibling)이라 부른다.
  • 자신의 하위노드를 자식노드(children)이라 부른다.
  • 자신의 상위 노드를 부모노드(parent)이라 부른다.

 

이번에는 트리의 전체적인 구조를 살펴보자.

트리를 구성하는 일부분의 트리를 subtree 라고 부른다. 또한 그림에는 표시가 안되있으나 subtree의 집합을 forest라고 하며, 트리는 level으로 층이 분류가 되며, 트리의 가장 높은 level이 높이(height)가 된다.

  • 트리를 구성하는 일부분의 트리를 subtree라고 한다.
  • subtree의 집합을 forest라고 한다.
  • 트리의 각 층은 level로 분류되며 가장 높은 level은 높이(height)가 된다.

트리의 기본은 이정도만 하고 가도 충분할 것 같다.

 

 

2. 이진트리 (binary tree)

 

그럼 자세한 트리를 만나볼 시간이다.

 

이번에 만날 트리는 이진트리, 즉 바이너리트리이다.

 

바이너리 트리는 왼쪽 자식과 오른쪽 자식, 두개의 자식만 갖는 트리이다.

즉, 좌측 노드와 우측 노드를 나눈다는 것에 의의가 생기는 구조이다.

 

이러한 바이너리 트리는 노드가 채워진 모양에 따라 다양하게 분류 될 수 있다.

full binary tree, complete binary tree,  등이 존재한다.

이들은 크게 중요한 개념이 아니므로 개인적으로 찾아보면 좋겠다.

 

다만 정말 중요한 개념은 다음의 것이다.

 

편향 트리, 경사트리라고도 하는 skewed tree의 모양이다.

노드가 한쪽 방향으로 치우쳐져있는 것을 볼 수있다.

 

이것이 트리의 단점인데, 데이터가 한쪽으로 치우칠경우 큐나 스택같은 선형구조와 다를게 없으며, 혹은 더 나쁜 상태가 된다.

 

따라서 이를 해결하기 위한 개념이 필수적인데 그것이 balanced tree 이다.

각 트리의 높이 차이를 제한을 둬서 최대한 균형을 맞춰보겠다는 의미이다.

 

3. 마무리

우리는 이제 선형구조에서 비선형 구조로 나아가는 첫걸음을 내딛었다.

다음시간에는 트리에서 사용되는 연산과 구현에 대해서 이야기 하자.

'자료구조 및 알고리즘 > C' 카테고리의 다른 글

C - 스택/큐의 응용  (0) 2021.01.21
C - 큐(Queue)의 기본 구현  (0) 2021.01.12
C - 스택(Stack)  (0) 2021.01.11
C - 연결 리스트(Linked List)  (0) 2021.01.11
C - 배열을 활용한 자료구조  (0) 2021.01.10

(문제보기)

더보기

택시 기하학 성공스페셜 저지출처다국어분류

한국어   

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초 128 MB 25522 10219 8800 39.552%

문제

19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다.

택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다.

D(T1,T2) = |x1-x2| + |y1-y2|

두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다.

따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다.

원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합

반지름 R이 주어졌을 때, 유클리드 기하학에서 원의 넓이와, 택시 기하학에서 원의 넓이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 반지름 R이 주어진다. R은 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄에는 유클리드 기하학에서 반지름이 R인 원의 넓이를, 둘째 줄에는 택시 기하학에서 반지름이 R인 원의 넓이를 출력한다. 정답과의 오차는 0.0001까지 허용한다.

예제 입력 1 복사

1

예제 출력 1 복사

3.141593 2.000000

예제 입력 2 복사

21

예제 출력 2 복사

1385.442360 882.000000

예제 입력 3 복사

42

예제 출력 3 복사

5541.769441 3528.000000

 

1. 문제 분석

 

사실 수학 파트는 어려운 문제가 없어서 풀기만하고 포스팅은 하지 않으려고 했는데 재미있는 문제가 있어서 가지고왔다.

 

두 점 사이의 거리를 문제에서는 다음과 같이 정의한다.

 

  • D(T1,T2) = |x1-x2| + |y1-y2|

이 외에는 유클리드 기하학 즉, 우리가 알고있는 x, y축의 평면과 동일한 조건이다.

 

여기서 반지름 R이 주어졌을 때 유클리드 기하학에서의 원의 넓이와 택시 기하학에서의 원의 넓이를 구하는 문제이다.

 

대강 r=1 에서의 택시 기하학의 원을 그려보면 다음과 같아진다.

택시 기하학에서의 원은 한가지만 생각하면 된다.

x와 y 각각의 차이의 절댓값을 더한 값이 일정해야한다.

위의 조건을 쉽게 만드려면 (0, 0)을 중심으로 생각하고 x, y 좌표를 절대값 취해서 더해준 값이 일정해야한다는 뜻이 된다.

따라서 각 사분면마다의 간단한 일차방정식이 만들어지고(x, y절대값 합이 반지름 값이되도록 서로 일정하게 반비례하기 때문에) 결국에는 마름모 모양의 도형이 생겨나게 되는데 이가 택시 기하학에서의 원의 모양이다.

 

 

결국 위의 모양이 택시 기하학에서의 원이 되는것이고 이렇게 되면 문제는 매우 간단해진다.

 

원의 넓이와 마름모의 넓이를 출력하면 되는 문제가 된다.

 

 

2. 소스코드

#include<iostream>
#include<math.h>
#define PI 3.14159265359

using namespace std;

int main(void) {
	double r;
	cin >> r;

	double pow_r = pow(r, 2);
	
	printf("%.6lf\n%.6lf\n", pow_r * PI, pow_r * 2);
	return 0;
}

 

 

주의할 점은 PI의 값을 조금 정확하게 넣어줘야한다.

 

정답과의 오차는 0.0001까지 허용하고, 근사값을 구하는 소수 연산인 만큼 값의 설정을 정학하게 해줘야하는 모양이다.

 

처음에 3.14를 넣었는데 틀리길래 바로 PI를 좀더 길게 나열했더니 맞았다.

'백준 온라인 저지 - 단계별로 풀어보기 > 기본 수학2' 카테고리의 다른 글

1929 - 소수 구하기  (0) 2021.01.08
11653 - 소인수분해  (0) 2021.01.08
2581 - 소수  (0) 2021.01.08
1978 - 소수 찾기  (0) 2021.01.08

+ Recent posts