일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- DP
- TensorFlow
- 머신러닝
- Rebase
- 프로그래밍
- stl
- c
- BFS
- spring
- Android
- Kotlin
- vue.js
- 블로그개설
- 카카오인코더
- ADAS
- 백트래킹
- 프로그래머스
- 인코더
- 스프링
- 백준
- retrofit
- 안드로이드
- python3
- 스프링 프레임워크
- Map
- c++
- 연결리스트
- hackerrank
- 스프링프레임워크
- git
Archives
- Today
- Total
이것저것 공부한 기록
C++) 프로그래머스 풀이_N-Queen 본문
https://programmers.co.kr/learn/courses/30/lessons/12952?language=cpp#
백트래킹 공부를 하기 위해 집어든 문제
백트래킹은 말그대로 롤백하면서 세어나가야 하는데
값을 초기화하는 것을 깜빡했..다기 보다는 당연히 매개변수로 전달하고 있으니까
얘가 값이 변한게 초기화될 줄 알았다.
Call by value가 아니였구나 이거? (무식)
무튼 재귀로 구현하는게 편하다.
갠적으로 재귀함수 구현하는 걸 좋아한다(tmi)
처음 접근을... 2차원 배열을 만들어서 하나하나 구하고 넘기고 구하고 넘기고 할 생각이였는데
2차원 배열을 만들면 저장공간이 늘어나는건 둘째치고
넘겨서 사용하기가 너무 귀찮고 계산도 많이 들어간다.
어짜피 같은 열 다른 행에는 Queen을 놓을 수 없으므로
배열로 열 하나만 만들고, count만 올려가며 다른 행 계산을 해준다.
한 행씩 넘어가면서 쭉쭉쭉 찾아보고, 모두 다 놓고나면 (size < count)가 되면 한 판을 완성했다는 의미로 ++ 을 해줌.
그렇게 한판씩 체크하고 롤백해서 올라가게끔 코드를 짜면 됩니다.
#include <string>
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
//같은 열이나 대각선위에 놓인 Queen을 검사하는 함수
//매개변수 -> col, 전체size, 현재 놓으련ㄴ 위치, 몇 번째 열인지
//비어있으면 true return
bool CheckBlank(int col[], int size, int cur, int count)
{
if (col[cur] != 0)
return false;
for (int i = 1; i <= size; ++i)
{
if (col[i] != 0 && abs(cur - i) == abs(count - col[i]))
return false;
}
return true;
}
int SetQueen(int col[], int size, int count)
{
int result = 0;
if (size < count)
{
result++;
}
else
{
for (int i = 1; i <= size; ++i)
{
if (CheckBlank(col, size, i, count))
{
col[i] = count;
result += SetQueen(col, size, count + 1);
col[i] = 0 ;
}
}
}
return result;
}
int main()
{
int size, answer = 0;
cin >> size;
int col[13] = { 0, };
for (int i = 1; i <= size; ++i)
{
memset(col, 0, sizeof(int) * 13);
col[i] = 1;
answer += SetQueen(col, size, 2);
}
cout << answer << endl;
}
'Study > 프로그래밍 문제풀이' 카테고리의 다른 글
C++) 백준 10814번 풀이_나이순 정렬 (3) | 2019.11.07 |
---|---|
C++) 프로그래머스 풀이_기둥과 보 설치 (0) | 2019.10.27 |
C) 프로그래머스 풀이_자연수 뒤집어 배열로 만들기 (0) | 2019.10.26 |
C++) 프로그래머스_전화번호 목록 (0) | 2019.10.26 |
C++) HackerRank 풀이_Alternating Characters (0) | 2019.10.25 |