일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Kotlin
- parentfragment
- 더베일리하우스 삼성점
- MVVM
- 후기
- 패스트파이브
- Stack
- 재밌긴함
- media3 transformer
- innernavigation
- 공유오피스
- 내부프레그먼트
- 너무 어렵다
- 중첩네비게이션
- 안드로이드
- 파이썬
- 가든웨딩
- 아키텍쳐
- rxandroid
- 코틀린
- 알고리즘
- 스택
- media3
- 백준
- 사무실
- 자바
- fragmentcontainer
- Android
- SAA
- 패파
삽질도사
[백준] 배열돌리기1 16926 자바 본문
배열 맵을 이용한 알고리즘은 비슷한 로직으로 움직이는 경우가 많기 때문에 피아노치듯이 툭툭 치게됩니다.
이 문제도 그런 유형의 문제인데 그중에서도 기본이 되는 문제라고 생각합니다.
이러한 유형의 문제를 바탕으로 더 다양한 문제들에 활용됩니다.
문제를 많이 풀면 익숙해져서 많이 생각하지 않아도 평소에 코드를 치듯이 치게됩니다.
하지만 처음 문제유형을 접할 때에는 생각이 복잡하고 다양한 접근을 하기때문에 어렵게 느껴집니다.
따라서 이러한 기본유형의 문제들은 적당히 익혀두었다가 난이도를 점차 올리면서 익숙해지고,
생각이 짧아지면서, 오히려 좀더 복잡하고 더 활용도가 필요한 문제를 풀 때에 좀더 가볍게 접근 할 수가 있습니다.
문제에서 배열을 돌리기위해서 배열을 양파껍데기라고 생각하고, 처음에 가장 끝에 쌓여있는 배열을 움직이고,
그 다음 안쪽돌리고, 이것을 반복해서 풀었습니다.
2x2 는 껍데기가 1개
4x2는 껍데기가 2개
3x3은 껍데기가 1개
6x4는 껍데기가 2개 -> n x m 에서 n과 m 중에 작은 수 / 2 를 한 것이 돌려야할 껍데기의 수로 생각했습니다.
또한, 껍데기의 시작점은 항상 0x0,1x1,2x2처럼 x,y가 같은 좌표입니다.
func()에서
dir로 4방향을 표시하였고, 껍데기 수를 group으로 이름짓고 포문을 돌리는데,
포문안쪽에 while문을 한번 반복할 때마다 껍데기를 하나씩 처리하였으며,
저는 0,0 -> 아래쪽 -> 오른쪽 -> 위쪽 -> 왼쪽 으로 배열을 돌렸습니다.
중간에 문제풀면서 show()함수로 로직이 맞나 두세번정도 체크하면서 풀면 큰 오류없이 풀 수 있습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 배열돌리기 {
static int[][] map = new int[301][301];
static int n, m,r,group;
static int[][] go = {{1,0},{0,1},{-1,0},{0,-1}};
static boolean isrange(int y,int x,int g) {
return x>=g && x<(m-g) && y>=g && y<(n-g);
}
static void func(int group) {
int dir = 0;
for(int g=0; g<group; g++) {
int dx = g;
int dy = g;
int pre = map[dy][dx];
while(dir<4) {
dy = dy + go[dir][0];
dx = dx + go[dir][1];
if(isrange(dy, dx, g)) {
int temp = map[dy][dx];
map[dy][dx] = pre;
pre = temp;
}else {
dy=dy-go[dir][0];
dx=dx-go[dir][1];
dir++;
}
}
dir = 0;
}
}
static void show() {
for (int y = 0; y < n; y++) {
for (int x = 0; x < m; x++) {
System.out.print(map[y][x] + " ");
}
System.out.println();
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
r = Integer.parseInt(st.nextToken());
for (int y = 0; y < n; y++) {
st = new StringTokenizer(br.readLine());
for (int x = 0; x < m; x++) {
map[y][x] = Integer.parseInt(st.nextToken());
}
}
group = Math.min(n, m)/2;
for(int x=0; x<r; x++) {
func(group);
}
// func(group);
show();
}
}
'백준' 카테고리의 다른 글
[백준] 달력 20207 자바 (0) | 2021.03.23 |
---|---|
[백준] 단어뒤집기2 17413 자바 (0) | 2021.03.16 |
[백준] 행복 유치원 13164 자바 (0) | 2021.03.12 |
[백준] 파일정리 20291 자바 (0) | 2021.03.12 |
[백준] 스위치 켜고 끄기 1244 자바 (0) | 2021.03.12 |