11/12 Daily Report

1 minute read

11/12 Daily Report

TIL(Today I Learn)

오늘 푼 문제 : BJ9663 - N_Queen

#include <iostream>
#define MAX 15

using namespace std;

int n, result = 0;
int arr[MAX];

bool check(int count){
  for(int i=0; i<count; i++){
    if(arr[count]==arr[i]||abs(arr[count]-arr[i])==count-i){
      return false;
    }
  }
  return true;
}

void N_Queen(int count){
  if(count==n){
    result++;
    return;
  }
  for(int i=0; i<n; i++){
    arr[count] = i;
    if(check(count)){
      N_Queen(count+1);
    }
  }
}

int main() {
  cin >> n;
  N_Queen(0);
  cout << result;
}

진짜 며칠동안 머리 싸메다가 안되겠어서 친구의 도움을 조금 받고 마지막에 인터넷을 조금 찾아보고 풀었다.
처음엔 2차원 배열로 풀려다가 무조건 시간 초과가 뜰 것 같아서 고민하고 있었는데 친구의 조언 덕분에 굳이 2차원 배열이 아닌 1차원 배열로 풀어도 된다는 것을 생각해냈다. 그 후엔 시간이 좀 걸리긴 했지만 제대로 구현하는데 성공했고 예제에 대한 답도 나왔다. 그런데 내가 사용했던 방식은 bool check 함수를 만들어주는 것이 아니라 N_Queen함수에서 2중 for문을 쓰고 int check변수를 선언하여 다음에 오는 퀸이 이전 퀸들의 범위에 들어가지 않는지 확인했었다.
그래서 시간초과가 떴었고 인터넷을 찾아보고 위 코드처럼 바꾸어서 해결했다. 이 방법과 같이 적절하게 함수를 쓰는 것과 bool을 이용하여 조건을 만들어주는 걸 잘 활용해야겠다는 것을 느꼈다.

if(arr[count]==arr[i]||abs(arr[count]-arr[i])==count-i){
      return false;
    }

그리고 이 조건문에서 내가 처음 사용했던 방식은 abs를 사용하지 않고 각 상황에 대해서 조건을 만들어줬었는데 더 효율적인 방법이 있어서 참고하고 수정하였다.

잡담 + ~11/12까지 공부한 내용 요약


예 뭐 solved.ac 실버 2티어를 달성 했고요. 백준 계명대학교 소속 랭킹 30위에 진입했습니다! 요 근래 바빴어서 프로그래머스는 못 했고 저번 주에는 스터디도 참여 못했지만 문제는 꾸준히 풀었습니다.
아 그리고 바빴던 이유 중에 하나로 저번주 일요일(7일)에 밴드부 공연을 했습니다. 이번 달에 훈련소를 가면서 동아리를 나갈 계획이어서 마지막 공연이었는데 꽤 만족스럽게 끝이나서 뿌듯하기도 하고 이제 끝이라고 생각하니 시원섭섭하네요ㅎㅎ
뭐 이제는 스펙 쌓는데 더 집중해야죠. 취업은 해야하니ㅎㅎ…

Leave a comment