알고리즘(139)
-
[백준 10026번] 적록색약
풀이구역을 나누는 BFS,DFS의 일반적인 문제이지만 적록색약일 때의 구역도 나누어서 계산해야되는 문제이다. 구역을 나누는 문제처럼 풀되 적록색약을 위한 배열을 새로 만들어주어야한다. 소스코드123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133..
2017.07.03 -
[백준 2206번]벽 부수고 이동하기
풀이벽을 하나씩 부수면서 BFS를 돌리면 시간초과가 나오게 되는 문제이다. 그래서 3번의 BFS를 돌려서 해결할 수 있는 방법으로 풀었다. 1. 시작지점 (0,0)부터 BFS를 돌린다. (한칸 갈때마다 몇칸을 이동했는지 정보를 넣어둔다.)2. 끝지점 (N,M)부터 BFS를 돌린다. (한칸 갈때마다 몇칸을 이동했는지 정보를 넣어 둔다.)3. 벽의 정보(1이 있는곳)가 들어 있는 큐에서 하나씩 꺼내서 상하좌우로 이동할 수 있는지 판별한다.4. 상하좌우로 이동하였을 경우 시작지점의 정보 1개와 끝지점의 정보 1개가 있는지 판별한다.5. 두개의 정보가 모두 있을 경우에만 경로 계산을 한다. 소스 코드123456789101112131415161718192021222324252627282930313233343536..
2017.07.02 -
[백준 2455번] 지능형 기차
풀이한 정거장에 설때마다 탄사람을 플러스, 내린사람을 마이너스 해주면서 4개의 정류장만 거치면된다.대신 각 정류장에 거칠때마다 최대값을 비교해주면 해결할 수 있다. 소스코드123456789101112131415#include using namespace std; int main() { int Max=0,sum=0; for (int i = 0; i > minus >> plus; sum += plus; sum -= minus; if (sum > Max) { Max = sum; } } cout
2017.06.30 -
[백준 2167번] 2차원 배열의 합
풀이다중 포문을 이용해서 범위내에 있는 배열의 원소의 합을 구해도 풀 수 있다. 소스코드12345678910111213141516171819202122232425#include using namespace std; int main() { int n, m, num[301][301],k; cin >> n >> m; for (int i = 0; i num[i][j]; } } cin >> k; for (int a = 0; a > i >> j >> x >> y; for (int start = i - 1; start
2017.06.30 -
[백준 5014번] 스타트링크
풀이재귀로 풀려고 했지만 크기가 커서 스택 오버플로우를 맞이할 수도있겠다는 생각이 들었다. --> 메모이제이션을 사용하면 풀수도 있을것같다. 갈수 있는 방법을 모두 가되 중복되지 않게 이동하는 하는 방법에 대해 생각해보면 BFS를 통해 풀수있다는 것을 알 수 있었다. 현재 층에서 아래로 갔을 경우, 위로 갔을 경우 큐에 삽입해두고, 하나씩 꺼내면서 목표한 층이 맞는지 비교해보면 된다. 소스 코드12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include using namespace std;// f -> 전체 층수// s -> 현재 층// g -> 가..
2017.06.25 -
[코드그라운드] 김씨만 행복한 세상
소스코드12345678910111213141516171819202122232425262728293031323334#include using namespace std; int Answer; int main(int argc, char** argv){ int T, test_case; cin >> T; for (test_case = 0; test_case > n >> m; for (int i = 1; i start[i] >> end[i]; num[end[i]] = !num[start[i]]; } for (int i = 1; i
2017.06.23