Coding Test/SW Expert Academy
[SWEA] 체스판 위의 룩 배치 c++
owls
2022. 11. 19. 14:26
728x90
- 문제
※ 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