-
SWEA 4014번: [모의 SW 역량테스트] 활주로 건설Problem Solving/SWEA 2020. 5. 13. 23:44
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeW7FakkUDFAVH
백준의 경사로 문제와 똑같은 문제!!
제약사항 체크만 잘 해주면 풀 수 있당
경사로 문제의 알고리즘은 간단하다
1. 현재 칸과 다음 칸의 높이가 같은지 검사한다 -> 모두 일정하다면 count++
2. 다른 칸이 있다면 오르막길인지 내리막길인지 구한다
3. 오르막길이라면 cur부터 왼쪽으로 X칸을 높이가 같은지 검사하고, 아니라면 break
4. 내리막길이라면 cur+1부터 오른쪽으로 X칸을 높이가 같은지 검사하고, 아니라면 break한다. 칸을 오른쪽으로 X-1칸 이동한다
5. 3번과 4번 모두 배열 범위를 벗어나는지 함께 검사한다
6. 모든 행의 검사가 끝났다면 배열을 회전하여 다시 count를 시작한다
#include <cstdio> int tc,n,map[21][21],x; void rotate() { int temp[21][21]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) temp[j][n - 1 - i] = map[i][j]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) map[i][j] = temp[i][j]; } int main() { scanf("%d", &tc); for (int T = 1; T <= tc; T++) { scanf("%d%d", &n, &x); int ans = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) scanf("%d", &map[i][j]); for (int a = 0; a < 2; a++) { for (int i = 0; i < n; i++) { //행검사 bool check = true; bool road[21] = { 0 }; for (int j = 0; j < n-1; j++) { if (map[i][j] == map[i][j + 1])continue; int sub = map[i][j] - map[i][j + 1]; if (sub < -1 || sub>1||!check) { check = 0; break; } //높이차2이상 if (sub > 0) { //내리막길 for (int k = j + 1; k < j + 1 + x; k++) { if (k >= n || (map[i][j+1] != map[i][k])||road[k]) { //높이가 다르거나 범위 벗어나면 check = 0; break; } road[k] = 1; } if (check)j += x-1; else break; } else { for (int k = j; k > j - x; k--) { if (k < 0 || (map[i][j] != map[i][k]) || road[k]) { check = 0; break; } road[k] = 1; } } } if (check)ans++; } rotate(); } printf("#%d %d\n", T, ans); } return 0; }
'Problem Solving > SWEA' 카테고리의 다른 글
SWEA 4012번: [모의 SW 역량테스트] 요리사 (0) 2020.05.17 SWEA 4013번: [모의 SW 역량테스트] 특이한 자석 (0) 2020.05.17 SWEA 5644번: [모의 SW 역량테스트] 무선 충전 (0) 2020.05.13 SWEA 5650번: [모의 SW 역량테스트] 핀볼 게임 (0) 2020.05.11 SWEA 5648번: [모의 SW 역량테스트] 원자 소멸 시뮬레이션 (0) 2020.05.09