본문 바로가기

백준 사이트 코딩 문제

(23)
백준 15649번: N과 M (1) (Kotlin 코틀린) 문제 링크 : www.acmicpc.net/problem/15649 단순 백트래킹 문제이다. 1. Dfs를 이용해 모든 수열을 탐색한다 (단 이미 방문한 숫자가 나오는 경우는 제외 - 백트래킹) 2. m개의 숫자가 완성되어 수열이 완성되면 숫자를 출력한다. (숫자를 탐색할 때 오름차순으로 탐색하니 자동으로 사전 순으로 출력된다.) import java.io.* import java.util.* val br = BufferedReader(InputStreamReader(System.`in`)) val bw = BufferedWriter(OutputStreamWriter(System.out)) var n = 0 var m = 0 val check = BooleanArray(10, { false }) fun ..
백준 9663번: N-Queen (C++) 문제 링크 : www.acmicpc.net/problem/9663 단순 백트래킹 문제다. 그냥 무작정 다 배치한 다음 확인을 하면 n^n이라는 어마어마한 시간복잡도가 나오게 된다. 결국 백트래킹을 사용해야한다. 1. 한 줄씩 queen을 놓아본다. 2. queen을 놓을 수 없는 상황이오면 바로 돌아간다.(백트래킹) #include #include using namespace std; vector queen; int n; int result = 0; bool can_exist(int x,int y) //해당 위체에 queen놓을 수 있는지 { for (int i = 0; i < queen.size(); i++) { int x2 = queen[i].first; int y2 = queen[i].second;..
백준 1753번: 최단경로 (C++) 문제 링크 : www.acmicpc.net/problem/1753 단순한 다익스트라 알고리즘 문제다. 내 블로그에 다익스트라 알고리즘에 대해 다 설명해 놓았다. 다익스트라 알고리즘 : wlshddlek.tistory.com/36?category=887632 #include #include #include using namespace std; vector a[20002]; int d[20002]; int INF = 987654321; void dijkstra(int start) { fill(&d[0], &d[20001], INF); priority_queue q; q.push(make_pair(0,start)); d[start] = 0; while (!q.empty()) { int node = q.top(..
백준 1717번: 집합의 표현 (C++) 문제 링크 : www.acmicpc.net/problem/1717 응용없는 단순한 유니온 파인드(disjoint set)알고리즘이다. 1-1. type이 0이면 두 노드들의 root를 합친다. -> d배열에 각 노드들의 부모를 가리키도록 저장한다.(재귀로 끝까지 가보면 root가 나오게 됨) 1-2. type이 1이면 두 노드의 집합 여부를 출력한다. (root노드가 같으면 결국 같은 집합임) #include using namespace std; int d[1000002]; int find_root(int a) //해당 집합의 root 찾아서 반환 { if (d[a] == a)return a; return find_root(d[a]); } void make_union(int a, int b) //두 집합..
백준 14891번: 톱니바퀴 (C++) 문제 링크 : www.acmicpc.net/problem/14891 특별한 알고리즘이 없는 단순 구현, 시뮬레이션 문제이다. 자세한 설명은 코드 주석으로 달아놨다. 1. 해당 톱니를 움직인다. 2. 왼쪽 톱니들을 확인하며 움직일 톱니들을 움직인다. 3. 오른쪽 톱니들을 확인하며 움직일 톱니들을 움직인다. 4. 점수들은 계산해준다. #include #include #include using namespace std; deque wheel[4]; void move_wheel(int id, int dir) //id톱니 dir방향으로 움직이기 { if (dir == -1) //반시계방향 { wheel[id].push_back(wheel[id][0]); wheel[id].pop_front(); } else //시..
백준 1167번: 트리의 지름 (C++) 문제 링크 : www.acmicpc.net/problem/1167 tip) 임의의 한 점에서 제일 먼 점은 반드시 지름의 양 끝 점 중에 하나라는 사실만 생각해내면 된다. 1. 임의의 한 점에서 제일 먼 점을 찾는다. (지름의 끝 점 중 하나를 찾는다) 2. 그 점으로 부터 제일 먼 점까지의 거리를 구한다 -> 제일 먼 점을 찾는건 bfs 나 dfs로 구한다. #include #include #include #include using namespace std; vector a[100002]; bool check[100002]; int max_cost = 0; int result = 0; int find_corner(int start) { queue q; q.push(make_pair(start, 0));..
백준 12865번: 평범한 배낭 (C++) 문제 링크 : www.acmicpc.net/problem/12865 다이나믹 프로그래밍 문제이다. (knapsack 문제) 1. 특정 아이템을 넣을지 말지의 경우를 모두 저장하며 구해나간다. - 아이템 마다 결정할 때 가방의 무게가 w ~ k일 때의 모든 경우를 저장하여야 한다. (w미만은 어차피 넣을 수 없으니 고려할 필요가 없음) 2. 마지막 아이템까지 다이나믹 프로그래밍을 진행하면 결국 가방 무게가 k일때의 d[k]값이 정답이다. - knapsack문제를 2차원 배열에 저장하며 계산한다면 좀 더 이해하기 직관적일 것이다. 하지만 메모리를 아끼기 위해 1차원 배열로 알고리즘을 구현하였다. - 1차원 배열을 이용한다면 배열을 계속 갱신할 때 뒤에서 부터 갱신하여야 한다. 뒤에서 부터 갱신하여야 그 전의..
백준 17822번: 원판 돌리기 (C++) 문제 링크 : www.acmicpc.net/problem/17822 시뮬레이션, 구현 문제라서 딱히 특별한 알고리즘은 없다. 1. 원판의 층과 원판마다의 수를 이차원배열로 저장하면 편하다. (x축 - 원판 층, y축- 원판의 숫자들) 2. x의 배수들의 원판들을 조건만큼 회전 시켜준다. (ex - 배열의 앞의 숫자를 떼어서 맨 뒤에 붙이면 반시계방향 ) 3. 원판들의 수를 탐색하면서 인접한 같은 수들을 제거해준다 (dfs를 이용) 4. 인접한 같은 수가 하나도 없다면 평균 값을 구해서 조건에 따라 증가 또는 감소를 시켜준다. 5. 2,3,4를 끝날 때 까지 수행 1.원판인것을 잊으면 안된다. 탐색할 때 배열의 끝을 넘어가면 배열의 시작점으로, 배열의 시작점을 벗어나면 배열의 끝으로 이동하여야 한다. 2...
백준 17837번: 새로운 게임 2 (C++) 문제 링크 : www.acmicpc.net/problem/17837 구현 , 시뮬레이션 문제다. 문제에서 설명되어있는 그대로 구현을 하면 된다. 설명할 것이 딱히 없어서 코드에 주석처리만 해놓았다. #include #include using namespace std; class ins { public: int x, y, d; ins(int x, int y, int d) { this->x = x; this->y = y; this->d = d; } }; int n, k; int map[14][14]; vector map2[14][14]; //이차원 배열을 vector로 선언 (숫자들 쌓으려고) vector chess_piece; //체스말 정보 저장 int dir[5][2] = { {0,0}, {0,1},{..
백준 17779번: 게리맨더링 2 (C++) 문제 링크 : www.acmicpc.net/problem/17779 1. 이차원 배열을 순차 탐색하며 기준점과 d1,d2를 정해준다. 2. 기준점부터 왼쪽으로 내려가는 좌표와 오른쪽으로 내려가는 좌표를 나누어서 탐색한다. 3. 행마다,,, 1~lefty 는 왼쪽 영역, lefty ~ righty 는 가운데 영역, righty ~ n 까지는 오른쪽 영역 으로 구분해서 채운다. (아랫부분일때는 증가방식을 반대로 한다.) 4. 5영역의 경계선이 없는 행들도 다 채워준다. 5. 1,2,3,4를 반복한다. #include #include using namespace std; int map[22][22]; int n; int go_left[2] = { 1,-1 }; int go_right[2] = { 1,1 }; ..