파리 퇴치 문제. 2차원 배열을 만들어야 하는데, 2차원 포인터로 동적할당을 사용하고 싶었다. 몇 개 풀어보니깐 2단계 문제는 알고리즘 자체가 어려운 건 없다. 다만 내가 C를 아직 능숙하게 사용하지 못해서 헷갈리는 부분이 좀 있다.
문제
N x N 배열 안의 숫자는 해당 영역에 존재하는 파리의 개수를 의미한다. M x M 크기의 파리채를 한 번 내리쳐 최대한 많은 파리를 죽이고자 한다. 죽은 파리의 개수를 구하라! |
풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <stdio.h> #include <malloc.h> int killCounter(char **array, int rowStart, int colStart, int m) { int killNum = 0; for (int i = rowStart; i < rowStart + m; i++) { for (int j = colStart; j < colStart + m; j++) { killNum += array[i][j]; } } return killNum; } int main() { int tc; scanf("%d", &tc); for (int t = 0; t < tc; t++) { int n, m, temp; int kill = 0; char **array; scanf("%d %d", &n, &m); array = (char **)malloc(sizeof(char*)*n); for (int i = 0; i < n; i++) { array[i] = (char*)malloc(sizeof(char)*n); for (int j = 0; j < n; j++) { scanf("%d", &array[i][j]); } } for (int i = 0; i < n - m + 1; i++) { for (int j = 0; j < n - m + 1; j++) { temp = killCounter(array, i, j, m); if (temp > kill) { kill = temp; } } } printf("#%d %d\n", t+1, kill); } return 0; } | cs |
표준입출력과 동적할당, <stdio.h>와 <malloc.h> 헤더를 호출한다.
배열의 x, y 포인트부터 mXm 크기의 박스 안에 있는 파리 개수를 세주는 killCounter() 함수를 만들었다.
rowStart, colStart는 제일 왼쪽 위 모서리의 좌표다. 5x5 크기 배열에 2x2 파리채를 rowStart=1, ColStart=1에 적용한다면 다음과 같을 것이다.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
array[i][j]를 i가 rowStart부터 rowStart+m까지일 때, 각각의 경우에 대해 j가 colStart부터 colStart+m까지 일 때 더해준다. 즉 위와 같은 예라면, (1,1), (1,2), (2,1), (2,2)의 좌표 내부의 값을 더해준다.
메인 함수 내부에는 테스트 케이스에 대해 배열을 만들고, killCounter() 함수를 가능한 모든 rowStart와 colStart에 대해 적용해 그 수를 비교한다.
kill=0으로 시작하고, 맨 처음 killCounter() 함수를 사용해 리턴된 값을 넣어준다. 이후 돌리는 killCounter() 함수의 리턴값은 kill 보다 크면 kill에 넣어주고, 아니면 버린다.
최종적으로 kill 변수 안에 들어있는 값을 출력한다.
'DEVELOP > Algorithm' 카테고리의 다른 글
[C] SW Expert Academy 문제풀이 :: 5431번 (0) | 2018.09.14 |
---|---|
[C] SW Expert Academy 문제풀이 :: 5356번 (0) | 2018.09.13 |
[C] SW Expert Academy 문제풀이 :: 1989번 (0) | 2018.09.12 |
[C] SW Expert Academy 문제풀이 :: 1970번 (0) | 2018.09.11 |
[C] SW Expert Academy 문제풀이 :: 2005번 (0) | 2018.09.07 |
[C] SW Expert Academy 문제풀이 :: 1926번 (0) | 2018.09.06 |
[C] SW Expert Academy 문제풀이 :: 2007번 (0) | 2018.09.05 |
[Python] 백준 알고리즘 문제풀이 :: 2108번 (0) | 2018.09.03 |