일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 회전하는큐
- 클래스다이어그램
- AbstractFactory
- 행위패턴
- 디자인패턴
- c++
- 반복자
- C언어
- C
- FactoryMethod
- 재귀
- 14500
- UML
- 옵저버
- problemsolving
- 테트로미노
- 어댑터패턴
- 구조패턴
- 팩토리메소드
- 백준
- 빌더패턴
- 이터레이터
- 알고리즘
- ps
- 다이어그램
- 생성패턴
- 완전탐색
- 추상팩토리
- 데코레이터패턴
- bfs
- Today
- Total
salsa source
[BOJ] 1021번 : 회전하는 큐 (C/C++) 본문
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 |
---|