본문 바로가기

Programming/BOJ

(42)
[백준/C++] 9663번: N-Queen (DFS, 백트랙킹) 1) 기본가정: 같은 행에 Queen을 놓지 않는다. 2) 유망한 노드인지 확인하는 함수 - 같은 열이나 같은 대각선에 놓이는지 확인 -> 해당되면 유망하지 x - 같은 열 체크: col[i] == col[j] - 같은 대각선 체크: abs(col[i]-col[j]) == i-j #include using namespace std; int col[15]; int N; int cnt = 0; bool promising(int i) { for (int j = 0; j < i; j++) { if (col[j] == col[i] || abs(col[i] - col[j]) == (i - j)) return false; } return true; } void dfs(int i) { //i는 놓은 queen의 수이기..
[백준/C++] 1182번: 부분수열의 합 (DFS) 주의점 1) 연속된 수의 합을 찾는 것이 아니다. ex) N=4, sum=0, arr=[100, 100, 100, -100]일 때, 연속된 수의 합이라면 답이 1개이다. 하지만 (100,-100)조합이 3번 가능하므로 답이 3개이다. 주의점 2) 부분집합의 합이 아니니 중복이 포함된다. ex) N=4, sum=1, arr=[1, -1, 1, 2]일 때, 부분집합의 합이라면 [1], [-1, 2], [1, -1, 1]로 답이 2개이다. 하지만 첫번째 1과 세번째 1은 다른 1로 처리해야한다. 그래서 [1], [1], [-1, 2], [1, -1, 1]로 답이 4개이다. #include #include #include using namespace std; int N, sum; vector arr; int c..
[백준/C++] 1966번: 프린터 큐 (우선순위 큐) 일단 우선순위 큐를 쓸 줄 몰라서 안쓰고 풀어봤다. queue 뿐만 아니라 vector를 활용해서 다시 큐에 들어가지 않는 프린트물이 생길 때 max값을 갱신하였고, 내 프린트물엔 flag를 1로 주어 같이 queue에 넣어주는 형태로 queue의 자료형이 int쌍이 되도록 설정하였다. #include #include #include #include using namespace std; int main() { int test_case; cin >> test_case; for (int i = 0; i > N >> M; vector for_max; queue q; for (int j = 0; j < N; j++) { int a; c..
[백준/C++] 1874번: 스택수열 while문을 돌릴 때 2개의 변수를 사용하였다. (stack에 넣어줄 숫자를 나타내는 num과 현재 target으로 하는 숫자를 가리키는 start변수) 1. top과 target이 같으면 pop하고 아니면 push한다. 2. 종료조건은 start가 target의 마지막 방을 가리킬 때 혹은 지금 num이 target숫자보다 클 때 #include #include #include using namespace std; int main() { int N; cin >> N; vector v; for (int i = 0; i > temp; v.push_back(temp); } stack s; vector oper; int num = 1; int start = 0..
[백준/C++] 1181번: 단어정렬 풀이방향 1. string vector를 만든다. 2. 문장들을 입력받으면서 문장의 길이에 해당하는 배열 index에 갯수 추가 (이 과정을 통해 문장길이가 같은 애들끼리만 사전순 정렬가능) 3. 문장 길이순 정렬 4. while문을 돌면서 vector 내부에서 문장길이마다 사전순 정렬 5. 출력 시 바로 앞 문장과 같다면 출력을 하지 않는 식으로 중복없이 출력 왜 틀렸나 계속 고민하고 있었는데 while문 종료조건을 50으로 했다. 그럼 길이가 50인 문장은 처리를 못하잖아...^^ 오래 고민해서 슬프다. 그래도 문자열 관련 공부하기 좋은 문제! #include #include #include #include using namespace std; int cnt[52] = { 0 }; vector v;;..
[백준/C++] 14868번: 문명 뭔지 모르게 서핑하다가 union-find문제를 발견하였는데 아직 한번도 풀어본 적이 없어서 경험삼아 한번 풀어보았다. 생각보다 개념은 어렵지 않다. 두 개의 다른 집단이 인접하였고 또 서로 index가 다르다면 합치면 된다. 종료조건은 집단이 하나만 남았을 때로 하면 된다. (www.youtube.com/watch?v=_N0hk13QM6w) #include #include using namespace std; int N, K, civ[2002][2002], year; queue q, qq; int p[1000002], Rank[1000002]; int root(int x) { if (x == p[x]) return x; // x라는 값이 해당 부모의 값과 동일하다면 x를 return return roo..
[백준/C++] 13460번: 구슬 탈출2 (어려워) 삼성가기 어렵다... 하루종일 붙잡고 있었다. 유튜브보고 따라 품.... 다시 정리해야겠다. #include #include #include using namespace std; //얘가 큐에 넣는애 struct INFO { int rx, ry, bx, by, cnt; }; INFO start; string map[11]; int dx[] = { 1,0,0,-1 }; int dy[] = { 0,1,-1,0 }; int bfs() { int visit[10][10][10][10] = { 0 }; queue q; q.push(start); visit[start.rx][start.ry][start.bx][start.by] = 1; int ret = -1; while (!q.empty()) { INFO cur ..
[백준/C++] 14923번: 미로탈출 이 문제같은 경우 map이 굉장히 컸다. 사실 바로 이전에 풀었던 문제인 연구소(sanghyu.tistory.com/72?category=1139260)와 유사해보여서 풀었는데, 연구소문제처럼 부르트포스로 풀었더니 시간초과가 났다. 사실 예상했던 결과긴 하지만 다른 방식이 생각나지 않아 그렇게 해봤던 것이다.. 그래서 내 힘으로 도저히 못풀겠어서 다른 분들이 풀었던 답안을 참고해서 공부하였다. ** 가중치1, 최단경로이므로 BFS로 풀어야함 아 그리고 또 실수 했던 부분은 시작점이 (1,1)부터여서 나도 1부터 for문을 돌려놓고 map은 1000을 limit으로 줬더니 당연히 틀린다... 1부터 시작할 거면 1001을 limit으로 했었어야 했는데^^ 그래서 풀이 방법은 다음과 같다. 1) visit배..