본문 바로가기

전체 글

(168)
백준 16946 벽 부수고 이동하기 4 16946번: 벽 부수고 이동하기 4 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 한 칸에서 다른 칸으로 이동하려면, 두 칸이 인접해야 한다. 두 칸이 변을 공유할 때, 인접하다고 한다. 각각의 벽에 대해서 다음을 구해보려고 한다. 벽을 부수고 이동할 수 있는 곳으로 변경한다. 그 위치에서 이동할 수 있는 칸의 개수를 세어본다. www.acmicpc.net 맵의 크기가 10^6이고, 최악 매번 10^6만큼 탐색을 수행하면 10^12이고, 10^9를 초과한다. 벽을 시작점으로 빈칸을 탐색하면 중복 연산이 발생한다. 이를 방지하기 위해서는 빈칸을 시작점으로 빈칸을 탐색하여 빈칸 그룹들의 크기를 산출한다. -> 10^6 벽마..
모든 일에 책임감을 가지고 최선을 다하자 '모든 일에 책임감을 가지고 최선을 다하자'고 깨달으며 내 자신을 응원했다. 해결한 코딩 문제에 대한 블로그 글을 작성하면서 어제 스터디에서 소개받은 블로그들이 생각났다. 그들도 문제를 해결해서 지치고 바쁜 와중에 글을 작성했었을텐데도 탁월한 완성도를 보였다. 매순간 최선을 다했기에 그러한 블로그가 탄생했고 입소문을 타게된 것일 터. 나도 문제를 해결하는데에서 그치지 말고 블로그를 작성하는데에도 더 많은 노력을 기울여야겠다. '코딩 문제가 잘 해결되지 않을 때는 쉬운 문제로 회귀하자'를 깨달았다. 쉬운 문제를 푸는 것으로도 실력 향상폭을 느낄 수 있다. 설명회 때 뵌 선배도 그랬듯이 어려운 문제를 풀면서 스트레스 받지 말고 쉬운 문제를 풀며 흐름을 끊어주자. 추위를 두려워하지 않고 완연한 겨울을 느낄 수..
인접성 판단하기 search - grouping 내부 외부 여부 파악(grouping 후 이웃하는 그룹의 이웃 번호나 out여부 활용) 백준 2638 치즈(외부 공기 파악: out과 이웃한 0들의 그룹) 백준 16988 Ba...aduk2(easy) (고립된 검은 돌 파악: 빈칸과 이웃하지 않은 검은 돌의 그룹)
백준 14502 연구소 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크기가 N×M인 직사각형으로 나타낼 수 있으며, 직사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는 빈 칸, 벽으로 이루어져 있으며, 벽은 칸 하나를 가득 차지한다. 일부 칸은 바이러스가 존재하며, 이 바이러스는 상하좌우로 인접한 빈 칸으로 모두 퍼져나갈 수 있다. www.acmicpc.net 안전 영역의 크기를 구하는 공식을 잘못 구했다. 빈칸의 개수에서 추가된 벽의 개수(3)와 확산된 바이러스의 개수를 빼면 안 된다. DFS에서 거쳐간 모든 바이러스의 개수가 빠지고, 확산되기 전 바이러스도 포..
2020.01.02 일일 성과표 시각 학습내용 학습결과 소요시간 개념 코딩 불 통과 0.5시간 톱니바퀴 통과 0.5시간 집합 통과 0.5시간 기타 싸탈모 알고리즘 스터디 완료 4시간 총 학습 시간 5.5시간 개선점 안 풀리는 문제 오래 잡고 있지 말 것
백준 2547 불 5427번: 불 문제 상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에는 불이 붙지 않는다. 상근이는 동서남북 인접한 칸으로 이동할 수 있으며, 1초가 걸린다. 상근이는 벽을 통과할 수 없고, 불이 옮겨진 칸 또는 이제 불이 붙으려는 칸으로 이동할 수 없다. 상근이가 있는 칸에 불이 옮겨옴과 동시에 다른 칸으로 이동할 수 있다. 빌딩 www.acmicpc.net BFS에서 탈출시간을 구해야 하는 경우 parent부(q.pop()과 for(d < 4) 전)에 탈출조건 배치할 것! 일반적으로 map을 벗어나는 경우 push하지 않는게 맞지만, 해당 문제에서는 map을 벗..
백준 1290 배럭 1290번: 배럭 첫재 줄에 상대방의 배럭을 파괴시키고, 상대방의 마린을 모두 죽이려고 할 때, 필요한 최소 턴의 수를 출력한다. 불가능한 경우에는 -1을 출력한다. www.acmicpc.net loop fision을 시도했지만 적용 불가한 문제로 판명되었다. #include using namespace std; intN, B, U, M, TU, t; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> B >> U; for(t = 1; ; ++t) { B -= N; N -= TU; if (B > 0) { TU += U; } else { break; } } TU += B; for (; TU > 0 && N > 0; ..
백준 1011 Fly me to the Alpha Centauri 로그인 www.acmicpc.net #include using namespace std; int T, x, y; unsigned int sq[46343]; int main() { for (int i = 0; i > T; while (T--) { cin >> x >> y; int n = y - x; for (int i = 0; i = n) { if (sq[i - 1] + i - 1 >= n) { cout