https://nypc.github.io/2016/daramg.html NYPC 2016 · 예선
옛날 옛적, 1996년에 출시된 "바람의 나라"에선 플레이어들이 이런 메세지를 외치곤 했다.
사냥터에 다람쥐가 모두 사냥당하는 동안에도 새로운 다람쥐가 생성되지 않으면, 어서 생성되기를 재촉하면서 플레이어들은 저런 메세지를 썼다.
2038년, 바람의 나라 출시 42년이 지나, 주모 왈숙은 사냥터에 다람쥐를 생성하는 규칙을 바꾸기로 하였다. DoD(DaramG on Demand)라 불리는 최첨단 기술을 통해 다람쥐가 적어도 플레이어 수보다 두 배가 되도록 유지해서 사람이 많을 때도 충분한 양의 다람쥐가 있게끔 하기로 했다.
가로 칸, 세로 칸으로 구성된 게임 화면에서 칸마다 캐릭터 또는 다람쥐가 있는지 주어질 때, 다람쥐가 모자란 지 판단해 모자란다면 필요한 다람쥐를 생성할 위치를 출력하는 프로그램을 작성하여라.
입력
첫 줄에 게임 화면의 크기 이 주어진다. 은 5 이상 20 이하이다. 다음 줄에 걸쳐 개의 문자가 공백 없이 주어진다. 문자는 다음 중 하나이다:
- D: 다람쥐가 있음
- C: 플레이어 캐릭터가 있음
- .: 빈칸임
출력
입력 형식에서 게임 화면을 출력한 것과 동일하게, 먼저 첫 줄에 N을 출력하고 그 다음 N줄에 걸쳐 N개의 문자를 공백 없이 사용하여 임의로 정한 다람쥐의 배치 상태를 출력한다. 문자는 D, C, . 중 하나가 되어야 한다.
새로운 다람쥐는 같이 D문자를 사용하며, 위치는 수만 만족하면 아무 곳이나 지정하여도 무방하다.
다람쥐가 모자라지 않으면 새로운 다람쥐를 생성하지 않고 입력된 내용을 그대로 출력해야 한다. 반면 다람쥐가 모자라다면 출력된 다람쥐의 수가 적어도 플레이어 수보다 두 배가 되도록 하여야 한다. 다람쥐 및 플레이어 캐릭터들은 서로 겹쳐있을 수 없다. 입력은 필요로 하는 다람쥐를 항상 생성할 수 있음이 보장된다.
예제 1
예제 1
입력
5
.....
.....
.C...
.....
.....
출력
5
D....
..D..
.C...
.....
.....
예제 2
입력
5
DD...
.D...
.D...
.DD..
.....
출력
5
DD...
.D...
.D...
.DD..
.....
다람쥐만 있는 경우에는 플레이어 수가 0이므로, 다람쥐가 모자라지 않다. 따라서 새로운 다람쥐를 만들어서는 안 된다.
나의 코드
#include <stdio.h>
int main()
{
int n, count = 0, player = 0; // 변수 선언후 초기화
int i, j;
char map[21][21]; // 배열 생성
scanf("%d", &n);
for(i=0;i<n;i++) { // 맵 입력받기
for(j=0;j<n+1;j++) {
scanf("%c", &map[i][j]);
if(map[i][j] == 'D') count++; // 다람쥐 카운터
if(map[i][j] == 'C') player++; // 플레이어 카운터
}
}
if(player == 0 || player*2 <= count) {
for(i=0;i<n;i++) // 플레이어의 2배만큼 다람쥐가 있는지
for(j=0;j<n+1;j++)
printf("%c", map[i][j]);
printf("\n");
printf("%d %d %d", player, count, count*2);
}
else {
int daramg = player*2 - count; // 다람쥐 계산
for(i=0;i<n;i++) {
for(j=0;j<n+1;j++) {
if(daramg <= 0) break;
if(map[i][j] == '.') { // 빈곳을 다람쥐로 채움
map[i][j] = 'D';
daramg--; // 다람쥐 -1
}
}
}
printf("\n");
for(i=0;i<n;i++) //출력
for(j=0;j<n+1;j++)
printf("%c", map[i][j]);
}
printf("%d %d %d", player, count, count*2); // 결과 출력
return 0;
}
풀이
1. 먼저 맵과 다람쥐, 플레이어의 위치를 받아서 배열에 저장후 값을 올리면서 수를 계산한다.
2. if문을 사용해 플레이어의 2배만큼의 다람쥐가 맵에 있는지 확인한다.
3. 있다면 결과를 출력하고 프로그램을 종료한다.
4. 아니라면 첫번째 배열부터 플레이어가 없는 빈곳을 다람쥐로 채우고 필요한 다람쥐 갯수를 -1한다.
5. 다람쥐가 충분하다면 다람쥐가 만들어진 맵을 출력하고 마지막 결과를 출력한다.
느낌점
여러가지 대회중 온라인에서 먼저 시작하는 NYPC가 열린다는 광고를 보아서 나도 한번 신청해봤다
또한 NYPC에서 좋은 성적을 이루기 위해서 여러가지 옛날에 출제했던 문제들을 하나씩 풀어보면서
아직도 어려운 점이 많다고 생각하였다.
하지만 이런 어려운 문제도 결국 푼다면 뿌듯한 기분과 성취감이 들었고
점점 알고리즘 실력이 늘어나는 기분이였다.
앞으로도 이런 대회가 있으면 참여를 하여 결과가 좋든 안좋든 내 자신의 실력을 키우기위해서
도전해볼것이다.
'알고리즘 공부 > 기타 C 언어 알고리즘' 카테고리의 다른 글
NYPC 2023 Round 1: 3번문제 (0) | 2023.10.22 |
---|---|
코드업 3129:올바른 괄호 2(C) (0) | 2023.10.03 |