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