일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 프로그래머스
- 부주상골증후군
- ChatGPT
- SWIFT
- 백준
- 코딩테스트
- 부주상골수술후기
- 리눅스
- 세브란스
- 카카오인턴
- 분할정복
- 카카오인턴십
- dp
- 카카오코테
- 구현
- BFS
- 독학
- 독일어독학
- c++
- 롯데정보통신
- 코테
- 부주상골수술
- istringstream
- DFS
- sql
- 독일어
- 부주상골
- SQLD
- IOS
- 스택
Archives
- Today
- Total
슈뢰딩거의 고등어
[백준] 17406 배열 돌리기 4 본문
https://www.acmicpc.net/problem/17406
순열을 구해주는 것은 어렵지 않았지만
회전을 해주는 과정에서 헤매었다.
시계방향으로 한 칸씩 이동시키는 회전 함수
void turn_box(TURN cmd){
int sy = cmd.r - cmd.s;
int sx = cmd.c - cmd.s;
int ey = cmd.r + cmd.s;
int ex = cmd.c + cmd.s;
// 사각형을 밖에서부터 점점 좁혀가면서 수행하는데,
// ey > sy ... 의 조건이 걸릴 경우, 중심까지 좁힌 것이기 때문에 반복문을 나온다.
while(ey > sy && ex > sx) {
int cy = sy;
int cx = sx;
int target = copy_map[cy][cx]; // 옮길 값을 target에 저장한다.
int dir = 0;
while(true) {
int ny = cy + dy[dir];
int nx = cx + dx[dir];
// 처음위치로 돌아오게 된다면
if(ny == sy && nx == sx){
copy_map[ny][nx] = target;
break;
}
// 끝까지 탐색했다면 방향을 바꿔준다.
if(nx < sx || ny < sy || nx > ex || ny > ey) {
dir = (dir+1) % 4;
ny = cy + dy[dir];
nx = cx + dx[dir];
}
// 옮길 자리에 있는 값을 tmp 에 저장한 후
int tmp = copy_map[ny][nx];
// 숫자를 옮겨준다
copy_map[ny][nx] = target;
// 기존에 있던 값이 다음 수행에서는 target 이 된다.
target = tmp;
// 위치 재설정
cy = ny; cx = nx;
}
// 사각형을 좁혀준다.
sy++; sx++;
ex--; ey--;
}
}
전체 코드
#include <iostream>
#include <vector>
using namespace std;
struct TURN {
int r, c, s;
};
vector <TURN> turn;
int n, m, k;
int map[60][60];
bool visit[10];
int choice[10];
int copy_map[60][60];
int answer = 987654321;
const int dy[] = {0, 1, 0, -1};
const int dx[] = {1, 0, -1, 0};
void turn_box(TURN cmd){
int sy = cmd.r - cmd.s;
int sx = cmd.c - cmd.s;
int ey = cmd.r + cmd.s;
int ex = cmd.c + cmd.s;
while(ey > sy && ex > sx) {
int cy = sy;
int cx = sx;
int target = copy_map[cy][cx];
int dir = 0;
while(true) {
int ny = cy + dy[dir];
int nx = cx + dx[dir];
// 처음위치로 돌아오게 된다면
if(ny == sy && nx == sx){
copy_map[ny][nx] = target;
break;
}
if(nx < sx || ny < sy || nx > ex || ny > ey) {
dir = (dir+1) % 4;
ny = cy + dy[dir];
nx = cx + dx[dir];
}
int tmp = copy_map[ny][nx];
copy_map[ny][nx] = target;
target = tmp;
cy = ny; cx = nx;
}
sy++;
sx++;
ex--;
ey--;
}
}
void dfs(int cnt, int target) {
if(cnt == target) {
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
copy_map[i][j] = map[i][j];
for(int i=0; i<target; i++){
TURN cur = turn[choice[i]];
turn_box(cur);
}
for(int i=1; i<=n; i++) {
int row = 0;
for(int j=1; j<=m; j++)
row += copy_map[i][j];
if(row < answer)
answer = row;
}
return;
}
for(int i=0; i<target; i++) {
if (visit[i]) continue;
visit[i] = true;
choice[cnt] = i;
dfs(cnt+1, target);
visit[i] = false;
}
}
int main() {
scanf("%d %d %d", &n, &m, &k);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++){
scanf("%d", &map[i][j]);
copy_map[i][j] = map[i][j];
}
for(int i=0; i<k; i++) {
int r, c, s;
scanf("%d %d %d", &r, &c, &s);
TURN tmp;
tmp.r = r;
tmp.c = c;
tmp.s = s;
turn.push_back(tmp);
}
dfs(0, k);
printf("%d\n", answer);
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 그래프 > 순위 (0) | 2022.01.31 |
---|---|
[백준] 17085 십자가 2개 놓기 (0) | 2022.01.27 |
[백준] 17089 세친구 (0) | 2022.01.24 |
[백준] 2422 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (0) | 2022.01.24 |
[백준] 2210 숫자판 점프 (0) | 2022.01.24 |
Comments