알고리즘/문제풀이

[구현] 줄기세포배양

lipnus 2018. 9. 24. 03:32
반응형

5653. [모의 SW 역량테스트] 줄기세포배양




*조건이 많아서 차분하게 풀어야함. 


*매번 전체 맵 다 확인하도록 무식하게 만들었는데, 이정도로 통과가 되지만 효율성&구조 개선시킬 부분이 있음

-전체 맵 크기 최적화

-매번 전체 맵을 스캔하지 않고 필요한 부분(활성화, 비활성화, 검토)만 메모해 두었다가 해당지역만 검색


*나중에 시간나면? 개선된 방법으로 수정


package com.company;
import java.util.Scanner;


public class Main {

static int START_POINT = 250;
static int MAP_SIZE = 500;

//상하좌우
static int[] dx={0, 0, -1, 1};
static int[] dy={-1, 1, 0, 0};

public static void main(String[] args) {


Scanner sc = new Scanner(System.in);
int T = sc.nextInt();

for(int test_case=1; test_case<=T; test_case++){
int N = sc.nextInt();
int M = sc.nextInt();
int K = sc.nextInt();
Cell[][] map = new Cell[MAP_SIZE][MAP_SIZE];

for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
int cellState = sc.nextInt();
if(cellState!=0) map[i+ START_POINT][j+ START_POINT]=new Cell(cellState);
}
}
//for(i)

System.out.println( "#" + test_case + " " + play(K,map) );
}
}


static int play(int K, Cell[][] map){

//지정된 시간만큼 루프
for(int time=1; time<=K; time++){

//매 루프마다 전 map을 탐색하고 업데이트
for(int i=0; i<MAP_SIZE; i++){
for(int j=0; j<MAP_SIZE; j++){

if(map[i][j]!=null){

//활성상태인 경우에는 번식을 시도----------------------------------------------------
if(map[i][j].state==1){
for(int d=0; d<4; d++){
Cell nearPlace = map[ i+
dx[d] ][ j+dy[d] ];

if( nearPlace==null ){ //빈땅인 경우
map[ i+dx[d] ][ j+dy[d] ] = new Cell( map[i][j].time,3);
}else if( nearPlace.state==3 ){ //번식 검토지역
if(nearPlace.time < map[i][j].time){//내가 더 쎄다
map[ i+dx[d] ][ j+dy[d] ] = new Cell( map[i][j].time,3);
}
}
//if
}//for(상하좌우번식)
}//if(활성상태인 경우에는 번식을 시도-------------------------------------------------

map[i][j].lifeCycle(); //생명주기 처리
}//if(null)

}//for(j)
}//for(i)

//검토상태인 것들을 비활성상태로 확정
for(int i=0; i<MAP_SIZE; i++){
for(int j=0; j<MAP_SIZE; j++){
if(map[i][j]!=null && map[i][j].state==3) map[i][j].state=0;
}//for(j)
}//for(i)
}//for(time)

//살아있는 세포 수를 센다
int liveCell=0;
for(int i=0; i<MAP_SIZE; i++){
for(int j=0; j<MAP_SIZE; j++){
if(map[i][j]!=null){
if(map[i][j].state==0 || map[i][j].state==1) liveCell++;
}
}
//for(j)
}//for(i)

return liveCell;
}


static class Cell{
int state; // 0:비활성 1:활성 2:죽음 3:번식검토
int time; //타고난 생명력
int remainTime; //남은 생명력

public Cell(int time) {
this.state = 0;
this.time = time;
this.remainTime = time;
}

public Cell(int time, int state) {
this.state = state;
this.time = time;
this.remainTime = time;
}

public void lifeCycle(){
if(this.state==0 || this.state==1) this.remainTime--;

//현재의 주기가 끝난경우 처리
if(this.remainTime==0){

if(this.state==0){ //비활성->활성
this.state=1;
this.remainTime = this.time;
}else if(this.state==1) this.state=2; //활성->죽음

}//if
}

}
}


반응형

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

[정렬] 프린터  (0) 2018.09.26
[Queue] 기능개발  (0) 2018.09.24
[정렬] H-index  (0) 2018.09.23
[정렬] K번째 수  (0) 2018.09.19
[Hash] 베스트앨범  (0) 2018.09.18