본문 바로가기

반응형

알고리즘/SW EXPERT

4615. 재미있는 오셀로 게임 4615. 재미있는 오셀로 게임 시뮬레이션 문제. 입력받은 값을 바탕으로 reset_map 함수를 실행시킨다. 함수 속에서는 8가지 방향을 탐색하면서 while 문 2개를 실행시키게 된다. 첫번째 while 문에서는 한쪽 방향으로 움직이면서 시작값과 같은 값(흑,백) 을 가지는 값을 찾을 때까지 진행한다. 만약 같은 값을 찾는다면 그 path 의 모든 색깔을 바꿔야 하기 때문에 다시 while문을 통해서 모든 값을 바꿔준다. 같은 값을 찾지 못한다면, 바꿔줄 필요가 없다. 처음에 첫번째 while 문에서 && map[nx][ny]!=0) 에 이 부분을 빠뜨렸는데, 이 부분을 빠뜨리면 처음에 맵을 0으로 초기화 했기 때문에 빈공간도 모두 흑이나 백으로 바꾸게 되는 문제점이 생긴다. 1234567891011.. 더보기
4751. 다솔이의 다이아몬드 장식 4751. 다솔이의 다이아몬드 장식 각 라인마다 다섯글자를 반복하도록 하였다. 단 마지막 글자의 경우에는 배열의 한칸씩 당겨서 map 변수에 저장하도록 하였다. 그리고 출력할 때는 map 에 0값을 집어넣고 0이 나올때까지 출력하면서 모두가 출력되도록 하면 끝 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116#include#inc.. 더보기
3421. 수제 버거 장인 3421. 수제 버거 장인 처음에 시간초과가 발생할 것 같아서 어떤 방식으로 풀지 굉장히 고민했다. if(burger[state])==1){return ;} 이 부분만으로 통과가 될 수 있을까 했는데 다행히 시간초과에서 벗어났다. 비트마스크를 다시 한번 사용해볼 수 있었던 문제. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#include#includeusing namespace std;int N, M;int burger[(1 a >> b; k = (1 더보기
4206. 연구소 탈출 4206. 연구소 탈출 이전에 백준에서 비슷한 문제를 풀어본 적 있었던 것 같다. 예전에 백준에서 내가 풀 때는 맵을 두개를 만들고, 서로 비교하면서 문제를 풀었는데 풀고나서 다른 사람들 풀이를 보다가 BFS를 서로 번갈아가면서 풀었던 코드를 봤던게 생각났다. 이 문제도 마찬가지로 사람이 움직이고, 바이러스를 움직이면서 탈출 여부를 판단하면 된다. 사람이 맵의 끝자리에 있으면 탈출할 수 있다. (단, 그 자리가 탈출하기 직전에 바이러스에게 먹히면 안된다.) 바이러스에게 먹히면 안되는 것을 간과해서 문제를 틀렸었다. 그리고 탈출하지 못하면, 전체 맵을 탐색하면서 사람이 남아있는지를 파악한다. (맵에 3의 존재 여부) 3이 존재한다면, 좀비는 되지 않았지만 탈출할 수 없는 구조이기 때문에 CANNOT ESC.. 더보기
4193. 수영대회 결승전 4193. 수영대회 결승전 기존의 BFS 문제에서 조금 달라졌다. 소용돌이가 생겼다 없어졌다 하는 주기가 반복되는 문제였다. 소용돌이가 없어져서 소용돌이 속으로 움직일 수 있는 시간이 3초,6초,9초.. 이런식으로 반복된다. 따라서 다익스트라를 이용해서 가중치를 주는 방식으로 문제를 풀었다. 단 소용돌이 이전 단계에서 현재 dist 값을 3가지로 나눠서 문제를 풀었다. dist%3==0 , dist%3==1, dist%3==2 인 경우로 나누었다. 예를 들어 0초인 경우에는 dist%3==0 이기 때문에 소용돌이로 이동하기 위해선 3초를 기다려야 한다. 따라서 움직이면 3을 추가한다. 1초인 경우에는 dist%3==1 이고, 소용돌이로 이동하기 위해서는 2초만 기다리면 된다. 이런식으로 케이스를 나누어서.. 더보기
3977. 페르마의 크리스마스 정리 3977. 페르마의 크리스마스 정리 처음 문제를 보고는 그냥 에라토스테네스의 체를 이용해서 문제를 푸는구나 했다. 에라토스테네스의 체를 미리 한번만 구하도록 했는데, 시간초과가 발생했다. 그래서 아! DP문제로 다시 풀 수 있겠구나하고 제출했는데.. 정답이 계속 틀렸다.. 분명 코드는 맞는거 같은데 그러다가 문제의 댓글에 나와 똑같은 분을 봤는데.. 예외적으로 2라는 값은 4로 나누었을 때 1이 아니지만, 1^2 + 1^2 이므로 정답에 해당했다..! 아주 큰 예외를 생각하지 못하고 있었다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include#in.. 더보기
1249.보급로 1249. 보급로 다익스트라를 이용해서 시작점에서 끝점까지 최단거리를 구하면 된다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364#include#includeusing namespace std;const int INF = 987654321;int dx[4] = { 0,0,1,-1 };int dy[4] = { 1,-1,0,0 };int main(){ //freopen("input.txt", "r", stdin); int tc; cin >> tc; for (int t = 1; t > n; for (int i = 0; i= 0 && nx 더보기
2814. 최장 경로 2814. 최장 경로 쉬운 문제라고 생각했는데, 결국 다른 사람의 힌트를 보고 나서야 풀 수 있었다..ㅠㅠ 그냥 단순히 각 정점을 돌면서 DFS를 돌리면 될거라고 생각했다.. 하지만 만약 사이클이 생긴다면, 최장 거리가 달라질 수 있기 때문에 DFS에서 return 하기 전에 방문한 지점의 방문표시를 해제해줘야 했다.. 생각이 짧아도 너무 짧았다.. 아래 그림에서 1->2->3->4->5 까지 방문을 먼저하고 3->7->6 이 되는 경우 최장거리는 5밖에 되지 않는다. 하지만 return 하면서 방문체크를 해제한다면 1->2->6->7->3->4->5 가 되기 때문에 최장거리가 7이 된다. 1234567891011121314151617181920212223242526272829303132333435363.. 더보기

반응형