ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA] 체스판 위의 룩 배치 c++
    Coding Test/SW Expert Academy 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

    댓글

© 2022. code-space ALL RIGHTS RESERVED.