반응형
문제 출처 :
https://www.acmicpc.net/problem/1652
알고리즘 분석 :
문제 해결에 필요한 사항
1. Simulaton
2. while문에서의 조건 순서
이 코드는 주석없이 간단히 해결 할 수 있으리라 생각한다.
가로로 .이 2개 있으면 그 뒤로 X가 나오기 전까지 .을 계속무시해주고
세로도 마찬가지로 이러한 방식을 이용한다.
while (getchar() != '\n') {} 이 코드의 의미는 cin 에서 어떤 문자를 치고 개행을 하면
getline에서 개행을 바로 인식해버리므로 한줄이 바로 넘어간다.
따라서 개행이 나타날 때 까지 버퍼를 모두 비워준다는 의미를 가지고 있다.
보통 visual studio에서는 fflush(stdin)이라고 쓰지만, 이것은 좋지않은 코드이므로 위의 코드처럼 쓴다.
그리고 이 문제를 풀며 한가지 반성한 것은,
while (i < n && room[i][j] != 'X') 이렇게 하지않고 while(room[i][j] != 'X' && i <n)으로하면 에러가 난다는 것이다.
먼저 room을 확인하고 i < n을 확인하기에 이미 i가 n보다 크거나 같아진 상태에서 room을 조회하게 된다.
이렇게 되면 memory assert가 일어나게되고 프로그램이 강제 종료된다.
소스 코드 :
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 | #include <iostream> #include <string> using namespace std; string room[101]; int main() { int n; int getX = 0, getY = 0; int cnt = 0; cin >> n; while (getchar() != '\n') {} for (int i = 0; i < n; i++) getline(cin, room[i]); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { room[i][j] == '.' ? cnt++ : cnt = 0; if (cnt == 2) { getX++; while (j < n && room[i][j] != 'X') j++; cnt = 0; } } cnt = 0; } cnt = 0; for (int j = 0; j < n; j++) { for (int i = 0; i < n; i++) { room[i][j] == '.' ? cnt++ : cnt = 0; if (cnt == 2) { getY++; while (i < n && room[i][j] != 'X') i++; cnt = 0; } } cnt = 0; } cout << getX << " " << getY; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1260번] DFS와 BFS (0) | 2016.11.09 |
---|---|
[2167번] 2차원 배열의 합 (0) | 2016.11.08 |
[1987번] 알파벳 (0) | 2016.11.08 |
[10819번] 차이를 최대로 (0) | 2016.11.08 |
[2166번] 다각형의 면적 (2) | 2016.11.07 |