몆 주 전부터 몇 명이 모여서 아주 간단한 코딩퀴즈를 하고 있습니다. 업무에 지장을 주면 안되기 때문에 쉬는시간에 풀 수 있는 수준의 문제여야 합니다. 즉 출제자가 생각하기에 총 1시간 미만(점심시간+저녁시간) 정도가 걸릴 것으로 예상되는 문제를 내야 하죠.

이번 문제는 again4you님이 내 주셨고, 다음과 같았습니다.
*과 -로 이루어진 M by N의 직사각형 지뢰밭 지도를 파일로부터 입력 받고, (M,N<10, *=지뢰, -=땅)
출력은 각 칸에서 인접한 지뢰가 있는지를 숫자로 나타내면 됨.
예를 들면, 아래와 같은 입력이 들어온 경우,
*---
----
-*--
----
결과는 다음과 같아야 합니다.
*100
2210
1*10
1110

언어는 C,C++,Java, python, bash shell 등 아무거나 써도 되지만,
문제 조건에 속도도 따진다고 하여 c로 결정했습니다. ㅠㅜ; (난 파이썬이 좋은데...)
시간나면 다른분들 답도 슬슬 살펴봐야겠습니다~~ :)

제 답은 다음과 같습니다.


  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6.     FILE* fp;
  7.     char buf[20];
  8.     char result[11][11];
  9.     int x,y,x1,y1, xLimit, yLimit;
  10.    
  11.     for(x=0;x<10;x++)
  12.         for(y=0;y<10;y++)
  13.             result[x][y]=48;
  14.  
  15.     y=0;
  16.     fp = fopen(argv[1], "rt");
  17.     while(fgets(buf, 20, fp)!=NULL) {
  18.         xLimit = strlen(buf);
  19.         // ignore whitespace;
  20.         if (buf[xLimit-1]=='\n') xLimit--;
  21.  
  22.         for(x=0;x<xLimit;x++){
  23.             if (buf[x]=='*'){
  24.                 result[y][x] = '*';
  25.                 // inc around
  26.                 for(y1=(y-1>=0)?y-1:0; y1<=y+1; y1++){
  27.                     for(x1=(x-1>=0)?x-1:0; x1<=x+1; x1++) {
  28.                         if (result[y1][x1]!='*') result[y1][x1]++;
  29.                     }
  30.                 }
  31.             }
  32.         }
  33.         y++;
  34.     }
  35.     fclose(fp);
  36.  
  37.     // print result
  38.     yLimit = y;
  39.     for(y=0;y<yLimit;y++){
  40.         for(x=0;x<xLimit;x++){
  41.             printf("%c", result[y][x]);
  42.         }
  43.         printf("\n");
  44.     }
  45. }
AND