강의실/정보영재

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

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;

}


 


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


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



이 장소를 Daum지도에서 확인해보세요.
인천 서구 당하동 1028-2 장원프라자 502호
도움말 Daum 지도
6 0
  • 버블프라이스 2017.07.28 05:03 신고    

    대회를 준비하시는 분들께 유용한 글인
    것 같습니다^^ 오늘은 불금. 신나고 멋지게 보내시길 바래요-

    • 원당컴 2017.07.28 09:43 신고  

      버블프라이스님도 멋진 불금 되세요.^^

  • 몰드원 2017.07.28 07:41 신고    

    잘 보고 가네요~

  • 핑구야 날자 2017.07.28 08:23 신고    

    모르는 문제를 해결하는게 코딩의 매력이죠

    • 원당컴 2017.07.28 09:44 신고  

      네... 맞아요... 새로운 문제를 해결해 나갈때.. 그리고 그 문제의 정답이라고 success 나올때.. 그 짜릿함이 매력인것 같아요.