본문 바로가기

알고리즘4

[BOJ][C++] 17471 게리맨더링 문제 https://www.acmicpc.net/problem/17471 17471번: 게리맨더링 선거구를 [1, 4], [2, 3, 5, 6]으로 나누면 각 선거구의 인구는 9, 8이 된다. 인구 차이는 1이고, 이 값보다 더 작은 값으로 선거구를 나눌 수는 없다. www.acmicpc.net 풀이 두 팀으로 나누되, 갯수가 정해져있지 않은 조합 문제입니다. 코드가 다소 깔끔하지 못한 점 양해 부탁드립니다. 크게 세 단계로 나누어 풀이했습니다. 1. 두 팀으로 나누기 2. 나눠진 팀의 연결 상태 확인 3. 인구 차이 최소값인지 확인 1. 두 팀으로 나누기 (DFS) DFS로 팀을 나눕니다. team배열에 0과 1로 구분을 해줍니다. 이때, [0,0,0,1,1,1] 과 [1,1,1,0,0,0]은 같은 결.. 2020. 4. 16.
[BOJ][C++] 17135 캐슬 디펜스 문제 https://www.acmicpc.net/problem/17135 17135번: 캐슬 디펜스 첫째 줄에 격자판 행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가 주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다. www.acmicpc.net 풀이 5단계로 나누어서 구현을 했습니다. 그리 효율적인 것 같진 않은데, 더 좋은 방법이 있다면 공유해주세요! 1. 궁수 자리 배치(DFS) 2. 궁수들의 공격할 적 정하기(적이 모두 사라질 때까지 반복) 3. 공격받은 적 없애기 4. 적의 이동 5. 결괏값 확인 1. 궁수 자리 배치 조합으로 구현했습니다. 2. 궁수들의 공격할 적 구하기 궁수 자리 배치가 끝나고 cnt==3 조건이 만족되면, 궁수 3.. 2020. 4. 14.
[BOJ][C++] 14503 로봇청소기 [BOJ][C++] 14503 로봇청소기 풀이 1. 청소를 한다. 이 때 한 번 청소한 곳은 또 방문하면 안되기 때문에 visited를 이용합니다. 방향을 바꿀땐 사방을 다 탐색하면 후진해야하기 때문에 이를 cnt를 이용해 꼭 체크해줍니다. 1-1. map[nx][ny]가 청소할 수 있을 때 (map[nx][ny]==0 && visited[nx][ny]==0) : 다음 좌표, dir 바꾸어 func호출 1-2. map[nx][ny]가 청소할 수 없을 때 : 청소기의 방향 회전이 필요합니다. = dir, cnt+1 로 func호출 2. 후진해야 하는 경우 (cnt==4) cnt==4 일때는 사방이 벽이거나 청소를 한 경우입니다. 이 때, 후진을 해줘야하는데 후진을 할 수 있다면 다음 좌표로 옮기면 되고, .. 2019. 6. 25.
[BFS] 백준 2606 바이러스 [BFS] 백준 2606 바이러스 [문제 출처] https://www.acmicpc.net/problem/2606 * BFS에 대한 개념BFS는 재귀 호출(Recursion Call)을 이용하여 소스 코드로 구현하는 DFS와는 달리, 자료 구조 Queue를 사용하는 경우가 일반적이다. 배열에서 사용하는 경우, 방향 데이터를 이용해 배열의 시작점에서 범위를 넖혀 가면서 탐색하는 것이다. [참조] https://namu.wiki/w/BFS * Queue의 이용 [참조] https://namu.wiki/w/%ED%81%90(%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0) [풀이과정]양방향을 꼭 체크해주어야 한다. 이 부분을 놓친다!!!! [코드]1234567891011121314151617.. 2018. 1. 14.