greenhelix
greenhelix
greenhelix
11-03 13:43
  • All (229)
    • Algorithm (118)
      • Algorithm (17)
      • Graph (0)
      • Core (6)
      • Python (18)
      • PythonSnippet (4)
      • Java (59)
      • Kotlin (14)
    • Project (0)
    • Study (8)
      • License (5)
      • EIP (3)
    • Programming (63)
      • Android (41)
      • Flutter (1)
      • Bugs Life (21)
      • Linux (0)
    • Tech (32)
      • Tech (17)
      • Drone (4)
      • Hacking (11)
    • Life (6)
      • INGRESS (1)
      • 심시티빌드잇 (0)
250x250

티스토리

hELLO · Designed By 정상우.
greenhelix

greenhelix

#60_Code Signal Arcade >> Sudoku
Algorithm/Java

#60_Code Signal Arcade >> Sudoku

2020. 7. 21. 21:12

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
    'Algorithm/Java' 카테고리의 다른 글
    • #59_Code Signal Arcade >> Spiral Numbers
    • #58_Code Signal Arcade >> Message From Binary Code
    • #57_Code Signal Arcade >> File Naming
    • #56_Code Signal Arcade >> Digits Product
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바