Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고,
추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Sudoku
스도쿠
드디어 마지막 문제입니다.
문제 해석은 생략합니다. 그냥 스도쿠가 맞는지 T/F로 리턴하라는 것입니다.
간단히 검사 코드를 만들면 되지만 제 코드는 왜이케 긴거죠? ;;;
답안을 바로 보겠습니다.
boolean sudoku(int[][] grid) {
int[] result = new int[3];
int[] set = {1,2,3,4,5,6,7,8,9};
for(int i = 0; i<9; i++){
if(contain(grid[i], set)== false){System.out.println("1~9 NOT");return false;}
}
// column check(세로) row check(가로)
for(int i = 0; i< 9; i++){
int colSum = 0;
int rowSum = 0;
for(int j = 0; j<9; j++){
colSum += grid[i][j];
result[0] = colSum == 45 ? 1 : 0;
rowSum += grid[j][i];
result[1] = rowSum == 45 ? 1 : 0;
}
if(result[0] == 0){System.out.println("col error"); return false;}
if(result[1] == 0){System.out.println("row error"); return false;}
}
// square check
if(result[0]== 1 && result[1] == 1){
for(int sq = 0; sq<3; sq++){
int range = 3;
int sqSum = 0;
int rowSP = 0;
int colSP = 0;
//column 3 square logic
for(int sqRow = 1; sqRow<4; sqRow++){
for(int r = rowSP; r< sqRow*3; r++){
for(int c = colSP; c<range; c++){
sqSum += grid[r][c];
}
}
result[2] = sqSum == 45 ? 1 : 0;
if(result[2] == 0){System.out.println("sq error"); return false;}
rowSP += 3;
sqSum = 0;
}
rowSP = 0;
colSP += 3;
}
}
System.out.println(">>"+Arrays.toString(result)+" sum is 3?:"+Arrays.stream(result).sum());
return Arrays.stream(result).sum() == 3 ? true : false;
}
public static boolean contain(int[] array, int[] num){
int[] count = new int[9];
for(int i = 0; i<9; i++){
for(int j : array){
if(num[i] == j){
count[i] = 1;
break;
}
}
}
System.out.println(Arrays.toString(count));
return Arrays.stream(count).sum() == 9 ? true : false;
}
쪼개고 쪼개고 쪼개서 만든 코드라고 생각합니다. ㅠㅠ
제꺼 보지마시고 밑에 좋은 코드를 참고하세요!
이제 엘리트 분들의 답안을 감상하자...
JAVA
boolean sudoku(int[][] grid) {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
int[][] counts = new int[3][9];
for (int x=0; x<3; x++) {
for (int y=0; y<3; y++) {
counts[0][grid[i*3+x][j*3+y]-1] = 1;
counts[1][grid[i*3+j][x*3+y]-1] = 1;
counts[2][grid[x*3+y][i*3+j]-1] = 1;
}
}
for (int k=0; k<9; k++) {
if (counts[0][k] == 0 || counts[1][k] == 0 || counts[2][k] == 0) {
return false;
}
}
}
}
return true;
}
자바도 이렇게 유연하게 배열을 컨트롤 할수 있다는것을 다시한번 알게되며 놀라웠습니다.
Python3
def sudoku(grid):
def r(i):
return sorted(grid[i]) != list(range(1,10))
def c(i):
return sorted([grid[x][i] for x in range(9)]) != list(range(1,10))
def g(x,y):
return sorted([grid[i][j] for i in range(x,x+3) for j in range(y,y+3)]) != list(range(1,10))
for i in range(9):
if r(i) or c(i):
return False
for i in range(0,9,3):
for j in range(0,9,3):
if g(i,j):
return False
return True
파이썬은ㅇ 말할 것도 없죠.
JS
// True, if product of #s in row is 9!
p = a => eval(a.join`*`)==362880
// Check each row, column and 3 block grid using p()
sudoku = grid =>
grid.every((r,i) =>
p(r) &&
p(grid.map(r => r[i])) &&
p(r.map((_,j) => grid[3*(i/3|0)+(j/3|0)][3*(i%3)+(j%3)])))
이분은 대체.... 뭔가 졸라 간단하게 한거 같은데 알아볼수가 없네요. 별로에요 전..
공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
728x90
반응형
'Algorithm > Java' 카테고리의 다른 글
#59_Code Signal Arcade >> Spiral Numbers (0) | 2020.07.20 |
---|---|
#58_Code Signal Arcade >> Message From Binary Code (0) | 2020.07.15 |
#57_Code Signal Arcade >> File Naming (0) | 2020.07.14 |