예전에 넥슨에서 주최하는 청소년 프로그래밍 챌린지를 소개해 드린적이 있습니다.
소개는 해 드렸는데 문제 유형을 몰라서 답답했었거든요.
오늘 들어가 보니 작년에 시험을 봤던 내용이 올라와 있네요.
그래서 한문제를 보고 그 문제를 분석해 봤어요.
문제는 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; }
|
샘플로 예제를 한번 만들어 보았네요...
혹시라도 도전하는 모든 학생들이 좋은 성과가 있었으면 하는 바램이 있네요...
'강의자료 > 정보영재' 카테고리의 다른 글
탁구공 12개 양팔저울만을 이용하여 불량공 1개 찾아내는 방법 (320) | 2017.08.04 |
---|---|
아이들에게 내 준 퀴즈 문제인데... 같이 한번 풀어 보시겠어요.^^ (310) | 2017.08.02 |
2017년 정보올림피아드 지역대회 초등 39번 문제 풀어 봅니다. (4) | 2017.07.18 |
2017년 정보올림피아드 예선 초등 22번 문제 분석 (6) | 2017.07.08 |
알고리즘 채점 사이트 정올(jungol.co.kr) 소개 (2) | 2017.06.23 |