2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

강의자료/정보영재

NYPC2016 예선문제]넥슨은 다람쥐를 뿌려라 문제 분석 해 봤어요.

원당컴퓨터학원 2017. 7. 27. 15:30

예전에 넥슨에서 주최하는 청소년 프로그래밍 챌린지를 소개해 드린적이 있습니다.

http://wondangcom.com/77


소개는 해 드렸는데 문제 유형을 몰라서 답답했었거든요.


오늘 들어가 보니 작년에 시험을 봤던 내용이 올라와 있네요.

그래서 한문제를 보고 그 문제를 분석해 봤어요.


문제는 https://www.nypc.co.kr/community/questionView.do?IDX=1 

위의 링크를 통해서 확인 해 보실 수 있습니다.


문제가 상당히 길고 게임을 응용해서 낸 문제라서 엄청 복잡해 보이네요.


하지만 게임을 좋아하는 학생들이라면 이런 류의 문제를 엄청 좋아 할것 같아요.


제가 이 문제를 직접 풀어 보거나 제출해 보지는 않아서 정확히 제가 분석한 풀이가 맞는지는 모르겠어요.


그냥 이 대회를 준비하는 학생이라면 한번 참고를 해 보는 의미에서 봐 두시면 좋을것 같아요.



문제의 의미는 다음의 예제를 통해서 말씀드리겠습니다.


사람은 C로 표현하고 다람쥐는 D로 표현 합니다.

게임을 할때 사람 인원수 보다 2배 더 많은 다람쥐를 넣어줘야 플레이어가 가서 다람쥐를 잡는 게임입니다.



문제 내용을 보면 사람보다 두배 더 많은 다람쥐를 생성하라는 문제 네요.


먼저 입력을 받으면서 D 이면 다람쥐수를 세고 C이면 사람수를 셉니다.


만약 다람쥐수가 사람수 * 2 보다 작으면 사람수*2-다람쥐 수 만큼 다람쥐를 생성해서 . 이 있는 위치에 D라고 써 넣으면 되는 아주 간단한 규칙입니다.


가령 출력예시 1에서

D를 (0,0)(1,2) 위치에 생성했는데 (0,0)(0,1) 위치에 생성해도 무관하다는 것입니다.


간단하게는 처음부터 지나가면서 .이 있으면 그 위치에 해당 갯수만큼 D를 써 넣으면 되는 것이거든요.


그렇게 되면 플레이어가 재미가 없을것 같아요... 한곳에서만 주구장창 나타날테니 그 위치(0,0) 근처에 있으면 움직이지도 않으면서 다람쥐를 잡을것 같네요...


c언어 같은 경우 rand() 함수를 이용해서 x,y 좌표를 들쑥 날쑥하게 생성해서 생성된 위치가 . 이면 입력 하는 방식으로 구현해 본다면 훨씬더 재미있는 소스가 될것 같다는 생각을 해 보게 되네요.^^



#include <iostream>

#include <stdio.h>

#include <stdlib.h> //srand

#include <time.h>   //time


using namespace std;


char _map[21][21]; //최대 20*20 개의 데이터가 들어 올수 있다.

int n;


//순차적으로 체크해서 가장 먼저 나오는 . 의 위치에 D를 입력하자.

void sequence_create()

{

    for(int i=0;i<n;i++)

    {

        for(int j=0;j<n;j++)

        {

            if(_map[i][j]=='.')

            {

                _map[i][j]='D';

                return;

            }

        }

    }

}


//위치가 제각각 나타나도록 생성해 보자

void randomize_create()

{

    srand((unsigned)time(NULL)); //srand로 랜덤 변수 초기화자.. 서로 다른 숫자가 나오도록

    while(1) //위치를 찾아서 셋팅하는 동안 계속 돌자.

    {

        int y=rand()%n;

        int x=rand()%n;

        if(_map[y][x]=='.')

        {

            _map[y][x]='D';

            return;

        }

    }


}


int main()

{


    int i,j;

    int squirrel_cnt=0,person_cnt=0;

    int creat_cnt;

    freopen("input.txt","r",stdin);

    scanf("%d",&n);

    //맵을 입력 받자

    for(i=0;i<n;i++)

    {

        for(j=0;j<n;j++)

        {

            scanf(" %c",&_map[i][j]);

            if(_map[i][j]=='D') squirrel_cnt++;

            else if (_map[i][j]=='C') person_cnt++;

        }

    }

    if(squirrel_cnt<person_cnt*2) //만약 다람쥐 수가 사람수의 2배가 안된다면 사람수 2배 만큼 생성하자.

    {

        creat_cnt = person_cnt*2 - squirrel_cnt;


        for(i=0;i<creat_cnt;i++) //다람쥐 생성 갯수만큼 생성하자.

        {

            //sequence_create();//여기는 순차적으로 생성한것

            randomize_create(); //여기는 뒤죽박죽 생성하는것

        }


    }

    //맵을 출력 하자

    for(i=0;i<n;i++)

    {

        for(j=0;j<n;j++) printf("%c",_map[i][j]);

        printf("\n");

    }


    return 0;

}


 


샘플로 예제를 한번 만들어 보았네요...


혹시라도 도전하는 모든 학생들이 좋은 성과가 있었으면 하는 바램이 있네요...



사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기