Top 14 스도쿠 문제 풀이 2930 Votes This Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 스도쿠 문제 풀이 on Google, you do not find the information you need! Here are the best content compiled and compiled by the toplist.tfvp.org team, along with other related topics such as: 스도쿠 문제 풀이 스도쿠 풀이 프로그램, 스도쿠 풀이 사이트, 스도쿠 문제 와 답, 스도쿠 고급 공식, 스도쿠 중급문제, 스도쿠 중급문제와 답, 스도쿠 최고급, 스도쿠 고급 문제


문제풀이5: 수도쿠(sudoku) 어렵지만 재미있는 수도쿠 게임.
문제풀이5: 수도쿠(sudoku) 어렵지만 재미있는 수도쿠 게임.


스아리의 잡동사니 :: 스도쿠 풀어주는 프로그램

  • Article author: gimgyu.tistory.com
  • Reviews from users: 7254 ⭐ Ratings
  • Top rated: 4.8 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 스아리의 잡동사니 :: 스도쿠 풀어주는 프로그램 스도쿠_문제풀이기.exe. 조금 특이한 프로그램을 보았네요^^. 말그대로 스도쿠를 풀어줍니다… 각 칸에 숫자를 입력해 주시고 문제풀기를 클릭 … …
  • Most searched keywords: Whether you are looking for 스아리의 잡동사니 :: 스도쿠 풀어주는 프로그램 스도쿠_문제풀이기.exe. 조금 특이한 프로그램을 보았네요^^. 말그대로 스도쿠를 풀어줍니다… 각 칸에 숫자를 입력해 주시고 문제풀기를 클릭 … 스도쿠 풀이기 조금 특이한 프로그램을 보았네요^^ 말그대로 스도쿠를 풀어줍니다… 각 칸에 숫자를 입력해 주시고 문제풀기를 클릭해주시면 바로 풀어줍니다. 출처 : http://www.kippler.com/win/sudoku/
  • Table of Contents:
스아리의 잡동사니 :: 스도쿠 풀어주는 프로그램
스아리의 잡동사니 :: 스도쿠 풀어주는 프로그램

Read More

스도쿠 풀이 기법 가이드 : 네이버 블로그

  • Article author: m.blog.naver.com
  • Reviews from users: 9476 ⭐ Ratings
  • Top rated: 4.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 스도쿠 풀이 기법 가이드 : 네이버 블로그 만약 이 규칙이 없다면 공개숫자가 없는 텅빈 사각형도 1~3번 규칙을 만족하는 스도쿠 문제가 되겠죠. 2. 후보숫자. 각 cell에 포함될 수 있는 숫자를 … …
  • Most searched keywords: Whether you are looking for 스도쿠 풀이 기법 가이드 : 네이버 블로그 만약 이 규칙이 없다면 공개숫자가 없는 텅빈 사각형도 1~3번 규칙을 만족하는 스도쿠 문제가 되겠죠. 2. 후보숫자. 각 cell에 포함될 수 있는 숫자를 …
  • Table of Contents:

카테고리 이동

이 블로그 
이론
 카테고리 글

카테고리

이 블로그 
이론
 카테고리 글

스도쿠 풀이 기법 가이드 : 네이버 블로그
스도쿠 풀이 기법 가이드 : 네이버 블로그

Read More

행복 바구니

  • Article author: blog.daum.net
  • Reviews from users: 45342 ⭐ Ratings
  • Top rated: 3.9 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 행복 바구니 이 문제에서 가장 빈칸이 적은 칸은 맨 가운데 칸입니다. 그리고 없는 숫자는 2,7,8입니다. 그런데 각각 그 왼쪽 칸과 위쪽 칸을 보면 빈칸과 같은 줄과 … …
  • Most searched keywords: Whether you are looking for 행복 바구니 이 문제에서 가장 빈칸이 적은 칸은 맨 가운데 칸입니다. 그리고 없는 숫자는 2,7,8입니다. 그런데 각각 그 왼쪽 칸과 위쪽 칸을 보면 빈칸과 같은 줄과 … 인터넷에 보면 스도쿠 풀이들이 많이 올라와있는데, 대부분 처음엔 이해하기 어렵죠? 그런 분들을 위해서 저도 스도쿠 풀이법을 올려보려고 합니다.. (이게 더 이해하기 쉬울거라는건 제 생각일 뿐일까요;; ) *스..지식, 지혜, 정보가 담겨있는나만의 행복 ..행복 바구니
  • Table of Contents:
행복 바구니
행복 바구니

Read More

Sudoku Programming

  • Article author: sudoku.keetekee.com
  • Reviews from users: 40350 ⭐ Ratings
  • Top rated: 4.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about Sudoku Programming [문제풀이] The Daily Sudoku 2007년 07월 24일 VeryHard 3 1 6 5 1 2 6 9 5 9 4 8 1 6 3 3 7 4 6 2 7 3 4 1 5 6 ※ 풀이과정 입니다. (셀 좌표는 [컬럼,로우]) — 현재 … …
  • Most searched keywords: Whether you are looking for Sudoku Programming [문제풀이] The Daily Sudoku 2007년 07월 24일 VeryHard 3 1 6 5 1 2 6 9 5 9 4 8 1 6 3 3 7 4 6 2 7 3 4 1 5 6 ※ 풀이과정 입니다. (셀 좌표는 [컬럼,로우]) — 현재 … 스도쿠 폐인의 스도쿠 프로그래밍, 출처를 명시하지 않은 불펌은 금지합니다. – 김프로 –
  • Table of Contents:
Sudoku Programming
Sudoku Programming

Read More

[C/C++ 문제풀이] 1. 스도쿠 정답 판별기 만들기

  • Article author: velog.io
  • Reviews from users: 39036 ⭐ Ratings
  • Top rated: 4.5 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [C/C++ 문제풀이] 1. 스도쿠 정답 판별기 만들기 코드메이트에 올려놓은 풀이. 0. 문제 분석 및 데이터 구조 생각하기. 일단 스도쿠 문제를 간단화 해봅시다. 우리가 스도쿠를 정답인지 오답인지 판별 … …
  • Most searched keywords: Whether you are looking for [C/C++ 문제풀이] 1. 스도쿠 정답 판별기 만들기 코드메이트에 올려놓은 풀이. 0. 문제 분석 및 데이터 구조 생각하기. 일단 스도쿠 문제를 간단화 해봅시다. 우리가 스도쿠를 정답인지 오답인지 판별 … class를 활용한 스도쿠 정답 판별기 만들기
  • Table of Contents:
[C/C++ 문제풀이] 1. 스도쿠 정답 판별기 만들기
[C/C++ 문제풀이] 1. 스도쿠 정답 판별기 만들기

Read More

52G :: 스도쿠 문제모음 난이도별 무료 게임

  • Article author: 52gram.tistory.com
  • Reviews from users: 39847 ⭐ Ratings
  • Top rated: 3.6 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 52G :: 스도쿠 문제모음 난이도별 무료 게임 한국어를 포함한 20여 개 언어를 지원하며 사이트 접속 후 곧바로 게임을 선택하여 풀이할 수 있는 스도쿠 문제모음 전문 사이트입니다. …
  • Most searched keywords: Whether you are looking for 52G :: 스도쿠 문제모음 난이도별 무료 게임 한국어를 포함한 20여 개 언어를 지원하며 사이트 접속 후 곧바로 게임을 선택하여 풀이할 수 있는 스도쿠 문제모음 전문 사이트입니다. 심심할 때나 시간을 보내야 할 때 게임을 하는 분들이 많습니다. 화려하고 웅장한 온라인 게임도 좋지만 때론 단순하고 간편한 클래식 게임을 즐기는 것도 좋은데, 그중 하나가 스도쿠입니다. 스도쿠 어플도 있고..가볍고 쉽게 여러가지 소식을 설명합니다. 🙂
  • Table of Contents:
52G :: 스도쿠 문제모음 난이도별 무료 게임
52G :: 스도쿠 문제모음 난이도별 무료 게임

Read More


See more articles in the same category here: 497+ tips for you.

스도쿠 풀이 기법 가이드

1. 스도쿠란?

위와 같이

1) 각 가로줄에는 1~9까지의 숫자가 겹치지 않도록 한번씩 들어간다.

2) 각 세로줄에는 1~9까지의 숫자가 겹치지 않도록 한번씩 들어간다.

3) 각 3×3 box 안에는 1~9까지의 숫자가 겹치지 않도록 한번씩 들어간다.

이 3가지의 규칙을 만족하도록 숫자를 채워 넣는 퍼즐입니다.

많은 경우 여기에 4번 규칙 ‘답은 유일하다’ 를 추가하기도 하는데요,

만약 이 규칙이 없다면 공개숫자가 없는 텅빈 사각형도 1~3번 규칙을 만족하는 스도쿠 문제가 되겠죠.

2. 후보숫자

각 cell에 포함될 수 있는 숫자를 모두 적어 놓은 것을 후보숫자라 합니다.

예를 들어, 이 상황에서 맨 왼쪽 위 칸에 포함될 수 있는 숫자는 6, 8, 9 뿐입니다.

다른 숫자가 들어가게 된다면 스도쿠의 기본 규칙 1~3에 위배됩니다.

이럴 경우에 6, 8, 9 를 작은 크기로 적어줍니다.

3. 풀이법의 비교

1) 후보숫자를 사용하지 않는 경우

자동으로 후보숫자를 입력시켜주는 프로그램을 사용하지 않는 이상, 귀찮아서라도 처음에는 이 방법으로 시작을 하게 되지요. 후보숫자를 사용하지 않는다면 고급 기법에 여러가지 제약이 걸리게 됩니다. 즉, 문제의 난이도가 어느 정도 있을 경우, 논리적으로 풀지 못하고 ‘찍어서’ 풀어야 하는 경우가 종종 생기게 된다는 뜻입니다. 다만, 논리적으로 푸는 것보다 빨리 푸는 것이 목적이라면 후보숫자를 사용하지 않는 경우가 훨씬 더 좋은 기록을 낼 수 있습니다.

2) 후보숫자를 사용하는 경우

뭐 위와 반대겠죠. ‘거의’ 모든문제를 논리적으로 풀 수 있지만 (풀이법이 보이기만 한다면야.) 기록면에서는 많이 늦어집니다.

4. 유의사항

* 풀이기법에서는 후보숫자를 사용하지 않고도 찾은 수 있는 풀이기법까지 한해서는 두 가지 방법 모두 넣어서 비교해보도록 해보겠습니다.

* 헷갈리는 분이 계실지도 모르겠는데 행(row)은 가로줄이고요, 열(column)이 세로줄입니다. 또한 box라 하면 3×3 짜리 작은 네모칸을 말합니다.

* 앞으로 (m, n) cell 라 하면 위에서부터 m번째 행, 왼쪽에서부터 n번째 열에 위치한 cell을 가르킵니다.

* 풀이 기법에 대한 질문이나 코멘트는 공개댓글로(비댓이어도 상관은 없습니다만, 의견은 공유하는게 좋을듯해요), 연습문제에 대한 풀이나 질문은 비밀댓글로 달아주세요. 스포일러가 될 수 있습니다.

* 궁금한 점이 있는 경우 각 게시글에 댓글을 다시면 됩니다. 단, 스도쿠라는 퍼즐의 특성상 그림이 필요할 때가 있는데, 이 경우는 블로그 우측 상단의 메모게시판을 이용해주세요. 풀이법에 대한 질문이나, 막히는 문제의 힌트 등 스도쿠에 대한 전반적인 내용이면 모두 가능합니다.

* ‘이 문제의 답좀 구해주세요’와 같은 질문은 안받습니다. 모든 문제는 찍으면 다 풀리니, 무의미한 질문입니다.(가끔 뜬금포 쪽지가 와요 ㄷㄷ;;) 단, 막히는 문제를 질문하시면 그 상황에서 어떤 기법을 적용시킬 수 있는지 힌트는 드릴 수 있습니다.

5. 테크트리

그냥 처음부터 쭉 읽으시면 이해하시는데에 큰 지장이 없을 겁니다.

다만 특정 기법을 먼저 마스터하고 싶다 하시는 분은 아래의 테크트리를 참고해서 이해해 나가시면 되겠습니다.

행복 바구니

인터넷에 보면 스도쿠 풀이들이 많이 올라와있는데, 대부분 처음엔 이해하기 어렵죠?

그런 분들을 위해서 저도 스도쿠 풀이법을 올려보려고 합니다..

(이게 더 이해하기 쉬울거라는건 제 생각일 뿐일까요;; )

*스도쿠의 규칙은?

스도쿠는 9X9짜리 칸을 정사각형 9개(3X3)로 나누고, 그 안에 들어있는 기본적인 숫자를 바탕으로 해서 1부터 9까지의 숫자로 칸을 채워나가는 퍼즐입니다. 숫자를 채울 때에는 가로, 세로 줄에 겹치는 수가 없어야 하며, 또한 3X3짜리 정사각형 칸 안에도 겹치는 수가 없어야 합니다.

그러면 이제부터 풀어볼까요 ~ 풀어볼 문제는 2007년 7월 20일자 스도쿠 입니다.

(스도쿠 문제들은 http://www.dailysudoku.com 에서 날마다 얻으실 수 있습니다^^)

물론 문제를 풀기 위해서는 스도쿠의 기본 규칙을 잘 알아야겠죠~^^(그건 기본이죠)

그리고 숫자들의 배치를 포괄적으로 파악할 수 있는 능력 또한 아주 중요합니다.

그렇지만 그것만으로는 스도쿠를 푸는데 아주 많은 시간이 걸리게됩니다.

*박스: 3X3짜리 정사각형, 칸: 1X1짜리 정사각형을 말합니다.

ⓛ가장 빈칸이 적은 칸에 존재하지 않는 숫자들을 파악하고, 주위를 둘러보자.

이 문제에서 가장 빈칸이 적은 칸은 맨 가운데 칸입니다. 그리고 없는 숫자는 2,7,8입니다. 그런데 각각 그 왼쪽 칸과 위쪽 칸을 보면 빈칸과 같은 줄과 칸에 8이 있는 것을 알 수 있습니다. 따라서 맨 위쪽의 빈 칸 외에 다른 칸에는 8이 금지됩니다.(*들어갈 수 없다라는 말을 금지되었다고 하겠습니다.) 그러면 맨 위의 칸에는 8이 들어가게 됩니다.

그 후에 오른쪽 칸을 보면 역시나 없는 수 중 하나인 2가 있습니다. 그래서 위에서 2번째 칸에는 2가 들어가게 됩니다.

이러고 나면 빈 칸이 하나 뿐이므로, 마지막 빈칸에는 7이 들어가게 됩니다.

/이 단계를 마치면..

(2)기본 규칙(세로줄, 가로줄, 3X3 박스에는 같은 수가 없어야 한다.)에 따라 찾기.

이 방법은 역시나 숫자들의 배치를 파악하는 것이 중요합니다. 물론 특정 숫자에 대해 금지된 칸을 찾기 위해 처음에는 X표를 해가면서 하셔도 됩니다. 그러나 나중에 그게 귀찮아 지시면 한 박스마다 눈으로 보고 하시면 훨씬 더 편리합니다.

(따라하기~)

맨 아래 가장 왼쪽 박스를 보시고, 옆에 있는 숫자 ‘1’들로 부터 세로로 길게 줄이 그어져있다고 생각하세요.(그 가상의 줄을 저는 ‘금지줄’ 이라고 부릅니다.) 그 때, 색이 칠해지지 않은 칸이 하나만 있을 경우 그 칸에는 숫자 1이 들어가게 됩니다.

1) 맨 위줄 중간 박스에서, 맨 위 가장 왼쪽 칸을 뺀 나머지 칸에는 5가 금지됩니다.(밑에 있는 박스들을 보세요.) -> 따라서 맨 위줄 중간 박스의 맨 위 가장 왼쪽 칸에는 5가 들어갑니다.

같은 식으로 최대한 찾을 수 있는만큼 숫자들을 찾아줍니다.

/ 이 단계를 마치면…

③숫자가 어디에 들어갈지 불확실해도 그 숫자가 들어갈 수 있는 칸이 한 직선위에 있으면 그 숫자와 같은 효력이 있다.

이게 무슨 말이냐구요;; 살펴봅시다~

이 방법은 어떤 한 줄 (이어져있는 박스 3개)에 어떤 숫자가 단 하나만 존재할 때에 효과가 있습니다.(물론 상황따라 다르지만.. 그래도 꽤 유용한 방법이니 알아두세요~)

이 문제에서 그 방법을 사용할 수 있는 칸은 맨 위 가운데 칸입니다.

맨 윗줄(가로)과 가운데 줄(세로)이 4가 금지되어 있는것을 보실 수 있습니다

<4?> 가 있는 곳을 잘 살펴보세요.

여기에서는 둘 중 한 칸에 4가 들어가게 됩니다.

생각해 보시면 둘 중 어느칸에 4가 들어가든 그 세로줄에는 4가 들어갈 수 없다는 말이 됩니다.

거기에다가 기본 원리를 생각해 보면 맨 아래줄(가로) 가운데 박스에서 맨 아래쪽 왼쪽 칸에 4가 들어가게 됩니다.

그런데 이 문제에서는 아직까지 이 방법을 쓸 수 있는 곳 수가 이것밖에 없군요;

/이 단계를 마치면/

(4)세로줄, 가로줄과 주위 숫자들을 사용해서 숫자를 찾는 방법. (약간 2번하고 겹치는 듯..)

예를 들어서 이 줄을 살펴봅시다.

이 줄에 없는 숫자는 3,6,7 입니다.

그런데 진하게 칠해진 곳을 봐주세요~ 3과 7 모두 금지가 되어있습니다.

그러면 그 칸에 들어갈 숫자는 6이 되겠지요^^

그리고 이 문제에서는 사용할 수 없지만 만약 그 칸 왼쪽의 빈칸 2개에서 세로줄을 그었을 때 줄 안에 3 또는 7이 있다면 그 중 한칸에 특정 숫자(3이나 7)가 금지되기 때문에 그 줄을 완전히 채울 수 있답니다^^

또한 3×3박스 안에서도 이와같은 방법을 사용할 수 있습니다.

[박스 안에서와 세로줄, 가로줄에 들어가있지 않은 숫자 중에서 하나 (a라는 숫자라고 하면) 를 제외한 모든 숫자가 금지된 칸이 하나 존재한다면 그 칸에는 a라는 숫자가 들어가게 된다. ] 라고 정리할 수 있겠죠^^

*주의사항: 박스에서나 세로줄, 가로줄에서나 들어가지 못한 숫자가 적은 것에서부터 이 방법을 적용시켜주시기 바랍니다~

그렇지만 들어가지 못한 숫자가 4개정도 되는 경우까지는 이 방법을 써먹을 수는 있습니다.

이런 식으로 해서 (몇 가지 경우가 더 있습니다.) 이 단계를 마치면..//

이제 이런 방법을 계속 혼합해서 사용해 주시면 됩니다.

또한, 이 방법들의 사용 순서는 문제 풀이와는 전혀 상관이 없답 니다~

정답입니다^^

*주의사항

스도쿠의 정답은 반드시 1개가 아닐 수도 있습니다. 특히 빈칸이 많을수록 더더욱 그렇습니다!

——————————————————————————————–

물론 정답은 있습니다;; 그러나 제가 직접 푼건 아래에서 2번째 그림까지구요..

그 후 학원에서 자습시간에 열심히 스도쿠를 풀었습니다만;;

숫자 몇개를 더 찾은 후 더 이상 숫자가 보이지 않자 ‘찍기’모드로 돌입..

그리고 나서 스도쿠가 거의 다 풀리는 듯 싶었죠;;

그런데 칸이 3개 정도 남았는데 숫자가 안맞는 상황이 발생했죠

그래서 저는 스트레스를 해소를 위해서..!! 스도쿠 종이를 북~북~ 찢었다는 ~-_-

이런 글 쓸려면 쉬운걸 골랐어야 했는데 왜 “very hard”를 골라가지고 왠 망신이람~

——————————————————————————————-

여기까지였습니다

———————————————-

새롭게 발견한 풀이 방법

얼마전 스도쿠를 풀다가 얼핏 새로운 방법을 한가지 더 알게되었습니다^^

위의 ③번의 변형이라고도 할 수 있을것 같군요..

이 그림을 보시면..

빨간색 테두리가 쳐진 줄에서 1이 들어갈 수 있는 칸은

한개의 큰 네모칸 안에 있는 작은 네모칸 2개 뿐입니다.

(그러니까 그 줄에서 다른 큰 네모칸 (두꺼운 검정 테두리) 안에 있는

칸들에 1이라는 숫자가 이런저런 이유로 모두 들어갈 수 없게 되었습니다..!!)

그런데 1?라고 써진 곳을 봐주세요.~

같은 줄의 밑에 있는 모든 칸들에 1이 막혀버렸기 때문에, 어쩔수 없이 그 두 칸 중 한 칸에는 반드시 1이 들어가야 합니다.

그런데 그러면 맨 위의 가장 왼쪽에 있는 가장 큰 네모칸 (1?이 있는 곳)에는 반드시 1이 들어가야 합니다.

결과적으로, 스도쿠 규칙에 위배되지 않으면서 이 두 조건을 동시에 만족시키려면 1은 반드시 1?가 쓰여있는 두 칸에만 들어갈 수 있게 되는 것입니다.

(아시겠나요???)

또, 그로부터 유추해 낼 수 있는것은,

그 큰 네모칸에서 1?가 있는 두 칸을 뺀 나머지 칸에서 1이 자동적으로 들어갈 수 없게 된다는 것입니다^^

(이 그림에서 진한 빨강색 칸에는 자동적으로 1이 금지됩니다.)

정리해서, 위의 ③번은 큰 네모칸의 나머지 칸들이 막혀서 그 칸을 지나가는 어떤 줄에 특정 숫자가 들어갈 수 없는것이고,

방금 소개한 방법은 어떤 한 줄의 나머지 칸들이 막혀서 그 줄이 지나가는 큰 네모칸에 특정 숫자가 들어갈 수 없게되는것…

생각해보면 상당히 비슷한 방법이죠^^

그런데 이 방법이 또 흥미로운 것은,

1? (즉, 특정 숫자가 허용되는 칸을 이은 줄) 가 한 큰 네모칸 안에서 1칸의 교점이 생기도록 만들어 지는 경우가 있습니다.

예를들어 +, ㄱ, ㄴ 자 모양 등등으로 말이죠..

이 경우, 무조건 그 교점에다가 1 (특정 숫자)이라는 숫자를 쓰시면 됩니다.

원리는 스도쿠 규칙을 잘 생각해 보시면 됩니다^^

그러면 유용하게 활용하세요~

[C/C++ 문제풀이] 1. 스도쿠 정답 판별기 만들기

어느정도 C++을 공부한 다음 코딩 활용도를 높이고 싶어 관련 문제를 찾아보았습니다.

그러다 아래의 링크에서 스도쿠 문제를 발견하였고 풀어보면 재밌겠다 생각하여 코딩을 해봤습니다.

사실 위 사이트에도 답을 올려 놓았지만 velog에도 작성하면 좋을것 같아 포스팅을 해봅니다.

0. 문제 분석 및 데이터 구조 생각하기

일단 스도쿠 문제를 간단화 해봅시다.

우리가 스도쿠를 정답인지 오답인지 판별하는 방법은 다음과 같습니다.

같은 행에서 겹치는 수가 있는가

같은 열에서 겹치는 수가 있는가

같은 블록(?)에서 겹치는 수가 있는가

간단히 생각해봐도 첫번째 조건과 두번째 조건은 판별하는 방식이 매우 비슷할 것 같습니다. 하지만 세번째 조건은 조금 다르게 생각해야 될 것 같습니다.

가로, 세로값을 판별하는 방식과 블록값을 판별하는 방식이 다를 것이므로 이 둘의 결과를 따로 집어넣는 방식이 좋겠습니다.

또한 스도쿠는 9 X 9 행렬처럼 이루어져 있기 때문에 직관적으로 int형 이중배열을 사용하는 것이 좋을 것 같습니다.

그래서 결국 만든 데이터 구조는 다음과 같습니다.

class Table { private : int array [ 9 ] [ 9 ] ; bool first_result = true ; bool second_result = true ; }

Table 이라는 클래스를 만들었으니 당연히 생성자와 소멸자가 필요합니다.

또한 가로, 세로, 블록값을 판별하는 함수가 필요한데, 만약 이를 클래스 외부함수로 만들게 되면 함수를 호출할 때마다 Table 클래스의 정보를 항상 입력해야 됩니다.

이는 너무 귀찮을 것 같으므로 그냥 클래스 내부에 메소드를 만들도록 합시다.

class Table { private : int array [ 9 ] [ 9 ] ; bool first_result = true ; bool second_result = true ; public : Table ( int ( * input_array ) [ 9 ] ) { for ( int i = 0 ; i < 9 ; i ++ ) { for ( int j = 0 ; j < 9 ; j ++ ) { array [ i ] [ j ] = input_array [ i ] [ j ] ; } } } Table ( ) { } ~ Table ( ) { } bool check_row ( int current_row ) ; bool check_column ( int current_column ) ; bool check_block ( int current_row , int current_column ) ; void total_check ( ) ; void print_array ( ) { for ( int i = 0 ; i < 9 ; i ++ ) { for ( int j = 0 ; j < 9 ; j ++ ) { std :: cout << array [ i ] [ j ] << " " ; } std :: cout << std :: endl ; } } } ; 1. 같은 행에서 겹치는 수가 있는가 bool Table :: check_row ( int current_row ) { for ( int i = 0 ; i < 9 ; i ++ ) { int first_value = array [ current_row ] [ i ] ; for ( int j = i + 1 ; j < 9 ; j ++ ) { if ( first_value == array [ current_row ] [ j ] ) { return false ; } } } return true ; } 한 행에서 겹치는 수가 있는지 판별하는 함수를 만들었습니다. 함수의 인자는 확인해볼 행 (int current_row) 입니다. for 문을 돌리면서 배열 내에 first_value 와 같은 값이 있는지 확인합니다. 만약 같은 값이 있으면 return false로 바로 종료되게 만들었습니다. first_value = array[current_row][i] 했으므로 first_value는 행의 첫번째, 두번째 ~~ 값으로 계속 변합니다. 또한 아래의 for 문에서 int j = i + 1 이라 했으므로 first_value 뒤의 값들만 확인합니다. 만약 중간에 first_value 와 같은값이 없으면 true 를 리턴합니다. 2. 같은 열에서 겹치는 수가 있는가 bool Table :: check_column ( int current_column ) { for ( int i = 0 ; i < 9 ; i ++ ) { int first_value = array [ i ] [ current_column ] ; for ( int j = i + 1 ; j < 9 ; j ++ ) { if ( first_value == array [ j ] [ current_column ] ) { return false ; } } } return true ; } 앞서 말했듯이 세로값을 확인하는 함수는 앞의 함수와 거의 동일하게 돌아갑니다. 앞의 함수와 동일하게 first_value를 설정하였고 중간에 같은 값이 있으면 false를 리턴합니다. 3. 같은 블록에서 겹치는 수가 있는가 블록값을 확인할 때 주의할 점은 확인해야 되는 값이 앞의 함수처럼 바로 옆, 아래에만 존재하지 않는다는 점입니다. 하지만 이를 제외하면 무언가 동일하게 만들 수 있을 것 같습니다. bool Table :: check_block ( int current_row , int current_column ) { for ( int i = current_row ; i < current_row + 3 ; i ++ ) { for ( int j = current_column ; j < current_column + 3 ; j ++ ) { int first_value = array [ i ] [ j ] ; int count = 0 ; for ( int k = i ; k < current_row + 3 ; k ++ ) { for ( int l = j ; l < current_column + 3 ; l ++ ) { if ( first_value == array [ k ] [ l ] ) { count ++ ; } } } if ( count != 1 ) { return false ; } } } return true ; } 확인해야 하는 값이 옆, 아래에만 있지 않기 때문에 check_block 함수는 현재의 형과 열 (int current_row, int current_column) 두가지 변수를 받습니다. 또한 위 두 값은 해당 블록의 첫번째 배열의 위치값을 넣도록 하였습니다. 즉, 아래와 같은 3가지 블록이 있을 때 1 2 3 4 2 1 7 8 9 4 5 6 3 5 7 1 2 3 7 8 9 6 8 9 4 5 6 첫번째 블록은 (1)이 위치한 값, 두번재는 (4), 세번째는 (7) 을 변수로 넣었다는 뜻입니다. 마지막으로 3, 4번째 for 문을 보면 k = i, l = j 부터 시작합니다. for ( int k = i ; k < current_row + 3 ; k ++ ) { for ( int l = j ; l < current_column + 3 ; l ++ ) { if ( first_value == array [ k ] [ l ] ) { count ++ ; } } } 위에서 first_value = array[i][j] 로 설정했기 때문에 for문이 돌아가면서 first_value 와 같은값이 한번은 나옵니다. 때문에 count != 1 일때는 false를 리턴하게 하였고 이상이 없으면 true를 리턴하게 하였습니다. 4. 종합해서 생각하기 이제 마지막 단계입니다. 위에서 만든 3가지 함수는 한 행 또는 열, 블록에서만 판별하는 함수였으므로, 모든 부분에 대해서 확인하는 부분을 만들어야 합니다. void Table :: total_check ( ) { std :: cout << std :: endl ; for ( int i = 0 ; i < 9 ; i ++ ) { first_result = check_row ( i ) ; if ( first_result == false ) { std :: cout << "False" << std :: endl ; return ; } } for ( int i = 0 ; i < 9 ; i ++ ) { first_result = check_column ( i ) ; if ( first_result == false ) { std :: cout << "False" << std :: endl ; return ; } } for ( int i = 0 ; i != 9 ; i += 3 ) { for ( int j = 0 ; j != 9 ; j += 3 ) { second_result = check_block ( i , j ) ; if ( second_result == false ) { std :: cout << "False" << std :: endl ; return ; } } } std :: cout << "True" << std :: endl ; } 각 for 문 속을 보면 결과값이 false 일 경우 바로 멈추도록 하였습니다. 또한 마지막 세번째 for 문을 보면 i += 3, j += 3 을 하였기 때문에 각 블록의 첫번째 위치값이 들어가게 됩니다. (i,j) : (0,0), (0,3), (0,6), (3,0) ~~> (6,6)

이제 지금까지 만든 것들을 종합해서 보면 아래와 같습니다.

# include class Table { private : int array [ 9 ] [ 9 ] ; bool first_result = true ; bool second_result = true ; public : Table ( int ( * input_array ) [ 9 ] ) { for ( int i = 0 ; i < 9 ; i ++ ) { for ( int j = 0 ; j < 9 ; j ++ ) { array [ i ] [ j ] = input_array [ i ] [ j ] ; } } } Table ( ) { } ~ Table ( ) { } bool check_row ( int current_row ) ; bool check_column ( int current_column ) ; bool check_block ( int current_row , int current_column ) ; void total_check ( ) ; void print_array ( ) { for ( int i = 0 ; i < 9 ; i ++ ) { for ( int j = 0 ; j < 9 ; j ++ ) { std :: cout << array [ i ] [ j ] << " " ; } std :: cout << std :: endl ; } } } ; int main ( ) { std :: cout << " code_start " << std :: endl ; int array [ 9 ] [ 9 ] ; for ( int i = 0 ; i < 9 ; i ++ ) { for ( int j = 0 ; j < 9 ; j ++ ) { int temp ; std :: cin >> temp ; array [ i ] [ j ] = temp ; } std :: cout << std :: endl ; } Table test ( array ) ; test . print_array ( ) ; test . total_check ( ) ; std :: cout << " code_end " << std :: endl ; return 0 ; } bool Table :: check_row ( int current_row ) { for ( int i = 0 ; i < 9 ; i ++ ) { int first_value = array [ current_row ] [ i ] ; for ( int j = i + 1 ; j < 9 ; j ++ ) { if ( first_value == array [ current_row ] [ j ] ) { return false ; } } } return true ; } bool Table :: check_column ( int current_column ) { for ( int i = 0 ; i < 9 ; i ++ ) { int first_value = array [ i ] [ current_column ] ; for ( int j = i + 1 ; j < 9 ; j ++ ) { if ( first_value == array [ j ] [ current_column ] ) { return false ; } } } return true ; } bool Table :: check_block ( int current_row , int current_column ) { for ( int i = current_row ; i < current_row + 3 ; i ++ ) { for ( int j = current_column ; j < current_column + 3 ; j ++ ) { int first_value = array [ i ] [ j ] ; int count = 0 ; for ( int k = i ; k < current_row + 3 ; k ++ ) { for ( int l = j ; l < current_column + 3 ; l ++ ) { if ( first_value == array [ k ] [ l ] ) { count ++ ; } } } if ( count != 1 ) { return false ; } } } return true ; } void Table :: total_check ( ) { std :: cout << std :: endl ; for ( int i = 0 ; i < 9 ; i ++ ) { first_result = check_row ( i ) ; if ( first_result == false ) { std :: cout << "False" << std :: endl ; return ; } } for ( int i = 0 ; i < 9 ; i ++ ) { first_result = check_column ( i ) ; if ( first_result == false ) { std :: cout << "False" << std :: endl ; return ; } } for ( int i = 0 ; i != 9 ; i += 3 ) { for ( int j = 0 ; j != 9 ; j += 3 ) { second_result = check_block ( i , j ) ; if ( second_result == false ) { std :: cout << "False" << std :: endl ; return ; } } } std :: cout << "True" << std :: endl ; } 5. 총평 처음 스도쿠 문제를 봤을 때 적절한 난이도일 것 같았는데 생각보다 쉬웠던 것 같습니다. 다음번에는 좀 더 적절한 문제를 가져와 봐야겠습니다. 감사합니다.

So you have finished reading the 스도쿠 문제 풀이 topic article, if you find this article useful, please share it. Thank you very much. See more: 스도쿠 풀이 프로그램, 스도쿠 풀이 사이트, 스도쿠 문제 와 답, 스도쿠 고급 공식, 스도쿠 중급문제, 스도쿠 중급문제와 답, 스도쿠 최고급, 스도쿠 고급 문제

Leave a Comment