시뮬레이션 39

[SWEA] 5653. 줄기세포배양

BFS를 이용하여 구현하는 문제이다. 이 문제에서 유의할게 여러가지 있었다. 갱신을 하는 과정에서 생명력 수치가 높은 줄기 세포가 그리드 셀을 차지 하는 것, X시간 동안 비활성 상태를 거치고 X시간이 지나는 순간 X시간 동안 활성상태가 되는 것, 맵의 크기가 제대로 주어지지 않는 점등 구현에 까다로운 점이 많았다. 다음과 같이 해결하였다. 생명력 수치가 높은 세포로 갱신 -> PriorityQueue를 이용하여 생명력이 높은 세포들이 가장 위에 올수있도록 사용 X시간 후 X시간 동안 활성 -> curLive가 0이 되기전까지 계속 PrioirtyQueue에 남겨두기 맵의 크기 -> 주어진 r,c값에 time*2를 더해준 만큼 크기를 잡기 구현의 고려요소가 많아서 상당히 오랜시간을 풀었고, 많은 것을 참..

Algorithm 2020.04.27

[BOJ] 6087. 레이저 통신

C에서 C까지의 최단경로를 찾는 BFS문제이다. 최단경로를 찾을때 다익스트라 알고리즘 또한 사용가능하지만, 이 문제에선 BFS를 사용하여 구현하였다. 이 문제는 자신의 방향과 방향전환횟수를 알고있어야해서 Pos라는 class에 담아둔 상태로 구현하였다. 맨처음엔 일반 visti[][] 배열을 사용하여 방문하지 않았으면 방문하고, 만일 방문했더라도 갱신이 가능하다면 다시 방문하는 방식을 사용하였다. 하지만 어느부분에서 처리가 잘되지않아 다른방법을 사용하였다. 벽을 부수고 이동하기 처럼 visit[][][] 3차원 배열을 사용하였다. 즉 visit[row][col][조건]으로 두고 풀었다. 이 문제에선 조건 부분이 방향을 뜻하는 4가지방법을 의미하여 이와같이 풀어 해결하였다. 1 2 3 4 5 6 7 8 9..

Algorithm 2020.04.19

[BOJ] 11559. Puyo Puyo

이 문제는 BFS를 계속 반복하면서 문제에 주어진 조건대로 구현하는 시뮬레이션 문제이다. 문제를 다소 어렵게 생각했었지만, 꼼꼼히 읽어보니 있는 그대로 구현하면 되는 문제였다. 4개이상 똑같은 알파벳이 연결된 것이 있나 BFS를 이용하여 찾고, 폭파시킨다음 맵을 아래로 내리면서 계속 반복하는 문제이다. 맵을 끌어 내리는 함수는 mapDown() 이라는 함수를 이용하였는데, 맨 아래 행부터 시작해 '.'을 찾으면 위의 있는 문자와 바꾸어 주는 형식으로 구현하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49..

Algorithm 2020.04.06

[BOJ] 1941. 소문난 칠공주

여러가지 기법이 혼합되어 있는 문제이다. 우선 전체 25개의 알파벳중 7개를 뽑는 경우의 수를 생각하였다. 백트래킹을 이용한 조합을 사용할 계획으로 7개의 알파벳을 고르는 것을 구현한 후 1차적으로 S가 4개 이상인지를 확인하였다. 그 다음 S가 4개이상임이 확인이 된다면 BFS를 이용하여 7개의 알파벳이 하나의 그룹으로 이루어져있는지 확인하였다. 만일 하나의 그룹이면 최종답을 하나추가 시켰다. 수의 범위가 구현이 가능한 범위임으로 문제에 주어진 대로 구현하는게 중요한 문제였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 4..

Algorithm 2020.04.02

[BOJ] 14891. 톱니바퀴

문제에 주어진 대로 하면 되는 시뮬레이션이다. 단순 구현 문제이기 때문에 문제에 주어진 조건그대로를 수행하게 된다면 풀 수 있는 문제이다. 하나의 톱니바퀴가 돈다면 양쪽으로 끝지점 까지 영향을 끼칠 수 있으므로 left함수와 right함수를 만들어서 양 끝 인덱스 까지 재귀를 하는 방식으로 구현하였다. 구현함에 있어 고려할 부분이 상당히 많아서 풀이하는 시간을 상당히 많이 소요하였다. 꼼꼼함이 필요한 문제같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 5..

Algorithm 2020.03.31

[BOJ] 13335. 트럭

시뮬레이션 문제이다. 문제에 주어진 조건 그대로를 사용하면 된다. 문제처럼 bridge배열을 하나 선언하여 맨처음에 온 트럭을 bridge에 태운채로 시작하였다. 그 후 현재 bridge 무게를 확인하며 다음 트럭이 올라올수 있는 경우 다음 트럭을 태우는 과정 및 움직임을 반복하며 마지막 트럭까지 확인을 하는 과정을 거쳐 문제를 해결하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 package selfStudy.ch..

Algorithm 2020.03.31

[BOJ] 14999. 주사위 굴리기

문제에 주어진 그대로를 구현하는 시뮬레이션 문제이다. 이 문제에서 관건은 주사위를 굴리면서 위치마다 주어진 값들을 스왑하는 과정이 중요하다. 주사위를 0 1 2 3 4 5 위와 같은식으로 인덱싱을 하였고, 2번 인덱스를 top, 5번 인덱스를 bottom으로 생각하고 문제를 접근하였다. 그리고 각 각 방향마다 함수를 두어 스왑하는 과정을 통해 문제를 해결하였다. 그리고 문제를 읽는 과정에서 위쪽과 아래쪽을 헷갈리지 않고 방향을 주어야하는 점도 중요하다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 5..

Algorithm 2020.03.31

[SWEA] 5656. 벽돌 깨기

주어진 구슬 N의 최대 크기가 4, 너비 W가 12이므로 모든 경우의 수를 구할 때 순열을 사용하여도 복잡도가 넘어 갈 것 같지 않아서 바로 순열을 사용하였다. 순열을 선택한 후 다음과 같은 과정을 계획하였다. 1. W에서 N개를 선택하는 모든 수열을 구한다. 2-1. 구한 순열의 경우의 수마다 위에서 부터 폭파하는 과정을 BFS를 통하여 계산한다. 2-2. 폭파된 후 중간에 공백을 아래로 당겨준다. 그 후 2-1 반복한다. 3. 모든 폭파가 종료된 후 살아있는 블럭을 카운팅해준다. 또한, 중간에 최적화를 시키기 위해, 만일 2-1 과정에서 선택한 열의 블록이 하나도 없는 경우, 그 순열의 경우는 바로 종료 시키게 해주었다. 문제를 읽고 있는 그대로 차분하게 구현하여서 답을 얻을 수 있었다. 1 2 3 ..

Algorithm 2020.03.24

[SWEA] 7793. 오! 나의 여신님

BFS를 두번 사용할 계획을 세웠다. 첫번째 BFS를 통하여 모든 악마를 찾아 스킬이 도달하는 최단시간을 visitForDevil 배열에 저장해주었다. 그 후 두번째 BFS를 통해 S의 위치를 찾아 S가 n초 후에 도달할 수 있는 .의 위치에서 visitForDevil의 시간을 비교하여 도달여부를 결정하였다. 이런식으로 D를 찾으면 종료하였고, 못 찾으면 GameOver를 해주었다. 그렇지만 두번 BFS를 도는 방법 말고도, 구분자를 사용하여 악마와 S를 하나의 BFS에서 처리할 수 있는 방법도 있다.(단, 악마가 queue에 S보다 먼저 들어가 있어야함). 이 방법은 코드를 더 짧게 해주고, 시간도 더 줄여줄 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1..

Algorithm 2020.03.10