https://programmers.co.kr/learn/courses/30/lessons/60061
๋ฌธ์ ์ค๋ช
๋นํ๊ฐ ๊นจ์ง๋ฉด์ ์ค๋
ธ์ฐํ์ด์ ๋ ๋ด๋ ค ์จ "์ฃ ๋ฅด๋"๋ ์ธ์ 2๋ง์ ์ํด ์ฃผํ ๊ฑด์ถ์ฌ์
์ ๋ฐ์ด๋ค๊ธฐ๋ก ๊ฒฐ์ฌํ์์ต๋๋ค. "์ฃ ๋ฅด๋"๋ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ๋ฒฝ๋ฉด ๊ตฌ์กฐ๋ฌผ์ ์๋์ผ๋ก ์ธ์ฐ๋ ๋ก๋ด์ ๊ฐ๋ฐํ ๊ณํ์ธ๋ฐ, ๊ทธ์ ์์ ๋ก๋ด์ ๋์์ ์๋ฎฌ๋ ์ด์
ํ ์ ์๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ ์์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ 2์ฐจ์ ๊ฐ์ ๋ฒฝ๋ฉด์ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ด์ฉํ ๊ตฌ์กฐ๋ฌผ์ ์ค์นํ ์ ์๋๋ฐ, ๊ธฐ๋ฅ๊ณผ ๋ณด๋ ๊ธธ์ด๊ฐ 1์ธ ์ ๋ถ์ผ๋ก ํํ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ๊ธฐ๋ฅ์ ๋ฐ๋ฅ ์์ ์๊ฑฐ๋ ๋ณด์ ํ์ชฝ ๋ ๋ถ๋ถ ์์ ์๊ฑฐ๋, ๋๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ์์ ์์ด์ผ ํฉ๋๋ค.
- ๋ณด๋ ํ์ชฝ ๋ ๋ถ๋ถ์ด ๊ธฐ๋ฅ ์์ ์๊ฑฐ๋, ๋๋ ์์ชฝ ๋ ๋ถ๋ถ์ด ๋ค๋ฅธ ๋ณด์ ๋์์ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํฉ๋๋ค.
๋จ, ๋ฐ๋ฅ์ ๋ฒฝ๋ฉด์ ๋งจ ์๋ ์ง๋ฉด์ ๋งํฉ๋๋ค.
2์ฐจ์ ๋ฒฝ๋ฉด์ n x n ํฌ๊ธฐ ์ ์ฌ๊ฐ ๊ฒฉ์ ํํ์ด๋ฉฐ, ๊ฐ ๊ฒฉ์๋ 1 x 1ํฌ๊ธฐ์ ๋๋ค. ๋งจ ์ฒ์ ๋ฒฝ๋ฉด์ ๋น์ด์๋ ์ํ์ ๋๋ค. ๊ธฐ๋ฅ๊ณผ ๋ณด๋ ๊ฒฉ์์ ์ ๊ต์ฐจ์ ์ ๊ฑธ์น์ง ์๊ณ , ๊ฒฉ์ ์นธ์ ๊ฐ ๋ณ์ ์ ํํ ์ผ์นํ๋๋ก ์ค์นํ ์ ์์ต๋๋ค. ๋ค์์ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ค์นํด ๊ตฌ์กฐ๋ฌผ์ ๋ง๋ ์์์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ๊ทธ๋ฆผ์ ๋ค์ ์์์ ๋ฐ๋ผ ๊ตฌ์กฐ๋ฌผ์ ๋ง๋ค์์ต๋๋ค.
- (1, 0)์์ ์์ชฝ์ผ๋ก ๊ธฐ๋ฅ์ ํ๋ ์ค์น ํ, (1, 1)์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ฅผ ํ๋ ๋ง๋ญ๋๋ค.
- (2, 1)์์ ์์ชฝ์ผ๋ก ๊ธฐ๋ฅ์ ํ๋ ์ค์น ํ, (2, 2)์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ฅผ ํ๋ ๋ง๋ญ๋๋ค.
- (5, 0)์์ ์์ชฝ์ผ๋ก ๊ธฐ๋ฅ์ ํ๋ ์ค์น ํ, (5, 1)์์ ์์ชฝ์ผ๋ก ๊ธฐ๋ฅ์ ํ๋ ๋ ์ค์นํฉ๋๋ค.
- (4, 2)์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ฅผ ์ค์น ํ, (3, 2)์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ฅผ ์ค์นํฉ๋๋ค.
๋ง์ฝ (4, 2)์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ฅผ ๋จผ์ ์ค์นํ์ง ์๊ณ , (3, 2)์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ฅผ ์ค์นํ๋ ค ํ๋ค๋ฉด 2๋ฒ ๊ท์น์ ๋ง์ง ์์ผ๋ฏ๋ก ์ค์น๊ฐ ๋์ง ์์ต๋๋ค. ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ญ์ ํ๋ ๊ธฐ๋ฅ๋ ์๋๋ฐ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ญ์ ํ ํ์ ๋จ์ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ค ๋ํ ์ ๊ท์น์ ๋ง์กฑํด์ผ ํฉ๋๋ค. ๋ง์ฝ, ์์ ์ ์ํํ ๊ฒฐ๊ณผ๊ฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋๋ค๋ฉด ํด๋น ์์ ์ ๋ฌด์๋ฉ๋๋ค.
๋ฒฝ๋ฉด์ ํฌ๊ธฐ n, ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ค์นํ๊ฑฐ๋ ์ญ์ ํ๋ ์์ ์ด ์์๋๋ก ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด build_frame์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋ชจ๋ ๋ช ๋ น์ด๋ฅผ ์ํํ ํ ๊ตฌ์กฐ๋ฌผ์ ์ํ๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
- n์ 5 ์ด์ 100 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- build_frame์ ์ธ๋ก(ํ) ๊ธธ์ด๋ 1 ์ด์ 1,000 ์ดํ์ ๋๋ค.
- build_frame์ ๊ฐ๋ก(์ด) ๊ธธ์ด๋ 4์ ๋๋ค.
- build_frame์ ์์๋ [x, y, a, b]ํํ์
๋๋ค.
- x, y๋ ๊ธฐ๋ฅ, ๋ณด๋ฅผ ์ค์น ๋๋ ์ญ์ ํ ๊ต์ฐจ์ ์ ์ขํ์ด๋ฉฐ, [๊ฐ๋ก ์ขํ, ์ธ๋ก ์ขํ] ํํ์ ๋๋ค.
- a๋ ์ค์น ๋๋ ์ญ์ ํ ๊ตฌ์กฐ๋ฌผ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ฉฐ, 0์ ๊ธฐ๋ฅ, 1์ ๋ณด๋ฅผ ๋ํ๋ ๋๋ค.
- b๋ ๊ตฌ์กฐ๋ฌผ์ ์ค์นํ ์ง, ํน์ ์ญ์ ํ ์ง๋ฅผ ๋ํ๋ด๋ฉฐ 0์ ์ญ์ , 1์ ์ค์น๋ฅผ ๋ํ๋ ๋๋ค.
- ๋ฒฝ๋ฉด์ ๋ฒ์ด๋๊ฒ ๊ธฐ๋ฅ, ๋ณด๋ฅผ ์ค์นํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
- ๋ฐ๋ฅ์ ๋ณด๋ฅผ ์ค์น ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
- ๊ตฌ์กฐ๋ฌผ์ ๊ต์ฐจ์ ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณด๋ ์ค๋ฅธ์ชฝ, ๊ธฐ๋ฅ์ ์์ชฝ ๋ฐฉํฅ์ผ๋ก ์ค์น ๋๋ ์ญ์ ํฉ๋๋ค.
- ๊ตฌ์กฐ๋ฌผ์ด ๊ฒน์น๋๋ก ์ค์นํ๋ ๊ฒฝ์ฐ์, ์๋ ๊ตฌ์กฐ๋ฌผ์ ์ญ์ ํ๋ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ์ต์ข
๊ตฌ์กฐ๋ฌผ์ ์ํ๋ ์๋ ๊ท์น์ ๋ง์ถฐ return ํด์ฃผ์ธ์.
- return ํ๋ ๋ฐฐ์ด์ ๊ฐ๋ก(์ด) ๊ธธ์ด๊ฐ 3์ธ 2์ฐจ์ ๋ฐฐ์ด๋ก, ๊ฐ ๊ตฌ์กฐ๋ฌผ์ ์ขํ๋ฅผ ๋ด๊ณ ์์ด์ผ ํฉ๋๋ค.
- return ํ๋ ๋ฐฐ์ด์ ์์๋ [x, y, a] ํ์์ ๋๋ค.
- x, y๋ ๊ธฐ๋ฅ, ๋ณด์ ๊ต์ฐจ์ ์ขํ์ด๋ฉฐ, [๊ฐ๋ก ์ขํ, ์ธ๋ก ์ขํ] ํํ์ ๋๋ค.
- ๊ธฐ๋ฅ, ๋ณด๋ ๊ต์ฐจ์ ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ, ๋๋ ์์ชฝ ๋ฐฉํฅ์ผ๋ก ์ค์น๋์ด ์์์ ๋ํ๋ ๋๋ค.
- a๋ ๊ตฌ์กฐ๋ฌผ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ฉฐ, 0์ ๊ธฐ๋ฅ, 1์ ๋ณด๋ฅผ ๋ํ๋ ๋๋ค.
- return ํ๋ ๋ฐฐ์ด์ x์ขํ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ฉฐ, x์ขํ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ y์ขํ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
- x, y์ขํ๊ฐ ๋ชจ๋ ๊ฐ์ ๊ฒฝ์ฐ ๊ธฐ๋ฅ์ด ๋ณด๋ณด๋ค ์์ ์ค๋ฉด ๋ฉ๋๋ค.
ํ์ด
๋นก์ ... ๊ตฌํ ๋ฌธ์ โผ๏ธ
์ฌ๊ธฐ์ ์ฃผ์ด์ง๋ ์ขํ๋ค์ ๊ธฐ๋ณธ ์ด์ฐจ์ ๋ฐฐ์ด์ 90๋ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ์ํจ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๊ตฌํ์ ํ๋ฉด๋๋ค ๐ฉ๐ป
โผ๏ธ์ค์นโผ๏ธ
1๏ธโฃ ๊ธฐ๋ฅ ์ค์น
๐ y == 0
๐[x-1][y] ์ ๋ณด๊ฐ ์กด์ฌ
๐[x][y] ์ ๊ธฐ๋ฅ์ด ์กด์ฌ
โก๏ธ ์ค์น ๊ฐ๋ฅ โผ๏ธ
2๏ธโฃ ๋ณด ์ค์น
๐ y == 0
๐ [x-1][y]๊ณผ [x+1][y] ์ ๋ณด๊ฐ ์กด์ฌ
๐ [x][y-1] ์ ๊ธฐ๋ฅ ์กด์ฌ
๐ [x+1][y-1] ์ ๊ธฐ๋ฅ ์กด์ฌ
โก๏ธ ์ค์น ๊ฐ๋ฅ โผ๏ธ
โผ๏ธ์ ๊ฑฐโผ๏ธ
1๏ธโฃ ์ค์นํ ๋ ์ ์ฅํด๋์ ๊ฒ์ ์ญ์
2๏ธโฃ ๋๋จธ์ง ์ค์น๋ ๋ถ๋ถ๋ค์ ๋ชจ๋ ํ์ธ
3๏ธโฃ ๋ถ๊ฐ๋ฅ์ด๋ฉด ๋ค์ ์ถ๊ฐํด์ค๋ค
์ฝ๋
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class ๊ธฐ๋ฅ๊ณผ๋ณด์ค์น {
static boolean[][] pillars;
static boolean[][] beams;
static LinkedList<result> ansList;
static int N;
static final int PILLAR = 0;
static final int BEAM = 1;
static final int CONSTRUCT = 1;
static final int DECONSTRUCT = 0;
public static class result implements Comparable<result>{
int x;
int y;
int what;
result(int x, int y, int what){
this.x = x;
this.y = y;
this.what = what;
}
@Override
public int compareTo(result o) {
// TODO Auto-generated method stub
int result = this.x - o.x;
if(result == 0)
result = this.y - o.y;
if(result == 0)
result = this.what - o.what;
return result;
}
}
public static int[][] solution(int n, int[][] build_frame) {
int[][] answer = {};
N = n+1;
pillars = new boolean[n+1][n+1];
beams = new boolean[n+1][n+1];
ansList = new LinkedList<>();
for(int[] f : build_frame){
int x = f[0];
int y = f[1];
int what = f[2];
int how = f[3];
if(how == CONSTRUCT){
if(what == PILLAR){
if(canPillarConstruct(x, y)){
pillars[x][y] = true;
ansList.add(new result(x, y, what));
}
}
else{
if(canBeamConstruct(x, y)){
beams[x][y] = true;
ansList.add(new result(x, y, what));
}
}
}
else{
DoDeconstruct(x, y, what);
if(!allCheck()){
ansList.add(new result(x, y, what));
if(what == PILLAR)
pillars[x][y] = true;
else
beams[x][y] = true;
}
}
}
Collections.sort(ansList);
answer = new int[ansList.size()][3];
for(int i = 0 ; i < ansList.size() ; i++){
answer[i][0] = ansList.get(i).x;
answer[i][1] = ansList.get(i).y;
answer[i][2] = ansList.get(i).what;
}
return answer;
}
private static boolean canBeamConstruct(int x, int y) {
if(y == 0)
return true;
else if(0 <= x-1 && x+1 < N && beams[x-1][y] && beams[x+1][y])
return true;
else if(pillars[x][y-1] || pillars[x+1][y-1])
return true;
return false;
}
private static boolean allCheck() {
Iterator<result> iterator = ansList.iterator();
while(iterator.hasNext()){
result r = iterator.next();
if(r.what == PILLAR){
if(!canPillarConstruct(r.x, r.y))
return false;
}
else{
if(!canBeamConstruct(r.x, r.y))
return false;
}
}
return true;
}
private static void DoDeconstruct(int x, int y, int what) {
for(int i = 0 ; i < ansList.size() ; i++){
if(x == ansList.get(i).x && y == ansList.get(i).y && what == ansList.get(i).what){
ansList.remove(i);
if(what == PILLAR)
pillars[x][y] = false;
else
beams[x][y] = false;
break;
}
}
}
private static boolean canPillarConstruct(int x, int y) {
if(y == 0)
return true;
else if((0 <= x-1 && beams[x-1][y]) || beams[x][y])
return true;
else if(0 <= y-1 && pillars[x][y-1])
return true;
return false;
}
public static void main(String[] args) {
int[][] build_frame = {{1,0,0,1},{1,1,1,1},{2,1,0,1},{2,2,1,1},{5,0,0,1},{5,1,0,1},{4,2,1,1},{3,2,1,1}};
int[][] answer = solution(5, build_frame);
for(int[] ans : answer){
System.out.println(ans[0] + " " + ans[1] + " " + ans[2]);
}
}
}