구름톤 챌린지 2주 차 학습 일기 - 2
구름 이라는 곳에서 문제 풀이 챌린지(구름톤 챌린지)를 한다고 해서 참여 중이다. 이벤트 기간 동안 문제가 꾸준이 올라오며, 주에 2회씩 (혹은 그 이상) 챌린지 문제들에 대해 풀이가 가능한 문제들을 풀이해보고, 후기를 남겨보려고 한다.
구름톤 챌린지란?
구름 이라는 곳에서 문제 풀이 챌린지(구름톤 챌린지)를 한다고 해서 참여 중이다. 이벤트 기간 동안 문제가 꾸준이 올라오며, 주에 2회씩 (혹은 그 이상) 챌린지 문제들에 대해 풀이가 가능한 문제들을 풀이해보고, 후기를 남겨보려고 한다.
- 문제 푸는 곳: https://level.goorm.io/l/challenge/goormthon-challenge
- 학습 일기 작성 가이드: https://goorm.notion.site/5ad9e8eef00f4c19b083572c2000d7f8
- 풀이 사용 컨테이너(구름 컨테이너): https://goor.me/8jsC9vbx5TCeaCcRA
문제 풀이
- 문제 제목: 구름 찾기 깃발
- 문제 링크: https://level.goorm.io/exam/195689/%EA%B5%AC%EB%A6%84-%EC%B0%BE%EA%B8%B0-%EA%B9%83%EB%B0%9C/quiz/1
풀이 접근
PS를 하다보면 높은 확률로 마주치게 되는 전형적인 2차원 맵 탐색 문제. 보통 이런 유형은 dx, dy를 도입해서 각 방향을 편하게 순회한다. 그리고, 좋은 테크닉이 하나 있는데 경계선에 여유를 두라는 것이다. 예를 들어 구간의 배열을 쓰도록 하면 과 이 경계선이 되고, 이 경계선에는 을 채워두면 답에 변함이 없고(문제에 따라 다를 수는 있다), 탐색할 때 경계선 예외처리를 하지 않아도 돼서 구현이 훨씬 편해진다.
이러한 점만 잘 익히고 있다면 매우 쉽게 통과 가능한 문제이다. 집가서 간만에 지뢰찾기 해야지..
샘플 정답 코드
#include <stdio.h>
int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int dy[8] = {1, 1, 0, -1, -1, -1, 0, 1};
int map[1002][1002];
int main() {
int N, K; scanf("%d %d", &N, &K);
for(int y = 1; y <= N; ++y) {
for(int x = 1; x <= N; ++x) {
scanf("%d", &map[y][x]);
}
}
int ans = 0;
for(int y = 1; y <= N; ++y) {
for(int x = 1; x <= N; ++x) {
if (map[y][x] == 0) {
int ck = 0;
for(int k = 0; k < 8; ++k) {
if (map[y + dy[k]][x + dx[k]] == 1) ++ck;
}
if (ck == K) ++ans;
}
}
}
printf("%d\n", ans);
return 0;
}이전 사이트에서 옮긴 글입니다. 원래 주소