목록문제 풀이/Simulation (22)
코린이 탈출기
Algorithm 순열, 시뮬레이션 Logic 주사위를 10번 던지는데, 각 주사위마다 어떤 말을 옮길지 결정해야하므로, 중복순열을 만들었다. -> 개수: (말 개수 = 4)^10개 diceMap: 각 노드에서 연결된 다음 노드번호를 저장하는 adj 리스트 diceScore: 각 노드에 해당하는 포인트를 저장하는 리스트 visited: 말들이 위치한 곳을 나타내는 리스트 makePermutation(now, goal, arr): 중복 순열을 만드는 함수 하나의 중복순열이 완성되면 getScore함수를 통해 그 경우에 얻는 score을 반환받는다. getScore(arr, diceInfo) arr: 각 주사위를 던질 때마다 옮길 말의 정보가 담긴 리스트 diceInfo: 현재 0~3번 말이 있는 위치를 저..
Algorithm 구현, 시뮬레이션 Logic 풀이 순서 상어가 처음 위치한 좌표로 sharkInfo와 sharkScent를 초기화한다. 시간을 늘려가면서 다음을 수행한다. sharkInfo에 들어있는 상어들을 하나씩 이동시킨다. 이동 rule 아무 냄새 없는 칸 찾기 -> 그런 칸이 여러개라면 우선순위를 따른다. 자신의 냄새가 있는 칸 찾기 -> 그런 칸이 여러개라면 우선순위를 따른다. 같은 위치에 여러 상어가 위치한다면, 가장 작은 번호의 상어를 제외하고 모두 없애준다. 현재 scentMap에 냄새가 남아있다면, 이 냄새가 남아있을 시간을 -1한다. (시간이 흐름을 의미) sharkInfo를 보면서 상어가 옮겨간 위치에 sharkScent를 업데이트한다. 시간이 1000초를 초과하면 -1을 출력한다...
Algorithm 시뮬레이션, 구현 Logic 접근법 -> green map을 blue map 처럼 만들어서 따로 구현하지 않고 한꺼번에 한다 ! 모노미노도미노 map은 이러한 모양을 가지는데, 이 때 우리가 필요한 정보는 초록색 map과 파란색 map이다. 빨간색 map은 y, x만 알면 되기 때문에 굳이 배열로 만들지 않아도 된다. 대부분의 풀이가 greenMap과 blueMap 각각을 따로 구현했던데, 나는 greenMap을 blueMap 모양으로 만들어서 함수 하나로 다 풀 수 있도록 했다. 이 때 주의할 점: redMap의 행 기준으로 blueMap 블럭을 민다 redMap의 열 기준으로 greenMap 블럭을 민다 기본적으로 새로운 블럭을 놓을 위치를 찾는 구현은 blueMap 기준으로 했고,..
Algorithm 시뮬레이션 Logic zoneInfo: 칸의 정보를 담음 -> Map의 크기를 (N+2) * (N+2) 로 늘려서 바깥 부분은 파란색 구역으로 만든다. chessMap: 체스 list를 원소로 갖는 2차원 Map (한 구역에 체스말이 여러개인 경우, 밑에 위치하는 체스 index가 더 작음- stack 구조) chessInfo: 체스말의 좌표를 저장하는 리스트 -> 이 리스트를 사용하면 2차원 순회할 필요가 없어진다 moveChess(): 체스 번호를 순회하면서 해당 번호의 체스를 움직이는 함수 체스 번호가 위치한 Map에서 그 번호를 만날 때까지 원소들 pop해서 newList의 앞부분에 insert한다. updateMap(now_y, now_x, False, newList, targ..
문제 바로가기 19238번: 스타트 택시 첫 줄에 N, M, 그리고 초기 연료의 양이 주어진다. (2 ≤ N ≤ 20, 1 ≤ M ≤ N2, 1 ≤ 초기 연료 ≤ 500,000) 연료는 무한히 많이 담을 수 있기 때문에, 초기 연료의 양을 넘어서 충전될 수도 있다. 다 www.acmicpc.net Logic Algorithm: 시뮬레이션, BFS findDistance(taxi_y, taxi_x, passengerMap): BFS로 현재 택시 위치에서 승객의 위치까지의 그 승객의 index와 최소 거리를 return 하는 함수. 만약 최소 거리가 여러 개라면, 여러 개 모두 return passengerMap: 현재 승객들의 위치의 좌표를 저장하는 이차원 리스트(택시 탑승 완료된 승객은 표시 x) que..
www.acmicpc.net/problem/17822 17822번: 원판 돌리기 반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀 www.acmicpc.net Logic erase_set: 원판에서 지울 좌표를 저장하는 Set -> 중복 제거를 위해서! checkHorizontal(num): 원판의 가로라인에서 인접하면서 수가 같은 경우를 찾아서 erase_set에 저장한다. checkVertical(num): 원판의 세로라인에서 인접하면서 수가 같은 경우를 찾아서 erase_set에 저장한다. processAverage(): 원판 점수의 평균을 구하..
문제 바로가기 17142번: 연구소 3 인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 바이러스는 활성 상태와 비활성 상태가 있다. 가장 처음에 모든 바이러스는 비활성 상태이고 www.acmicpc.net Logic 바이러스는 Virus 리스트에 담는다. 이 중 M개를 골라 조합을 만들고, activate_Virus에 담는다. 바이러스가 아직 안 퍼진 곳(즉, Map에서 0인 부분)의 count를 세어서 virus_count에 저장한다. 활성화 바이러스 조합 각각에 대하여 bfs(virus) 함수를 실행한다. 3-1. 활성화 바이러스를 queue에 넣는다. 3-2. 현재 queue에 들어있는 원소들에 대해서만 한다. -> level 을 계산해주기 위해서 3-3..
문제 바로가기 SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com - info[][] 배열: 각 블럭에 부딪혔을 때 기존의 방향이 어떻게 달라지는 지를 저장하고 있음(key: 기존 방향, value: 새로운 방향 / 0: →, 1: ↓, 2: ←, 3: ↑) - warmHole 벡터: 각 warm hole의 (y, x) 쌍을 저장한다 1. 주어진 map의 바깥에 블럭 5를 한줄씩 더 만든다. (5의 모양이 ㅁ이므로 제일 가장자리를 만났을 때 방향을 꺾도록 하기 위해서) 2. map[y][x]가 0인 부분에서 네 가지 방향으로 모두 simulate 한다. in Simulate() 1. 현재 가진 방향으로 옮겨서 ny..