[ 백준 17471 ] 게리맨더링 (C++)
[문제보기] [해결과정] 1. input : n, arr (int형) 배열에 각각의 인원수 담기 -> 2차원 vector에 각각의 점에 간선 긋기 2. dfs(int count, int r(레드갯수), int b(블루갯수)) -> count != n+1 이라면, color에 색칠 후에 dfs(count+1, 색칠한곳+1, 색칠안한곳) 전송 -> count == n+1 이라면 아래 3번 수행 3. function -> red, blue 각각의 진영 갯수 0으로 초기화 -> redSum, blueSum 각각의 총합 0으로 초기화 -> 방문 체크 배열(check) 초기화 -> rf, bf 플래그 초기화 -> 1~N까지 점을 돌며, 레드 진영 한번, 블루 진영 한번.. 각각 한번씩 정점을 큐에 넣고 그 색에 대..
2020. 2. 27.
[ 백준 1405 ] 미친 로봇 (C++)
[문제보기] [해결과정] 1. input : n, double 형 d[4] ( 동, 서, 남, 북 ) -> d[i]/=100으로 해서 소수점으로 변환 2. 동, 서, 남, 북으로 이동하는 것을 맵에서 check 하기 위해서 map배열을 만들어준다. -> 맵의 가장 중앙 지점을 방문 처리 한다. 3. 맵의 가장 중앙 지점 부터 dfs 실행 -> dfs(y,x, cnt, p) cnt는 dfs count이고, p는 확률(소수)를 담을 변수 -> 만약, 단순한 경로(겹치지 않는 경로) 일 경우 ret += p -> 현재까지의 확률을 정답란에 저장 -> 만약, 단순한 경로가 아닌 경우(이미 방문한 지점을 방문) 패스 4. output : 소수점 11자리 까지 지정하여 출력 -> cout.precision(11);..
2020. 2. 26.
[ 백준 1926 ] 그림 (C++)
[문제보기] [해결과정] 1. input -> n, m (세로, 가로) 변수, arr (map 2차원 배열) 2. arr 맵을 돌며, arr[i][j]==1 이고, check[i][j]==0 (방문하지않음) 이라면, 진입 -> group(집합 갯수)를 +1 시키고, cnt(원소 갯수)를 1로 초기화한다. -> ★★★그리고 만약 maxCnt(최대 원소 갯수) 보다 cnt가 크면 maxCnt == cnt; -> check[i][j]==1로 방문체크를 한다. -> queue에 i,j좌표를 삽입하고, BFS()로 진입한다. 3. BFS -> 주변 4방향을 탐색하며, arr[i][j]==1이고, check[i][j]==0 인 곳 진입 -> cnt(원소 갯수)++; -> 그리고 만약 maxCnt(최대 원소 갯수) ..
2020. 2. 24.
[ 백준 16234 ] 인구 이동 (C++)
[문제보기] [해결과정] 1. - int형 arr배열, int형 check배열 선언 - int cnt (나라 합), int sum (나라의 값들을 합한 값), int checkCnt (check배열에 같은 수가 저장되어 있으면 서로 동맹), bool flag (변화가 있는지 없는지, 변화가 없다면 전체 STOP) 2. n, L, R, arr 입력 3. while 반복문 실행 - 방문체크 초기화, checkCnt (=1) 초기화, flag (=true) 초기화 - arr 배열 전체 순회하면서 방문하지 않았다면 queue에 삽입 - BFS 실행하며 인원조건이 맞는지 확인, 인원조건이 맞다면 check[i][j] = checkCnt 하고 queue에 삽입, 그리고 cnt++(나라 합) 해주고 sum+=arr[..
2020. 2. 12.