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;
}
'코딩테스트 연습 > SWEA' 카테고리의 다른 글
[SWEA] 1983. 조교의 성적 매기기 D2 (c++) (0) | 2022.05.24 |
---|---|
[SWEA] 1961. 숫자 배열 회전 d2 (c++) (0) | 2022.05.24 |
[SWEA] 1954. 달팽이 숫자 d2 (c++) (0) | 2022.05.23 |
[SWEA] 1204. [S/W 문제해결 기본] 1일차 - 최빈수 구하기 D2 (0) | 2022.05.23 |
[SWEA] 2005. 파스칼의 삼각형 D2 (c++) (0) | 2022.05.22 |