반응형

알고리즘 53

[백준][16509번] 장군 [cpp, c++]

백준 16509 장군 BFS를 이용한 문제이다 www.acmicpc.net/problem/16509 16509번: 장군 오랜만에 휴가를 나온 호근이는 문득 동아리방에 있는 장기가 하고 싶어졌다. 하지만 장기를 오랫동안 하지 않은 탓인지 예전에는 잘 쓰던 상을 제대로 쓰는 것이 너무 힘들었다. 호근이를 위해 www.acmicpc.net 풀이 방법 1) BFS를 통해 이동할 수 있는 거리를 탐색한다. (대각선 방향) 2) 큐에 넣기 전에 이동 경로에 장기가 있는지 확인한다. (이동 경로에 장기가 있다면 큐에 넣지 않는다) #include #include #include #include using namespace std; int dx[10] = {-3,-3,-2, 2, 3, 3, 2, -2}; int dy[..

[백준][2638번] 치즈 [cpp, c++]

백준 2638 치즈 BFS를 이용한 문제이다. https://www.acmicpc.net/problem/2638 2638번: 치즈 첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5≤N, M≤100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표 www.acmicpc.net 풀이 방법 1) 외부 공기와 내부 공기를 분리한다. (BFS 사용) - 함수명 outsideBFS() - 문제 조건에 맨 가장자리는 치즈가 놓이지 않는다고 했으니, 0,0을 큐에 넣어서 외부 공기를 체크한다. - 여기에 체크되지 않은 공간은 외부 공기가 아니다. 2) BFS를 통해 녹을 수 있는 치즈를 체크한다. - 함수명 : BFS => m..

[백준][1600번] 말이 되고픈 원숭이 [cpp, c++]

백준 1600 말이 되고픈 원숭이 BFS를 이용한 문제이다. 말이 이동하는 경우, 원숭이가 이동하는 경우를 모두 계산해서 풀면 된다. https://www.acmicpc.net/problem/1600 1600번: 말이 되고픈 원숭이 첫째 줄에 정수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 1은 장애물을 뜻한다. 장애물이 있는 곳으로는 이동할 수 없다. 시작점과 도착점은 항상 평지이다. W와 H는 1이상 200이하의 자연수이고, K는 0이상 30이하의 정수이다. www.acmicpc.net 풀이 방법 1) 3차원 배열을 이용해서, 말처럼 이동하는 경우를 고려해야한다. 2) 말 처럼 이동하는 경우만 ..

[백준][1629번] 곱셈[cpp, c++]

백준 1629 곱셈 재귀로 풀어야 풀 수 있는 문제이다. 재귀에 약한 나는 고생을 많이 했다 ㅠ https://www.acmicpc.net/problem/1629 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net 풀이 방법 1) 이 문제의 시간제한은 2초이다. 1초에 3~5억 번의 연산을 한다고 가정하면, 2초는 10억 번 안에 연산을 끝내야 한다. 2) 최악의 경우 O(n)이라면, 문제의 주어진 수가 최대 21억이기 때문에 시간 초과가 뜨게 된다. 3) 즉, O(n) 보다 낮은 알고리즘을 이용해한다. 4) b를 짝수 일 때, 홀수 일 때를 나눠서 생각해본다. 2^10이면 b..

[백준][2644번] 촌수계산[cpp, c++]

백준 2644 촌수계산 완전 탐색 문제이다. https://www.acmicpc.net/problem/2644 문제풀이 1) 주어지는 좌표(촌수)에 대한 그래프를 생성한 후, 시작 좌표(촌수) 끝 좌표(촌수)의 거리를 구하면 되는 문제이기 BFS, DFS 둘 중 하나를 쓰면된다. 2) 나는 BFS가 더 편하기에 BFS를 사용했다.. #include #include #include #include #include using namespace std; int a[102][102]; queue q; int check[102]; int n, s, e, m, x, y; void input_data() { cin >> n >> s >> e >> m; for (int i = 0; i >..

[백준][9466번] 텀 프로젝트[cpp, c++]

백준 9466번 텀 프로젝트 시간초과에 주의해야되는 문제이다. https://www.acmicpc.net/problem/9466 풀이 방법 1) 한번에 탐색만에 사이클이 있고, 없고를 판단하면서 지나가야한다. 2) 1->2->3->4->5->4 라는 것이 있으면 4,5가 사이클이다. 여기서 4,5가 사이클임을 파악해야되고, 6번으로 바로 넘어가야 시간초과가 뜨지 않는다. #include #include #include #include using namespace std; int ans; int visited[100000]; //방문횟수 담는 배열 bool check[100000]; // 사이클을 찾았다는 뜻 int student[100000]; int T, number; void input_data() ..

[백준][6593번] 상범 빌딩[cpp, c++]

백준 6593 상범 빌딩 3차원 bfs문제이다 https://www.acmicpc.net/problem/6593 6593번: 상범 빌딩 문제 당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어 지나갈 수 없거나, 비어있어서 지나갈 수 있게 되어있다. 당신은 각 칸에서 인접한 6개의 칸(동,서,남,북,상,하)으로 1분의 시간을 들여 이동할 수 있다. 즉, 대각선으로 이동하는 것은 불가능하다. 그리고 상범 빌딩의 바깥면도 모두 금으로 막혀있어 출구를 통해서 www.acmicpc.net 풀이 방법 1) bfs로 해결하면 된다. 2) 큐, 배열 초기화 잊지 말자 ! #incl..

[백준][2146번] 다리 만들기[cpp, c++]

백준 2146번 다리 만들기 BFS로만 풀 수 있지만, DFS와 BFS 둘 다 이용할 수 있는 문제이다. https://www.acmicpc.net/problem/2146 풀이방법 1) 각 나라를 구분짓기 위해 bfs나 dfs를 사용한다. 나는 bfs를 사용했다. 2) 각 나라를 구분지은 후, 나라와 나라 사이의 최단거리를 BFS로 구한다. 2146번: 다리 만들기 여러 섬으로 이루어진 나라가 있다. 이 나라의 대통령은 섬을 잇는 다리를 만들겠다는 공약으로 인기몰이를 해 당선될 수 있었다. 하지만 막상 대통령에 취임하자, 다리를 놓는다는 것이 아깝다는 생각을 하게 되었다. 그래서 그는, 생색내는 식으로 한 섬과 다른 섬을 잇는 다리 하나만을 만들기로 하였고, 그 또한 다리를 가장 짧게 하여 돈을 아끼려 ..

[백준][13913번] 숨바꼭질 4[cpp, c++]

백준 13913 숨바꼭질4 https://skd03052.tistory.com/150 의 응용문제이다. bfs와 역추적이 필요하다. https://www.acmicpc.net/problem/13913 13913번: 숨바꼭질 4 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 www.acmicpc.ne..

[백준][13549번] 숨바꼭질 3[cpp, c++]

백준 13549 숨바꼭질3 bfs 문제이다. 기존 숨바꼭질과 로직이 살짝 다르다. https://www.acmicpc.net/problem/13549 13549번: 숨바꼭질 3 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 www.acmicpc.net 풀이방법 1) 순간이동의 시간은 0초니깐 순간이..

반응형