์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ์๋ฎฌ๋ ์ด์
- Floyd
- ํ์๊ฐ์
- ๋ถ๋ถ์งํฉ
- ์ด์งํธ๋ฆฌ
- ๊ตฌํ
- ๋ค์ต์คํธ๋ผ
- BFS
- ์๋ฃ๊ตฌ์กฐ
- Django
- ํฌํฌ์ธํฐ
- ์ฌ๊ท
- ์ธ๊ทธ๋จผํธํธ๋ฆฌ
- ํ๋ก์ด๋์์
- upperbound
- ์์ด
- ์ฐ์ ์์ํ
- ์กฐํฉ
- ๋ฐฑํธ๋ํน
- Union Find
- ํธ๋ผ์ด
- PriorityQueue
- ์นด์นด์ค
- ๊ทธ๋ฆฌ๋
- Dijkstra
- dfs
- dp
- ๋นํธ๋ง์คํน
- LowerBound
- ์ด๋ถํ์
- Today
- Total
J
[JAVA] BOJ ๋ฐฑ์ค 14890 ๊ฒฝ์ฌ๋ก ๋ณธ๋ฌธ
[JAVA] BOJ ๋ฐฑ์ค 14890 ๊ฒฝ์ฌ๋ก
snowball๐ฐ 2023. 2. 18. 20:19https://www.acmicpc.net/problem/14890
14890๋ฒ: ๊ฒฝ์ฌ๋ก
์ฒซ์งธ ์ค์ N (2 ≤ N ≤ 100)๊ณผ L (1 ≤ L ≤ N)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์นธ์ ๋์ด๋ 10๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
www.acmicpc.net
๋ฌธ์
ํฌ๊ธฐ๊ฐ N×N์ธ ์ง๋๊ฐ ์๋ค. ์ง๋์ ๊ฐ ์นธ์๋ ๊ทธ ๊ณณ์ ๋์ด๊ฐ ์ ํ์ ธ ์๋ค.
์ค๋์ ์ด ์ง๋์์ ์ง๋๊ฐ ์ ์๋ ๊ธธ์ด ๋ช ๊ฐ ์๋์ง ์์๋ณด๋ ค๊ณ ํ๋ค. ๊ธธ์ด๋ ํ ํ ๋๋ ํ ์ด ์ ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ, ํ์ชฝ ๋์์ ๋ค๋ฅธ์ชฝ ๋๊น์ง ์ง๋๊ฐ๋ ๊ฒ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ N=6์ธ ๊ฒฝ์ฐ ์ง๋๋ฅผ ์ดํด๋ณด์.

์ด๋, ๊ธธ์ ์ด 2N๊ฐ๊ฐ ์์ผ๋ฉฐ, ์๋์ ๊ฐ๋ค.

๊ธธ์ ์ง๋๊ฐ ์ ์์ผ๋ ค๋ฉด ๊ธธ์ ์ํ ๋ชจ๋ ์นธ์ ๋์ด๊ฐ ๋ชจ๋ ๊ฐ์์ผ ํ๋ค. ๋๋, ๊ฒฝ์ฌ๋ก๋ฅผ ๋์์ ์ง๋๊ฐ ์ ์๋ ๊ธธ์ ๋ง๋ค ์ ์๋ค. ๊ฒฝ์ฌ๋ก๋ ๋์ด๊ฐ ํญ์ 1์ด๋ฉฐ, ๊ธธ์ด๋ L์ด๋ค. ๋, ๊ฐ์๋ ๋งค์ฐ ๋ง์ ๋ถ์กฑํ ์ผ์ด ์๋ค. ๊ฒฝ์ฌ๋ก๋ ๋ฎ์ ์นธ๊ณผ ๋์ ์นธ์ ์ฐ๊ฒฐํ๋ฉฐ, ์๋์ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผํ๋ค.
- ๊ฒฝ์ฌ๋ก๋ ๋ฎ์ ์นธ์ ๋์ผ๋ฉฐ, L๊ฐ์ ์ฐ์๋ ์นธ์ ๊ฒฝ์ฌ๋ก์ ๋ฐ๋ฅ์ด ๋ชจ๋ ์ ํด์ผ ํ๋ค.
- ๋ฎ์ ์นธ๊ณผ ๋์ ์นธ์ ๋์ด ์ฐจ์ด๋ 1์ด์ด์ผ ํ๋ค.
- ๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ๋ฎ์ ์นธ์ ๋์ด๋ ๋ชจ๋ ๊ฐ์์ผ ํ๊ณ , L๊ฐ์ ์นธ์ด ์ฐ์๋์ด ์์ด์ผ ํ๋ค.
์๋์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ์ ์๋ค.
- ๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ๊ณณ์ ๋ ๊ฒฝ์ฌ๋ก๋ฅผ ๋๋ ๊ฒฝ์ฐ
- ๋ฎ์ ์นธ๊ณผ ๋์ ์นธ์ ๋์ด ์ฐจ์ด๊ฐ 1์ด ์๋ ๊ฒฝ์ฐ
- ๋ฎ์ ์ง์ ์ ์นธ์ ๋์ด๊ฐ ๋ชจ๋ ๊ฐ์ง ์๊ฑฐ๋, L๊ฐ๊ฐ ์ฐ์๋์ง ์์ ๊ฒฝ์ฐ
- ๊ฒฝ์ฌ๋ก๋ฅผ ๋๋ค๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ
L = 2์ธ ๊ฒฝ์ฐ์ ๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.

๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ์ ์๋ ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ๋ค.

์์ ๊ทธ๋ฆผ์ ๊ฐ์ฅ ์ผ์ชฝ๋ถํฐ 1๋ฒ, 2๋ฒ, 3๋ฒ, 4๋ฒ ์์ ๋ผ๊ณ ํ์ ๋, 1๋ฒ์ ๋์ด ์ฐจ์ด๊ฐ 1์ด ์๋๋ผ์, 2๋ฒ์ ๊ฒฝ์ฌ๋ก๋ฅผ ๋ฐ๋ฅ๊ณผ ์ ํ๊ฒ ๋์ง ์์์, 3๋ฒ์ ๊ฒน์ณ์ ๋์์, 4๋ฒ์ ๊ธฐ์ธ์ด๊ฒ ๋์์ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ด๋ค.
๊ฐ์ฅ ์์ ์ฃผ์ด์ง ๊ทธ๋ฆผ ์์ ๊ฒฝ์ฐ์ ์ง๋๊ฐ ์ ์๋ ๊ธธ์ ํ๋์์ผ๋ก, ์ง๋๊ฐ ์ ์๋ ๊ธธ์ ๋นจ๊ฐ์์ผ๋ก ํ์๋์ด ์์ผ๋ฉฐ, ์๋์ ๊ฐ๋ค. ๊ฒฝ์ฌ๋ก์ ๊ธธ์ด L = 2์ด๋ค.

์ง๋๊ฐ ์ฃผ์ด์ก์ ๋, ์ง๋๊ฐ ์ ์๋ ๊ธธ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ์ฒด ์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int L;
static int map[][];
static int result;
static int row[][];
static int col[][];
static char lr[][];
public static void main(String[] args) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
map = new int[N][N];
row = new int[N][N];
col = new int[N][N];
lr = new char[N][N];
for(int i=0; i<N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for(int j=0; j<N; j++)
map[i][j] = Integer.parseInt(st.nextToken());
}
set_col();
set_row();
System.out.println(result);
}
static void set_col(){
for(int i=0; i<N; i++) {
f:for(int j=1; j<N; j++) {
if(map[i][j-1] == map[i][j] + 1) {
if(j+L>N) continue f;
for(int k = j; k<j+L; k++) {
if((k != j+L-1 && map[i][k+1] != map[i][k]) || col[i][k] == 1) {
for(int u=k-1; u>=j; u--) {
col[i][u] -= 1;
}
j = k;
continue f;
}
col[i][k] += 1;
}
lr[i][j] = 'l';
j = j+L-1;
continue f;
}
else if(map[i][j-1] +1 == map[i][j]) {
if(j-L < 0) continue f;
for(int k = j-1; k>=j-L; k--) {
if((k> 0 && k-1 >= j-L && map[i][k-1] != map[i][k]) || col[i][k] == 1) {
for(int u=k+1; u<j; u++) {
col[i][u] -= 1;
}
continue f;
}
col[i][k] += 1;
}
lr[i][j-1] = 'r';
continue f;
}
}
}
// ์ถ๋ ฅ
f: for(int i=0; i<N; i++) {
for(int j=1; j<N; j++) {
if(map[i][j-1] != map[i][j] && map[i][j-1] != map[i][j] + col[i][j] && map[i][j-1]+col[i][j-1] != map[i][j]) continue f;
if(map[i][j-1] != map[i][j]) {
if(map[i][j-1] == map[i][j] + col[i][j] && lr[i][j] != 'l') continue f;
else if(lr[i][j-1] != 'r' && map[i][j-1]+col[i][j-1] == map[i][j]) continue f;
}
}
result++;
}
}
static void set_row(){
for(int j=0; j<N; j++) {
f:for(int i=1; i<N; i++) {
if(map[i-1][j] == map[i][j] + 1) {
if(i+L>N) continue f;
for(int k = i; k<i+L; k++) {
if((k != i+L-1 && map[k+1][j] != map[k][j]) || row[k][j] == 1) {
for(int u=k-1; u>=j; u--) {
row[u][j] -= 1;
}
i = k;
continue f;
}
row[k][j] += 1;
}
lr[i][j] = 'l';
i = i+L-1;
continue f;
}
else if(map[i-1][j] +1 == map[i][j]) {
if(i-L < 0) continue f;
for(int k = i-1; k>=i-L; k--) {
if((k> 0 && k-1 >= i-L && map[k-1][j] != map[k][j]) || row[k][j] == 1) {
for(int u=k+1; u<i; u++) {
row[u][j] -= 1;
}
continue f;
}
row[k][j] += 1;
}
lr[i-1][j] = 'r';
continue f;
}
}
}
f: for(int j=0; j<N; j++) {
for(int i=1; i<N; i++) {
if(map[i-1][j] != map[i][j] && map[i-1][j] != map[i][j] + row[i][j] && map[i-1][j]+row[i-1][j] != map[i][j]) continue f;
if(map[i-1][j] != map[i][j]) {
if(map[i-1][j] == map[i][j] + row[i][j] && lr[i][j] != 'l') continue f;
else if(lr[i-1][j] != 'r' && map[i-1][j]+row[i-1][j] == map[i][j]) continue f;
}
}
result++;
}
}
}
ํ ์ค ์ฉ ์ดํด๋ณด์!
static int N;
static int L;
static int map[][];
static int result;
static int row[][];
static int col[][];
static char lr[][];
N์๋ ๋งต์ ํฌ๊ธฐ, L์ ๊ฒฝ์ฌ๋ก์ ๊ธธ์ด, map์๋ ์ ์ฒด ์ง๋์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค. result์๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ฃ์ด ์ค๊ฒ์ด๋ค. row๋ ํ๋จ์์ ๊ฒฝ์ฌ๋ก๋ฅผ ํ์ํ๊ณ col์ ์ด๋จ์์ ๊ฒฝ์ฌ๋ก๋ฅผ ํ์ํด์ค๋ค. lr๋ฅผ ํตํด ๊ฒฝ์ฌ๋ก์ ๋์ ๋ถ๋ถ์ด ์ค์น๋ ์์น๊ฐ right์ธ์ง left์ธ์ง ๊ตฌ๋ถํด์ค ๊ฒ์ด๋ค.
set_col๊ณผ set_row์ ์ด๋ฆ์์๋ ์ ์ ์๋ฏ์ด ํ๊ณผ ์ด์ ๊ฒฝ์ฌ๋ก๋ฅผ ํ์ํด์ฃผ๋ ํจ์์ด๋ค. ๋ ํจ์๋ ์ญํ ์ด ํฌ๊ฒ ๋ค๋ฅด์ง ์๊ธฐ ๋๋ฌธ์ ํ๋์ ํจ์๋ง ์ดํดํ๊ณ ๋์ด๊ฐ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก set_col๋ง ์ค๋ช ํ๊ฒ ๋ค.
static void set_col(){
for(int i=0; i<N; i++) {
f:for(int j=1; j<N; j++) {
if(map[i][j-1] == map[i][j] + 1) {
if(j+L>N) continue f;
for(int k = j; k<j+L; k++) {
if((k != j+L-1 && map[i][k+1] != map[i][k]) || col[i][k] == 1) {
for(int u=k-1; u>=j; u--) {
col[i][u] -= 1;
}
j = k;
continue f;
}
col[i][k] += 1;
}
lr[i][j] = 'l';
j = j+L-1;
continue f;
}
์ด์ค for๋ฌธ์ ์ด์ฉํ์ฌ ๊ทธ ์ ๊ณผ ๋์ด๊ฐ 1์ฐจ์ด๊ฐ ๋๋ ๊ฒฝ์ฐ(๋์ด๊ฐ 1๋ฎ์ ๊ฒฝ์ฐ) ๊ฒฝ์ฌ๋ก๋ฅผ ๋์์ค ๊ฒ์ด๋ค. ์ด๋ ๊ฒฝ์ฌ๋ก๋ฅผ ์ฐ๊ฒฐํ ๊ธธ์ด๊ฐ ๊ฒฉ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ continue ์ฒ๋ฆฌํด์ค๋ค.
๊ฒฝ์ฌ๋ก๋ฅผ ๋๋ ๊ณผ์ ์์ ๊ธธ์ด ํํํ์ง ์๊ฑฐ๋(๋์ด๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ) ์ด๋ฏธ ๊ฒฝ์ฌ๋ก๊ฐ ๋์ฌ์๋ ๊ฒฝ์ฐ, ๋์๋ ๊ฒฝ์ฌ๋ก๋ฅผ ์ ๊ฑฐํ๋ค.
์ด ๊ฒฝ์ฐ ๊ฒฝ์ฌ๋ก๋ฅผ ๋๊ธฐ ์ํด ํ์ธํ๋ ๊ณณ๊น์ง๋ ๋ค์ ๊ฒ์ฌํ์ง ์์๋ ๋๋ฏ๋ก j๊ฐ์ ๋ณ๊ฒฝํ์ฌ ์กฐ์ฌํ์ง ์๋๋ก ํด์ค๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ์์ด ๊ฒฝ์ฌ๋ก๊ฐ ์ ๋์ฌ์ก๋ค๋ฉด lr๋ฐฐ์ด์ ์ผ์ชฝ์์ ๋์์ก๋ค๋ lํ์๋ฅผ ํด์ค๋ค. ์ด ๊ฒฝ์ฐ๋ ๊ฒฝ์ฌ๋ก๊ฐ ๋์ฌ์ง ๊ณณ์ ๋ค์ ๊ฒ์ฌํ์ง ์์ผ๋ฏ๋ก j๊ฐ์ ๋ณ๊ฒฝํ๋ค.
else if(map[i-1][j] +1 == map[i][j]) {
if(i-L < 0) continue f;
for(int k = i-1; k>=i-L; k--) {
if((k> 0 && k-1 >= i-L && map[k-1][j] != map[k][j]) || row[k][j] == 1) {
for(int u=k+1; u<i; u++) {
row[u][j] -= 1;
}
continue f;
}
row[k][j] += 1;
}
lr[i-1][j] = 'r';
continue f;
}
}
}
๊ทธ์ ๊ณผ ๋์ด๊ฐ 1๋์ ๊ฒฝ์ฐ๋ ์์ผ๋ก ๊ฒฝ์ฌ๋ก๋ฅผ ๋์์ฃผ๊ฒ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฒฝ์ฌ๋ก๋ฅผ ์ ๋์์ค๋ค. ๊ทธ๋ฆฌ๊ณ lr๋ฐฐ์ด์๋ rํ์๋ฅผ ํด์ค๋ค.
f: for(int i=0; i<N; i++) {
for(int j=1; j<N; j++) {
if(map[i][j-1] != map[i][j] && map[i][j-1] != map[i][j] + col[i][j] && map[i][j-1]+col[i][j-1] != map[i][j]) continue f;
if(map[i][j-1] != map[i][j]) {
if(map[i][j-1] == map[i][j] + col[i][j] && lr[i][j] != 'l') continue f;
else if(lr[i][j-1] != 'r' && map[i][j-1]+col[i][j-1] == map[i][j]) continue f;
}
}
result++;
}
}
๊ฒฝ์ฌ๋ก์ map์ ๋์ด์ ํฉ์ด ๊ทธ ์ map์ ๋์ด์ ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ทธ๋ฅ ๋์ด๊ฐ๋ค. ์ด๋ ์ ์ํด์ผํ ๊ฒ์ l๋ก ๋์ฌ์ง ๊ฒ์ธ์ง r๋ก ๋์ฌ์ง ๊ฒ์ธ์ง ํ์ธํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค!
๋ฌธ์ ์ ์์ 4์ ๊ฒฝ์ฐ ํ๋๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ์ง๋๊ฐ ์ ์๋ ๊ธธ์ธ๋ฐ ์ง๋๊ฐ ์ ์๋ ๊ธธ์ ๊ฒฝ์ฌ๋ก์ ๊ธธ์ด๊ฐ 1์ด์ด์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๋ ์ค ํ๋๋ง ์ ํํด์ ๋์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ์ค ํ๊ฐ์ง๋ง ์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ธธ์ ์ง๋๊ฐ ์ ์๋ค
'๐ Problem Solving > ๐ป Samsung SW Expert' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] BOJ ๋ฐฑ์ค 20061 ๋ชจ๋ ธ๋ฏธ๋ ธ๋๋ฏธ๋ ธ 2 (1) | 2023.03.05 |
---|---|
[JAVA] BOJ ๋ฐฑ์ค 15685 ๋๋๊ณค ์ปค๋ธ (0) | 2023.02.25 |
[JAVA] BOJ ๋ฐฑ์ค 17779 ๊ฒ๋ฆฌ๋ฉ๋๋ง2 (0) | 2023.02.17 |
[JAVA] BOJ ๋ฐฑ์ค 17144 ๋ฏธ์ธ๋จผ์ง ์๋ ! (0) | 2023.02.17 |
[JAVA] BOJ ๋ฐฑ์ค 17143 ๋์์ (1) | 2023.02.17 |