본문 바로가기

Algorithm/Code Fights (Code Signal)

Aracade Intro #60 sudoku. Algorithm,알고리즘,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive

Aracade Intro #60 sudoku. Algorithm,알고리즘,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive



문제를 풀어놓은지는 거의 1년이 넘었는데, 드디어 아케이드 60문제의 마지막을 올리게 되었다. 풀어놓았던 것이라서 다시 풀고 정리하며 제대로 올리고 싶었지만, 다시 풀기가 상당히 귀찮게 느껴져서 처리과정만 정리해서 60개 다 올린 것도 다행이라 생각한다. 아케이드 말고 코드시그널의 다른 챕터 문제들도 풀어둔게 있지만, 이제 릿코드 문제를 가끔 새로 풀면서 올리려고 한다.


 I solved arcade problem in codefights(codesignals) almost a year ago, but I finally post this last solution of 60 Questions. At first, I wanted to re-solve each problem and post clean code, but it was so tired for me to do again, so I barely did just order process sentences. I also have some other solutions in codefights, but I'll solve leetcode and post it, new one.



Q.


 Sudoku is a number-placement puzzle. The objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 sub-grids that compose the grid contains all of the digits from 1 to 9.

This algorithm should check if the given grid of numbers represents a correct solution to Sudoku.

 스도쿠는 숫자를 채워넣는 퍼즐 게임이다. 목표는 9x9 사이즈 그리드의 각 가로세로줄을 숫자로 채워넣는 것이고, 각 3x3 사이즈의 하위 그리드는 1부터 9의 숫자로 채워져 있어야 한다.

 이 알고리즘은 주어진 숫자 그리드가 스도쿠에 적합한 풀이인지를 체크해야 한다.

e.g.


For the first example below, the output should be true. For the other grid, the output should be false: each of the nine 3 × 3 sub-grids should contain all of the digits from 1 to 9.


1번 예제는, 아웃풋이 true 이다.

2번 예제는, 아웃풋이 false 이다. 각 3x3 하위그리드에서 겹치는 숫자들을 가지고 있다.




//Process

//1. Input 9x9 grid
//2. iterate from begin to the end of 2d vector
// 2.1. Check if it has same number on the same row
// 2.2. Check if it has same number on the same column
// 2.3. Check if it has same number on the same 3x3 grid
//3. Return result
//4. Finish


//처리과정
//1. 9x9 그리드를 입력받는다.
//2. 전체 시작부터 끝까지 반복한다.
// 2.1. 행에 같은 숫자가 있는지 확인한다.
// 2.2. 열에 같은 숫자가 있는지 확인한다.
// 2.3. 3x3 그리드에 같은 숫자가 있는지 확인한다.
//3. 결과를 반환한다.
//4. 끝낸다.




Code.. Lemme see code!!!!!


코드.. 코드를 보자!!!!!





bool sudoku(std::vector<std::vector<int>> grid) {


    bool result = true;

    

    for (int i = 0; result && i < grid.size(); i++) 

    {

        for (int j = 0; result && j < grid[0].size(); j++) 

        {

            if (checkSameRow(grid, i, grid[i][j])) 

            {

                if (checkSameColumn(grid, j, grid[i][j])) 

                {

                    result = checkSameBlock(grid, i , j , grid[i][j]);

                } 

                else 

                {

                    result = false;

                }

            } 

            else 

            {

                result = false;

            }

        }

    }    

    return result;

}



/**

 * Process

 * 1. Input 9x9 grid vector, i(rowIndex), j(columnIndex), value

 * 2. Check i's remainder after dividing by 3

 *  2.1. If 1 -> Check j's remainder after dividing by 3

 *   2.1.1. If 1 -> check if it has same value on the area

 *   2.1.1. If 2 ->

 *   2.1.1. If 0 ->

 *  2.2. If 1 -> Check j's remainder after dividing by 3

 *   2.2.1. If 1 ->

 *   2.2.1. If 2 ->

 *   2.2.1. If 0 ->

 *  2.3. If 1 -> Check j's remainder after dividing by 3

 *   2.3.1. If 1 ->

 *   2.3.1. If 2 ->

 *   2.3.1. If 0 ->

 * 3. Return the answer

 * 4. Finish

 */

bool checkSameBlock(std::vector<std::vector<int>> grid, int i, int j, int value) {

    bool answer = true;

    

    i+=1;

    j+=1;

    

    int iRemainder = i % 3;

    int jRemainder = j % 3;

    int count = 0;

    

    if (iRemainder == 1) {

        if (jRemainder == 1) {        

            for (int k = i-1; k < i-1 + 3; k++) {

                for (int l = j-1; l < j-1 + 3; l++) {

                    if (grid[k][l] == value) {

                        count++;

                    }

                }

            }

        } else if (jRemainder == 2) {

            for (int k = i-1; k < i-1 + 3; k++) {

                for (int l = j-1-1; l < j-1+2; l++) {

                    if (grid[k][l] == value) {

                        count++;

                    }

                }

            }

        } else if (jRemainder == 0) {

            for (int k = i-1; k < i-1 + 3; k++) {

                for (int l = j-1-2; l < j-1+1; l++) {

                    if (grid[k][l] == value) {

                        count++;

                    }

                }

            }

        }

    } else if (iRemainder == 2) {

        if (jRemainder == 1) {

            for (int k = i-1-1; k < i-1 + 2; k++) {

                for (int l = j-1; l < j-1 + 3; l++) {

                    if (grid[k][l] == value) {

                        count++;

                    }

                }

            }

        } else if (jRemainder == 2) {

            for (int k = i-1-1; k < i-1 + 2; k++) {

                for (int l = j-1-1; l < j-1+2; l++) {

                    if (grid[k][l] == value) {

                        count++;

                    }

                }

            }

        } else if (jRemainder == 0) {

            for (int k = i-1-1; k < i-1 + 2; k++) {

                for (int l = j-1-2; l < j-1+1; l++) {

                    if (grid[k][l] == value) {

                        count++;

                    }

                }

            }

        }

    } else if (iRemainder == 0) {

        if (jRemainder == 1) {

            for (int k = i-1-2; k < i-1 + 1; k++) {

                for (int l = j-1; l < j-1 + 3; l++) {

                    if (grid[k][l] == value) {

                        count++;

                    }

                }

            }

        } else if (jRemainder == 2) {

            for (int k = i-1-2; k < i-1 + 1; k++) {

                for (int l = j-1-1; l < j-1+2; l++) {

                    if (grid[k][l] == value) {

                        count++;

                    }

                }

            }

        } else if (jRemainder == 0) {

            for (int k = i-1-2; k < i-1 + 1; k++) {

                for (int l = j-1-2; l < j-1+1; l++) {

                    if (grid[k][l] == value) {

                        count++;

                    }

                }

            }

        }

    }

    if (count > 1) {

        cout << "last";

        answer = false;

    }

    return answer;

}


bool checkSameRow(std::vector<std::vector<int>> grid, int index, int value) {

    int count = 0;

    for (int i = 0; i < grid[index].size(); ++i) 

    {

        if (grid[index][i] == value) 

        {

            ++count;

        }

    }

    if (count > 1) 

    {

        cout << "same row";

        return false;

    } 

    else 

    {

        return true;

    }

}


bool checkSameColumn(std::vector<std::vector<int>> grid, int index, int value) {

    int count = 0;

    for (int i = 0; i < grid.size(); ++i)

    {

        if (grid[i][index] == value) 

        {

            ++count;

        }

    }

    if (count > 1) 

    {

        cout << "same column";

        return false;

    } 

    else 

    {

        return true;

    }

}



Something else you might like..




2018/12/26 - [Programming/Design Pattern ] - Perfecting OO's Small Classes and Short Methods. 완벽한 객체지향의 작은 클래스와 짧은 메소드, Book:ThoughtWorks Anthology, Java,cpp,자바,oop,좋은코드,객체지향프로그래밍


2019/01/12 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #59 spiralNumbers. Algorithm,알고리즘,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive

2019/01/08 - [분류 전체보기] - Aracade Intro #58 messageFromBinaryCode. Algorithm,알고리즘,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive

2019/01/07 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #57 fileNaming. Algorithm,알고리즘,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive

2019/01/04 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #56 digitsProduct. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제,문제해결능력,example, c++ java c# scalar

2019/01/04 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #55 differentSquares. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제,문제해결능력,example, c++ java c# scalar

2019/01/02 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #54 sumUpNumbers. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제,문제해결능력,example, c++ java c# scalar

2019/01/02 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #53 validTime. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제,문제해결능력,example, c++ java c# scalar

2019/01/02 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #52 longestWord. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제, example, c++ java c# scalar

2019/01/01 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #51 deleteDigit. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제, example, c++ java c# scalar

2018/12/31 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #50 chessKnight. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제, example, c++ java c# scalar

2018/12/28 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #49 lineEncoding. Algorithm, 알고리즘 문제풀이, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제, example, c++ java c# scalar

2018/12/26 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #48 isDigit. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제, example, c++ java c# scalar

2018/12/26 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #47 isMAC48Address. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제, example, c++ java c# scalar

2018/12/25 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #46 electionsWinners. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제, example, c++ java c# scalar

2018/12/21 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #45 buildPalindrome. Algorithm, 알고리즘, Codefights, CodeSignal, 코드파이트, 코드시그널, 예제, example, c++ java c# scalar


2018/12/20 - [Programming/Java] - How to convert file to byte array (byte[]) example, 파일 객체 바이트로 변환하기 예제코드, java/cpp/c++/scalar


2018/12/18 - [Programming/Java] - How to access controller from existing Pane in JavaFX, pane에서 해당 controller로 접근하기, java/cpp/c++/fx/gui


2018/12/13 - [Computer/Linux] - How to check ongoing live process on Linux cmd, 리눅스 커맨드창에서 어떤 프로세스가 실행중인지 확인하기, java, ubuntu, cpp



2019/01/02 - [Life/Health care] - Taurine 타우린 usage/side effects/dosage/fatigue/supplement,효능/부작용/성인,소아 용법/건강/피로회복/영양제

2019/01/08 - [Life/Health care] - VitaminD 비타민디 usage/side effects/dosage/fatigue/supplement/antioxidant/효능/부작용/성인,소아 용법/건강/피로회복/영양제/항산화

2018/12/27 - [Life/Health care] - Milk-Thistle 밀크시슬 usage/side effects/dosage/fatigue/supplement,효능/부작용/성인,소아 용법/건강/피로회복/영양제

2018/12/16 - [Life/Health care] - L-Arginine 아르기닌 usage/side effects/dosage 효능/부작용/성인,소아 용법(2)

2018/12/06 - [Life/Health care] - Vitamin C 비타민 씨 usage/side effects/dosage 용법/효능/부작용

2018/12/02 - [Life/Health care] - Maca 마카 usage/side effects/dosage 효능/부작용/용법