Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- kb it's your life 기자단
- 멀티캠퍼스
- KB국민은행
- 전문가특강
- 백엔드개발
- 데이터분석자격증
- kb 기자단
- 빅분기필기
- 금융권 it
- autohotkey
- 빅분기
- kb 취업교육
- 첫알고리즘평가
- prefixsum #C언어
- 반별이벤트
- 금융권 부트캠프
- 금융권it
- 이차원배열
- 부트캠프
- kbit교육
- 백엔드개발교육과정
- sql
- sql내장함수
- 빅데이터분석기사
- SQL데이터타입
- kb it's your life
- kb it's your life 6기
- kb취업교육
- 빅데이터분석기사필기
- kb네트워킹캠프
Archives
- Today
- Total
지식보부상님의 공부 일지
SWEA 2001번: 파리 퇴치 본문
N x N 배열 안의 숫자는 해당 영역에 존재하는 파리의 개수를 의미한다. 아래는 N=5 의 예이다. ![]() M x M 크기의 파리채를 한 번 내리쳐 최대한 많은 파리를 죽이고자 한다. 죽은 파리의 개수를 구하라! 예를 들어 M=2 일 경우 위 예제의 정답은 49마리가 된다. ![]() [제약 사항] 1. N 은 5 이상 15 이하이다. 2. M은 2 이상 N 이하이다. 3. 각 영역의 파리 갯수는 30 이하 이다. [입력] 가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다. 각 테스트 케이스의 첫 번째 줄에 N 과 M 이 주어지고, 다음 N 줄에 걸쳐 N x N 배열이 주어진다. [출력] 출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다. (t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.) |
prefix sum algorithm을 이용한 결과 코드
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 15
#define COMPARE(x, y)( x>y?x:y)
//using prefix sum algorithm
int main() {
int N, M, T;
int i, j, k;
int max = 0, fly_num = 0;;
int matrix[MAXSIZE][MAXSIZE] = { 0, };
int presum[MAXSIZE + 1][MAXSIZE + 1] = { 0, };
scanf("%d", &T);
for (i = 0; i < T; i++) {
scanf("%d %d", &N, &M);
//construct N*N matrix
for (j = 0; j < N; j++)
for (k = 0; k < N; k++)
scanf("%d", &matrix[j][k]);
//construct (N+1)*(N+1) prefix sum matrix
for (j = 0; j < N; j++) {
for (k = 0; k < N; k++) {
presum[j + 1][k + 1] = presum[j + 1][k] + presum[j][k + 1] + matrix[j][k] - presum[j][k];
}
}
//find number of flies
for (j = M; j < N + 1; j++) {
for (k = M; k < N + 1; k++) {
fly_num = presum[j][k] - presum[j - M][k] - presum[j][k - M] + presum[j - M][k - M];
max = COMPARE(max, fly_num);
}
}
printf("#%d %d\n", i + 1, max);
max = 0;
}
return 0;
}
무식하게 brute force 방식으로 구한 결과코드
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 15
#define COMPARE(x, y)( x>y?x:y)
//using prefix sum algorithm
int main() {
int N, M, T;
int i,j,k,l,m;
int max = 0, fly_num = 0;
int matrix[MAXSIZE][MAXSIZE] = { 0, };
int presum[MAXSIZE + 1][MAXSIZE + 1] = { 0, };
scanf("%d", &T);
for (i = 0; i < T; i++) {
scanf("%d %d", &N, &M);
//construct N*N matrix
for (j = 0; j < N; j++)
for (k = 0; k < N; k++)
scanf("%d", &matrix[j][k]);
for (j = 0; j <= N-M; j++) {
for (k = 0; k <= N-M; k++) {
for (l = 0; l < M; l++) {
for (m = 0; m < M; m++) {
fly_num += matrix[l + j][m + k];
}
}
max = COMPARE(max, fly_num);
fly_num = 0;
}
}
printf("#%d %d\n", i+1, max);
max = 0;
}
return 0;
}
둘의 채점 결과 차이가 크지 않은데, 이는 배열의 크기가 작아서 그런 듯 합니다.
아무래도 배열 크기가 커질수록 prefix sum algorithm을 이용한 방식이 훨씬 효율적이겠죠!
'C언어 문제풀이' 카테고리의 다른 글
SWEA 1979번: 어디에 단어가 들어갈 수 있을까 (0) | 2023.11.06 |
---|---|
SWEA 1959번: 두 개의 숫자열 (4) | 2023.11.06 |
SWEA 1961번: 숫자 배열 회전 (1) | 2023.11.06 |
백준 10845번: 큐 (1) | 2023.04.21 |
백준 10773번: 제로 (0) | 2023.04.21 |