본문 바로가기

백준 문제 풀이

(148)
백준 17070번 파이프 옮기기 1(C++) 가장 먼저 생각할 수 있는 방법은 DFS였다. 최소로 이동하는 것도 아니고 각 지점마다 움직일 수 있는 방법이 한정되어있다. 각 노드에서 따질 것이 많다면 DFS가 유리하다. 각 지점마다 방향의 상태를 지정해줘야하기 때문이다. 그런데 이 문제를 보면 시간제한이 1초로 빡세지만 집의 크기가 무려 3~16으로 매우 편하게 주었다. N이 조금만 커져도 이 문제는 dfs bfs로 풀 수 없다. 나름 잘 풀었다고 생각했는데도 시간은 104ms로 오래걸렸다. 이 문제의 의도는 다이나믹 프로그래밍이다. dfs로 최적화하는법도 있겠지만 이문제는 온리 DP로만 풀이가 가능한 것 같다. 채점 현황을 보니 골드 하위정도 티어들은 모두 그래프로 풀고 골드 상위부턴 DP로 풀이했다. 다음에 DP로 다시 풀어봐야겠다. 1. 맨 ..
백준 14503번 로봇 청소기 (C++) 골드 4정돈 되야할 것 같은데 골드5이다. 이 문제는 각 위치에서 따져야 할 것이 많다. 일단 4방향을 봐야하는데 순서가 정해져있고, 바라보는 방향까지 고려해야한다. 게다가 후진까지 한다; (가지가지한다) 그래서 각 위치에서 따져줄 수 있는 DFS 가 맞는 풀이법이다. 시간을 고려해서 문제에서 사이즈도 50까지 크지 않게 주었다. dfs에는 위치정보, 방향정보, 그리고 뒤로 돌아올때는 청소로 치지 않으니 돌아왔는지를 체크한다. dfs를 공부한다면 풀어보면 좋을 것 같은 문제이다. 백준에서는 개인적으로 100줄을 넘어가는 걸 안좋아하는데 방향을 따지고 방향에 따라 순서가 또 달라지니 코드가 길어졌다. 다른 사람들은 나머지연산으로 멋있게 풀었던데 난 그 생각은 나지 않아서 노가다로 모두 적어주었다. #inc..
백준 11866번 요세푸스 문제 0 (C++) 처음 봤을 땐 벡터를 사용할까 생각했다. 그러나 분류를 보니 큐가 있었다. 정말 이걸 왜 생각 못했을까, 이걸 코테에서 만났다면 멍청하게 삽질하다가 시간버렸을 것 같다. 아이디어는 간단하다. 1. 큐에서 front 부터 꺼내면서 K번째가 아니면 다시 큐에 쌓는다. 2. K번째이면 큐에 쌓지 않는다. 3. 큐가 빌 때 까지 반복한다. #include #include using namespace std; int main() { queue Q; int N, K; cin >> N >> K; for (int i = 1; i
백준 1475번 방 번호 (C++) 빡구현 문제다. 예외처리를 해주고 너무 쉽게 생각한 것이 문제였다. 처음엔 112233 이런식으로 들어오면 중복할때마다 카운트 1을 쳤다. 그러나 한 "세트" 가 들어오는데 계속 추가하면 비효율적으로 짜게되는 것을 생각해야한다. 그래서 배열을 만들어 각각 숫자가 몇개 들어오는지 파악하고 가장 큰 수의 세트를 현재 필요 세트라고 생각했다. 그리고 6,9는 함께 사용가능한 것도 생각해야한다. 처음에는 일일히 예외처리를 해주려 했다가 피를 봤다. 잘 생각해보면 6,9를 적절하게 분배하면 되는 거다. 왜냐면 6,9가 일단 0이 아니라면 세트가 존재한다는 것이기 때문이다. 세트가 존재하지 않으면 추가를 해준다. 틀린코드 : #include #include #include #include using namespac..
백준 2805번 나무 자르기(C++) #include #include using namespace std; vector tree; int N, M; bool checkTree(int ch) { long long sum = 0; for (auto i : tree) { if (i - ch > 0) sum += i - ch; } if (sum >= M) return true; else return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL); cin >> N >> M; int max = 0; for (int i = 0; i > tmp; tree.push_back(tmp); if (max < tm..
백준 7562 나이트의 이동(C++) #include #include #define MAX 301 using namespace std; int dX[] = { 2,-2, 1,-1, 2 , -1 , -2 , 1}; int dY[] = { 1,-1,2,-2, -1 , 2 , 1 , -2}; int dis[MAX][MAX] = { 0 ,}; bool visited[MAX][MAX] = { false, }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL); int N; int Size; int nightX, nightY; int desX, desY; cin >> N; for (int i = 0; i > Size >>..
백준 1261번 알고스팟(C++) 벽을 부수고 이동한다는게 무슨 말인지 모를 수 있지만 결국 비용이 1인길을 선택하느냐 0인길을 선택하느냐의 차이이다. 우리는 목적지까지 최소한으로 이동해야하기 때문에 최대한 0인부분을 잘 이용해야한다. 그렇기 때문에 이 문제는 0-1 BFS 최소비용 or 다익스트라 문제이다. 처음에는 아래 코드로 했다가 예제에서 틀렸다. #include #include #include #define MAX 1001 using namespace std; int dx[] = { 0,0,1,-1 }; int dy[] = { 1,-1,0,0 }; deque Q; int dis[MAX][MAX]; int wall[MAX][MAX]; bool visited[MAX][MAX] = { false, }; void BFS(int N, i..
백준 13549 숨바꼭질3 (C++) 0-1 BFS, 다익스트라, 우선순위 큐 등 많은 방법으로 풀 수 있지만 한 번도 안해본 0-1 BFS를 사용해 풀어보았다. 이 문제의 출제 의도이자 최적화가 잘되어있어 0ms만에 문제를 풀어낼 수 있다. 0-1 BFS의 대한 알고리즘은 https://tigerfrom2.tistory.com/8 0-1 BFS 너비 우선 탐색 0-1 BFS는 기본적으로 BFS와 동일하지만 간선의 이동 비용이 0과 1인 경우를 이야기한다. 때문에 적은 비용으로 이동하기 위해서는 비용이 0인 간선으로 이동하는 것을 최대한 장려해야한다. 0-1 bf tigerfrom2.tistory.com #include #include #include #define MAX 100001 using namespace std; int N, M; ..