Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 이젠 골드구현도 어렵네..
- 세그먼트트리
- spring
- 게더타운시작
- 백준
- 다이나믹프로그래밍
- 재귀함수
- 알고리즘
- 다익스트라
- 네트워크플로우
- 우선순위큐
- DFS
- java
- PS
- 취득후기
- 구현
- 자바PS
- 01BFS
- COSPRO
- deque
- QUICKSTARTGUIDE
- YBMCOS
- BFS
- 시뮬레이션
- GatherTown
- dp
- 백준코딩테스트
- COSPROJAVA1급
- 완전탐색
- 엘라스틱서치
Archives
- Today
- Total
공부공간
BOJ - 14890 ) 경사로 본문
https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
배열을 전진하면서 경사로를 놓을수 있는지 없는지 테스트하는 문제이다.
문제는 간단하다. 길이 L인 경사로로 높이가 1차이나는 경우를 연결할 수있다.
연결되면 계속 진행하여서 한 행의 끝까지 도달하면 answer를 증가시킨다.
길이 L의 경사로를 사용했다는 visit 배열을 사용해서 경사로를 놓을떄 놓을수 있는지 없는지 확인하면서 진행하였다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
package practice;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 경사로 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
int answer =0;
int map[][] = new int[2*N][N];
for(int y=0;y <N ;y++) {
st = new StringTokenizer(br.readLine());
for(int x= 0; x< N; x++) {
map[y][x] = Integer.parseInt(st.nextToken());
}
}
int copy[][] = new int[N][N];
// 기존 배열을 90도 회전시켜 배열 아래에 붙여서 행의 값만 증가시켜서 한번에 확인한다.
for(int y=0;y <N ;y++) {
for(int x= 0 , i = N-1; x< N; x++ , i--) {
map[N+y][x] = map[i][y];
}
}
for(int y = 0 ; y < 2*N ; y++) {
boolean visit[] = new boolean[N]; boolean can = true;
int now =map[y][0];
top:
for(int x=1; x < N ; x++) {
if(map[y][x]==now) continue;
if(now+1 < map[y][x] || now-1 > map[y][x]) {
can = false; break top;
}
if(now+1 == map[y][x]) {
//오르막 경사
if(x-L <0) {
can = false; break top;
}// 범위를 벗어난 경우
for(int k = x -L ; k < x;k++) {
if(now != map[y][k] || visit[k]) {
can = false; break top;
}
}
// 이전에 사용했던 경우
if(can) {
for(int k = x -L ; k < x;k++) {
visit[k] = true;
}
now = map[y][x];
// 경사로를 놓는다.
}
}
if(now-1== map[y][x]) {
if(x+L-1 >=N) {
can =false;break top;
}
for(int k = x+1 ; k < x+L;k++) {
if(map[y][x] != map[y][k] || visit[k]) {
can = false; break top;
}
}
if(can) {
for(int k = x ; k < x+L;k++) {
visit[k] = true;
}
now = map[y][x];
}
}
}
if(can) answer++;
}
System.out.println(answer);
}
}
|
'알고리즘 > 구현,시뮬' 카테고리의 다른 글
SWEA ) 대관이의 대량할인 (0) | 2020.02.09 |
---|---|
SWEA ) 줄기세포 배양 (2) | 2020.02.09 |
Jungol - 1141 ) 불쾌한 날(Bad Hair Day) (0) | 2020.02.03 |
BOJ - 2798 ) 블랙잭 (0) | 2020.01.28 |
BOJ - 1966 ) 프린터 큐 (0) | 2020.01.27 |
Comments