본문 바로가기
Blind 75/Array

보충 문제 | Valid Sudoku

by penny! 2023. 6. 8.

https://leetcode.com/problems/valid-sudoku/

 

Valid Sudoku - LeetCode

Can you solve this real interview question? Valid Sudoku - Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules: 1. Each row must contain the digits 1-9 without repetition. 2. Each c

leetcode.com

Valid Sudoku - 올바른 스도쿠

 

Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition.

Note:

  • A Sudoku board (partially filled) could be valid but is not necessarily solvable.
  • Only the filled cells need to be validated according to the mentioned rules.

9 x 9 스도쿠 보드가 올바른지 확인하라. 채워진 칸들만 확인하면 되며 다음 룰들을 따른다.

 

  1. 각 행은 반복 없이 1-9까지의 숫자를 가진다.
  2. 각 열은 반복 없이 1-9까지의 숫자를 가진다.
  3. 3 x 3의 그리드 박스는 반복 없이 1-9까지의 숫자를 가진다.

Note:

  • 올바른지만 확인하면 되며 풀 수 있는지는 확인 안해도 된다.
  • 채워진 칸들만 확인하면 된다.

 

 

개요

 

프로그래머스에서도 이와 비슷한 문제들이 몇개 나오는데 난 그때 100줄이 넘어가는 코드로 풀었었다.

 

이런 유형의 문제에서의 반복은 어쩔수 없지만 어떻게 하면 반복과 노가다를 최대한 줄이냐가 관건이다.

 

처음에 난 for 문을 3번 돌리면서 행 확인, 열 확인, 3x3칸 확인을 했으나 for 문 1번으로도 사실 가능하다.

 

Set를 활용하면 되는데 자바스크립트에서는 Set은 key 값 없이 value만 존재하므로 map을 사용하면 풀 수 있다.

 

 

 

풀이 방법

 

행, 열, 3x3 칸의 중복을 확인 할 map 객체를 3개 만든다.

 

그리고 for 문을 돌리면서 각 칸의 중복을 확인하면 되는데

 

행과 열은 간단하지만 3 x 3 칸의 키 값을 설정하려면 트릭을 사용해야 한다.

 

9 x 9 칸을 9개의 3 x 3 칸의 인덱스 : 행 0~3 열 0~3으로 바꾸려면

 

단순히 행과 열을 3으로 나눈 후 floor을 사용하면 깔끔하게 인덱스가 맞아떨어진다.

 

코드를 보면 이해하기 더 쉽다.

 

 

풀이

 

 

Python에서는 set이 키 값을 가질 수 있어서 키 값마다 일일이

 

배열을 안 만들어도 되지만 자바스크립트에서는 이렇게 풀 수밖에 없는 것 같다.

 

풀이를 보고 나서 아 이런 깔끔한 방법이 있구나 하고 놀랐다.