코드굽는 타자기
SWEA[4014] - 활주로 건설 본문
링크
SWEA[4014]
문제설명
- 시뮬
문제풀이
- 시뮬
문제코드
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution4131 {
public static int[][] map;
public static int[][] map2;
public static boolean[][] set;
public static int N=0;
public static int X=0;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("res/swea/4131.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T=Integer.parseInt(br.readLine());
for (int test_case = 1; test_case <= T; test_case++) {
int ans=0;
// 입력
st = new StringTokenizer(br.readLine()," ");
N = Integer.parseInt(st.nextToken());
X = Integer.parseInt(st.nextToken());
map = new int[N][N];
map2 = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine()," ");
for (int j = 0; j < N; j++) {
map[i][j]=Integer.parseInt(st.nextToken());
map2[j][i]=map[i][j];
}
}
int idx=0;
//가로
set = new boolean[N][N];
for (int i = 0; i < N; i++) {
idx=0;
top:
while(true) {
if(idx==N-1) { //끝까지 이상없이 왔음.
ans++;
break;
}
if(map[i][idx]==map[i][idx+1]) { //높이가 같으면 다음칸 감
idx++;
}
else if(map[i][idx]-1==map[i][idx+1]) { //1칸 내려감
for (int s = 1; s <= X; s++) {
//경계안이고, 높이1칸차이 유지하면서, 설치안되었으면
if((idx+s)<N && map[i][idx]-1 == map[i][idx+s] && set[i][idx+s]==false) {
set[i][idx+s]=true;
}
else { //설치 못함
break top;
}
}
//X칸 설치 다끝남
idx = idx+X;
}
else if(map[i][idx]+1==map[i][idx+1]) {
for (int s = 0; s < X; s++) {
//경계안이고, 높이1칸차이 유지하면서, 설치안되었으면
if((idx-s)>=0 && map[i][idx+1]-1 == map[i][idx-s] && set[i][idx-s]==false) {
set[i][idx-s]=true;
}
else { //설치 못함
break top;
}
}
//X칸 설치 다끝남
idx++;
}
else { //높이차이 2칸이상
break;
}
}
}
//세로
set = new boolean[N][N];
for (int i = 0; i < N; i++) {
idx=0;
top:
while(true) {
if(idx==N-1) { //끝까지 이상없이 왔음.
ans++;
break;
}
if(map2[i][idx]==map2[i][idx+1]) { //높이가 같으면 다음칸 감
idx++;
}
else if(map2[i][idx]-1==map2[i][idx+1]) { //1칸 내려감
for (int s = 1; s <= X; s++) {
//경계안이고, 높이1칸차이 유지하면서, 설치안되었으면
if((idx+s)<N && map2[i][idx]-1 == map2[i][idx+s] && set[i][idx+s]==false) {
set[i][idx+s]=true;
}
else { //설치 못함
break top;
}
}
//X칸 설치 다끝남
idx = idx+X;
}
else if(map2[i][idx]+1==map2[i][idx+1]) {
for (int s = 0; s < X; s++) {
//경계안이고, 높이1칸차이 유지하면서, 설치안되었으면
if((idx-s)>=0 && map2[i][idx+1]-1 == map2[i][idx-s] && set[i][idx-s]==false) {
set[i][idx-s]=true;
}
else { //설치 못함
break top;
}
}
//X칸 설치 다끝남
idx++;
}
else { //높이차이 2칸이상
break;
}
}
}
System.out.println("#"+test_case+" "+ans);
/*
* 초기화
*/
}//end test_case
}//end main
}
아쉬운점
- idx = idx++; 하면 idx++안되고 idx그대로 유지됨... 잘못썼음.
- loop돌면 idx 초기화시켜줘야하는데 안했음.
- 세로로 check하는거를 index바꿔가면서 index고려하기 귀찮아서 그냥 transpose한 배열 새로 만들어서 돌림.
잘한점
- 예전에 하루종일풀었는데 이젠 빠르게 풀었음(40분)
- 다리 설치되었는지 체크를 boolean 배열을 만들어서 체크함.
'알고리즘 > Simulation' 카테고리의 다른 글
SWEA[9280] - 진용이네 주차타워[D3] (0) | 2020.02.13 |
---|---|
SWEA[1873] - 상호의 배틀필드[D3] (0) | 2020.02.12 |
SWEA[4615] - 재미있는 오셀로 게임[D3] (0) | 2020.02.08 |
SWEA[5653] - 줄기세포배양 (0) | 2020.02.08 |
SWEA[5644] - 무선 충전기 (1) | 2020.02.06 |
Comments