알고리즘/문제풀이

[시뮬레이션] 드래곤 커브

lipnus 2019. 4. 7. 18:53
반응형

백준 15685번 드래곤커브 (삼성 SW역량테스트 기출)

https://www.acmicpc.net/problem/15685


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

static int N;
static int[][] map = new int[101][101];

static List<Integer> D = new ArrayList<>();

static int[] nextDir = {1,2,3,0};

static int[] nextN = {0, -1, 0, 1};
static int[] nextM = {1, 0, -1, 0};

static Position pos;

public static void main(String[] args) throws Exception{

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());

for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
int g = Integer.parseInt(st.nextToken());
pos = new Position(n, m);
startDraw(d,g);
}

System.out.println(countSquare());
}


static void startDraw(int dir, int g){

//0세대
map[pos.n][pos.m] = 1; //시작지점 찍음
drawLine(dir);

//남은 세대 그리기
for(int i=1; i<=g; i++){
drawGen(i);
}
}




//과거를 회상하며 '한 세대'의 커브를 그린다
static void drawGen(int g){

int count = (int)Math.pow(2,g-1); //각 세대별 그려야 하는 선의 수
int dIdx = D.size()-1; //D의 후장부터 턴다

for(int i=dIdx; dIdx-count+1<=i; i--){

//그리기
int nowDir = nextDir[D.get(i)];
drawLine(nowDir);
}
}



static void drawLine(int dir){
D.add(dir);
pos.n = pos.n + nextN[dir];
pos.m = pos.m + nextM[dir];
map[pos.n][pos.m] = 1;
}



static int countSquare(){

int count = 0;
for(int i=0; i<=99; i++){
for(int j=0; j<=99; j++){
if(map[i][j]==1 && map[i][j+1]==1 && map[i+1][j]==1 && map[i+1][j+1]==1) count++;
}
}
return count;
}



static class Position{
int n;
int m;

Position(int n, int m){
this.n = n;
this.m = m;
}
}

}



틀렸던 부분1

static int[] nextDir = {2,2,3,2};

static int[] nextDir = {1,2,3,0};

회전방향을 잘못잡음.

회살표의 끝을 회전시키면 되는게 아님.

회전시킨 다음 중심에서 뻗어나가는 방향을 가지고 와야함.



틀렸던 부분2

static void dragonCurve(Position pos, int dir, int g){

//0세대
map[pos.n][pos.m] = 1;
Position nPos = drawLine(new Position(pos.n, pos.m), dir);
D.add(dir);

print();

//남은 세대 그리기
for(int i=1; i<=g; i++){
drawGen(nPos, i);
}
}


//과거를 회상하며 '한 세대'의 커브를 그린다
static void drawGen(Position pos, int g){

int count = (int)Math.pow(2,g-1); //각 세대별 그려야 하는 선의 수
int dIdx = D.size()-1; //D의 후장부터 턴다

for(int i=dIdx; dIdx-count+1<=i; i--){

//그리기
int nowDir = nextDir[D.get(i)];
Position nPos = drawLine(pos, nowDir);

//다음번 정보 업데이트
pos = nPos;
D.add(nowDir);
}
}

마지막 위치가 다음 세대로 전달되지 않음.

[의도] 

drawGen으로 객체의 주솟값 전달 -> 입력받은 클래스를 변화 -> 원래 값이 바뀜


[오류]

1. drawGen으로 객체의 주솟값 전달

2. 입력받은 클래스를 새로 생성한 인스터스로 바꿔치움  

3. pos가 가리키는 주소는 dragonCurve에서 보낸게 아니라 새로 생성한 인스터스를 가리키게 됨.



틀렸던 부분3

틀렸던부분2의 문제점을 해결하기 위해 마지막위치를 전역변수에 설정해놓고 업데이트 시킴.

하지만 전역변수가 다음 세대로 전달되지 않음.

함수 내부의 지역변수랑 전역변수랑 이름이 같았기 때문에 전역이 아니라 지역변수에다가 업데이트함.

반응형

'알고리즘 > 문제풀이' 카테고리의 다른 글

[DFS] 치킨배달(2번째)  (0) 2019.04.09
[시뮬레이션] 큐빙  (0) 2019.04.08
[브루트포스] 사다리 조작  (0) 2019.04.07
[브루트포스] 감시  (0) 2019.04.03
[시뮬레이션] 톱니바퀴  (0) 2019.04.02