SWExpertAcademy의 회문1(1215 / D3) 문제이다.
[ 문제풀이 ]
1) 사실 이 문제의 풀이랄 것도 없이 모든 경우를 다 해보았다.
맵에 존재하는 모든 좌표점에서 문제의 조건에 맞는지를 판단해 보았다.
문제의 조건이라는 것은 다음과 같이 2가지로 나누어서 생각했다.
1. 현재 좌표에서 가로로 제시된 길이의 회문을 가지는지
2. 현재 좌표에서 세로로 제시된 길이의 회문을 가지는지
2) 현재 좌표에서 가로든, 세로든 회문인지 아닌지를 판단하는 방법으로는 직접 카운트 해보는 방법을 사용하였다.
예를 들어서 현재 좌표에 'A' 라는 문자가 있고, 제시된 길이가 5라고 가정해보겠다.
그리고 맵은 A B C B A ~ ~ 이런식으로 존재한다고 가정해보겠다.
그렇다면 먼저 시작점과 끝점을 찾는다.
시작점의 문자는 'A', 끝점의 문자는 'A'(가장 마지막에 있는 'A')가 될 것이다.
그리고 시작점의 문자와 끝점의 문자가 같다면 시작점++, 마지막점-- 를 시켜준다.
그렇게 되면 시작점의 문자는 'B', 끝점의 문자도 'B'가 될것이다.
이와 같이 반복하다가 시작좌표 > 끝좌표 가 되는 순간, 비교를 종료해주면 된다.
중간에 다를 경우에는 그 즉시 비교를 종료해주면 된다.
예를 들어서 A B C D A 가 있을 경우
시작점 = A, 끝점 = A 라서 시작점++, 끝점--를 해줄 경우,
시작점 = B, 끝점 = D가 된다. 즉 서로 다르기 떄문에 회문이 아니라는 것이고 이 즉시 비교를 종료해주면 된다.
[ 소스코드 ]
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #include<iostream> #include<cstring> #define endl "\n" #define MAX 8 using namespace std; int Len, Answer; char MAP[MAX][MAX]; void Initialize() { Answer = 0; Len = 0; memset(MAP, 0, sizeof(MAP)); } void Input() { cin >> Len; for (int i = 0; i < MAX; i++) { for (int j = 0; j < MAX; j++) { cin >> MAP[i][j]; } } } void Check_Garo(int x, int y) { int sx = x; int sy = y; int ex = x; int ey = y + Len - 1; bool Flag = false; while (1) { if (sy > ey) { Flag = true; break; } if (MAP[sx][sy] == MAP[ex][ey]) { sy++; ey--; } else { break; } } if (Flag == true) Answer++; } void Check_Sero(int x, int y) { int sx = x; int sy = y; int ex = x + Len - 1; int ey = y; bool Flag = false; while (1) { if (sx > ex) { Flag = true; break; } if (MAP[sx][sy] == MAP[ex][ey]) { sx++; ex--; } else { break; } } if (Flag == true) Answer++; } void Solution() { for (int i = 0; i < MAX; i++) { for (int j = 0; j < MAX; j++) { if(j + Len <= MAX) Check_Garo(i, j); if(i + Len <= MAX) Check_Sero(i, j); } } } void Solve() { int Tc = 10; for (int T = 1; T <= Tc; T++) { Initialize(); Input(); Solution(); cout << "#" << T << " " << Answer << endl; } } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ SWEA Code ] > # SWEA - ' 카테고리의 다른 글
[ SWEA 1228 / 1229 / 1230 ] 암호문 (C++) (0) | 2020.02.02 |
---|---|
[ SWEA 1216 ] 회문2 (C++) (0) | 2020.01.29 |
[ SWEA 1244 ] 최대상금 (C++)(2) (5) | 2019.11.15 |
[ SWEA 1242 ] 암호코드 스캔 (C++) (0) | 2019.11.15 |
[ SWEA 1240 ] 단순 2진 암호코드 (C++) (0) | 2019.11.15 |