salsa source

[BOJ] 1021번 : 회전하는 큐 (C/C++) 본문

STUDY/알고리즘

[BOJ] 1021번 : 회전하는 큐 (C/C++)

dayofday 2018. 4. 3. 03:23

BOJ 링크 :  https://www.acmicpc.net/problem/1021






해설


큐에서 데이터가 빠지는 횟수만 출력하면 되기때문에 전체 데이터를 가지고다닐 필요가 없다고 생각했다.

그래서 큐의 front 인덱스값과 rear 인덱스값만 가지고 문제를 풀었다.


1) 원소 뽑아내기 -> front++;

2) 왼쪽으로 한 칸 이동 -> rear = front, front++;

3) 오른쪽으로 한 칸 이동 -> front=rear, rear--;


이와같이 계산하면 위 세가지 행동을 front와 rear의 값만으로 할 수 있다.

위 세가지 행동을 bfs를 이용하여 가장 적은 횟수로 뽑아내고 싶은 원소를 찾는다.




필요한 변수


arr[51] -> 뽑아낼 위치를 담을 배열

del[51] -> 큐에 담긴 데이터 현황. 뽑아내면 값을 0에서 1로 바꾸어준다.

chk[51][51][51] -> chk[a][b][c] 라고 하면   c번째 데이터를 제거하려고 찾을 때 (a, b)를 이미 방문했는지 체크하는 배열




풀이 순서


1. arr배열에 뽑아낼 위치를 차례로 담는다

2. 찾고싶은 위치가 될 때 까지 dfs를 이용하여 왼쪽이나 오른쪽으로 탐색한다.

   2-1. 큐를 생성하고 현재 front와 rear, 횟수(0)를 담는다

   2-2. 큐가 빌 때 까지 반복한다.

          2-2-1. 왼쪽으로 움직였을 때와 오른쪽으로 움직였을 때의 front와 rear, cnt+1을 큐에 담는다.

                   front값과 rear값을 증감할 때 이미 제거된 숫자이면 안되고, 변경된 front와 rear가 이번 회차에 방문하지 않았어야 한다.

   2-3. 큐의 top의 front값이 뽑으려는 위치와 일치하면서 지금까지 발견한 cnt중 가장 작은 값을 리턴한다.

3. 찾고싶은 위치의 원소를 뽑는다

    3.1. front값을 1 증가시킨다.

    3.2. 이미 삭제된 데이터이면 3.1로

    3.3. del배열에서 찾은 원소의 값을 1로 바꾸어 삭제되었다고 표시해준다.





'STUDY > 알고리즘' 카테고리의 다른 글

[BOJ] 14500 : 테트로미노 (DFS 만으로 풀기/C C++)  (0) 2018.04.06
Comments