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 |