9663. N-Queen

·2025년 6월 10일

백준 알고리즘

목록 보기
176/350

결론

: 조합이라고 생각해서 코드를 진짜 그냥 조합코드로 작성하는 것이 아니다.

  • 문제에 맞게 작성해야 한다.
    -> 아래에서 설명함.

260528

  • 일단 Check 함수는 맞다.
    : 대각선, 가로, 세로 체크
bool Check(int y, int x)
{
    // 대각선 , 가로, 세로 전부 다 확인
    
    // 1,0인 경우에는 
    // 대각선은 4가지를 볼까??? 
    
    // 2,1 // 3,2 // 4,3(X)
    
    for(int i = 0; i < 4; ++i)
    {
        int tY = y;
        int tX = x;
        
        while(tY >= 0 && tY < ssize && tX >= 0 && tX < ssize)
        {
            tY += dirs[i].first;
            tX += dirs[i].second;
            
            if(tY >= 0 && tY < ssize && tX >= 0 && tX < ssize)
            {
                if(vertex[tY][tX] == 1)
                    return false;                
            }  
        }        
    }
    
    
    for(int i = 0; i < ssize; ++i)
    {
        if(vertex[i][x] == 1)
            return false;        
    }
    
    for(int i = 0; i < ssize; ++i)
    {
        if(vertex[y][i] == 1)
            return false;
    }
    
    return true;
}

문제 해결 전략

: 순서에 관계 없이 일단 한번 맞춰지면 다시 진행할 필요 없어서.
조합으로 해야겠다는 생각을 해서

  • 아무 생각없이 단순히 코드를 이렇게 작성했다.

-> 27.3점 맞음.

  • 그런데 문제를 풀면서 드는 생각이 앞쪽으로 와서 순회를 해야할텐데??? 라는 생각을 했고,

  • 문제에서 힌트가 있다.

    : 이거는 어떻게 할건데? 그래서 이렇게 변경함.

  • x축은 0으로 복귀를 해야 한다.

    => 90점 맞음.

  • y쪽은 어쨋든 for문 형태이기 때문에 1번 y값부터 시작할수 있다.


시간 초과..

  • 문제를 보면 , n이 12인데, 12X12 격자 구조이기 때문에

시간복잡도는
최악으로 해서 12! 이고
이중for문이기 때문에 -> 12! 12 12이다.

  • 그래서 y쪽 for문을 지우자.

  • 정답

profile
🔥🔥🔥

0개의 댓글