본문 바로가기

코딩테스트 연습/SWEA

[SWEA] 1974. 스도쿠 검증 d2 (c++)

https://swexpertacademy.com/main/solvingProblem/solvingProblem.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

가로줄과 세로줄에 모두 1~9가 1개씩 존재해야하고, 3x3크기의 격자에도 1~9숫자가 1개씩 존재해야 스도쿠가 성립한다.

가로줄과 세로줄은 아래처럼 간단하게 표현할 수 있고,

for(int i=0;i<9;j++){

            for(int j=0;j<9;j++){

                cnt_row[ sudoku[i][j] ]++;

                cnt_col[ sudoku[j][i] ]++;

            }

}

 

3x3격자에 대해서는 i=0, i=1, i=2, i=3 .... i=8 에 대하여 생각하다보니, 아래와 같은 식으로 계산할 수 있었다.

for(int i=0;i<9;j++){

            for(int x=0;x<3;x++){
                for(int y=0;y<3;y++){
                    cnt_square[ sudoku[x + (i/3)*3 ][y + (i%3)*3 ] ]++;
                }
            }

}

다른 방법들도 있을것 같은데 i에 대한 for문 안에 3가지 조건을 다 넣고싶어서 i에 대한 식으로 구했다.

3x3격자 식 구할때 규칙 생각이 안나서 인덱스 번호를 일일이 적어가며 구했다,, 😅


#include <iostream>
using namespace std;
#define MAX 11
int main(int argc, char** argv)
{
    int T;
    cin >> T;
    for(int t=0;t<T;t++){
        
        int result = 1;
        int sudoku[9][9]={0,};
        
        for(int i=0;i<9;i++)for(int j=0;j<9;j++) cin >> sudoku[i][j];
        
        for(int i=0;i<9;i++){
            int cnt_row[10] = {0,};
            int cnt_col[10] = {0,};
            
            for(int j=0;j<9;j++){
                cnt_row[ sudoku[i][j] ]++;
                cnt_col[ sudoku[j][i] ]++;
            }
            int cnt_square[10] = {0,};
            for(int x=0;x<3;x++){
                for(int y=0;y<3;y++){
                    cnt_square[ sudoku[x + (i/3)*3 ][y + (i%3)*3 ] ]++;
                }
            }

            for(int k=1;k<=9;k++){
                // 점검
                if(cnt_row[k] != 1) {result = 0; break;}
                if(cnt_col[k] != 1) {result = 0; break;}
                if(cnt_square[k] != 1) {result = 0; break;}
            }
            if(result == 0) break;
        }
        cout << "#" << t+1 << " " << result << "\n";
    }
    return 0;
}