-
[SWEA] 체스판 위의 룩 배치 c++Coding Test/SW Expert Academy 2022. 11. 19. 14:26728x90
- 문제
※ SW expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
8 x 8 크기의 체스판 위의 몇 개의 칸에 룩(rook)이 놓여 있다. 각 칸에는 최대 1개의 룩을 놓을 수 있으므로, 체스판 위에는 0개 이상 64개 이하의 룩이 놓여 있는 것이다.
이때, 현재 체스판의 배치가 다음 조건을 모두 만족하는지를 판별하는 프로그램을 작성하라.
- 정확히 8개의 룩이 있어야 한다.
- 모든 룩은 서로 공격할 수 없어야 한다. 즉, 서로 다른 두 룩은 같은 열에 있거나 같은 행에 있으면 안 된다.각 테스트 케이스는 여덟 개의 줄로 이루어지며, 각 줄에는 길이가 8인 ‘O’ 또는 ‘.’로 구성된 문자열이 주어진다. i번째 줄의 j번째 글자는, 체스판의 i행 j열에 룩이 하나 놓여 있다면 ‘O’, 아무것도 놓여 있지 않다면 ‘.’이다.
- 문제 해결
이 문제의 point는 중복 체크이기 때문에
중복을 허용하지 않는 set 자료구조를 사용하였다.
#include<iostream> #include <set> #include <algorithm> using namespace std; int main(int argc, char** argv) { int test_case; int T; setbuf(stdout, NULL); scanf("%d", &T); for (test_case = 1; test_case <= T; ++test_case) { set<string> s; for(int i =0; i < 8; i++){ string str(""); cin >> str; s.insert(str); } cout << "#" << test_case <<" "; //각 행에 같은 룩이 있는지 검사 if(s.size() != 8){ cout << "no" << endl; continue; } //각 열에 같은 룩이 있는지 검사 set<string> s2; for(int i = 0; i < 8; i++){ string str(""); for(auto &it : s){ str += it[i]; } s2.insert(str); } if(s2.size() != 8){ cout << "no" << endl; continue; } string result("yes"); //각 행에 'O'의 개수가 1개가 아닌 경우 검사 for(auto &it : s){ if( count( it.begin(), it.end() , 'O' ) != 1){ result = "no"; break; } } //각 열에 'O'의 개수가 1개가 아닌 경우 검사 for(auto &it : s2){ if( count(it.begin(), it.end(), 'O' ) != 1){ result = "no"; break; } } cout << result << endl; } return 0; }
728x90'Coding Test > SW Expert Academy' 카테고리의 다른 글
[SWEA] 1206. [S/W 문제해결 기본] 1일차 - View c++ (2) 2022.11.19 [SWEA] 15230. 알파벳 공부 c++ (0) 2022.11.19 [SWEA] 1946. 간단한 압축 풀기 c++ (0) 2022.11.18 [SWEA] 1948. 날짜 계산기 c++ (0) 2022.11.18 [SWEA] 1954. 달팽이 숫자 c++ (0) 2022.11.18