회원가입
로그인
Toggle navigation
문제
문제
전체 문제
문제 출처
단계별로 풀어보기
알고리즘 분류
추가된 문제
문제 순위
문제
푼 사람이 한 명인 문제
아무도 못 푼 문제
최근 제출된 문제
최근 풀린 문제
랜덤
출처
ICPC
Olympiad
한국정보올림피아드
한국정보올림피아드시․도지역본선
전국 대학생 프로그래밍 대회 동아리 연합
대학교 대회
카카오 코드 페스티벌
Coder's High
ICPC
Regionals
World Finals
Korea Regional
Africa and the Middle East Regionals
Europe Regionals
Latin America Regionals
North America Regionals
South Pacific Regionals
문제집
대회
1
채점 현황
랭킹
게시판
그룹
더 보기
재채점 기록
블로그
강의
실험실
도움말
BOJ Stack
BOJ Book
전체
공지
자유
질문
오타/오역/요청
게시판 공지
홍보
업데이트
solved.ac
글쓰기
질문 도움말
자주묻는 질문
틀린이유를 모르겠습니다.
16235번 - 나무 재테크
jsw782
2년 전
0
예제 테스트케이스 다 맞게 나오는데 어느부분이 잘못됬는지 알려주시면 감사하겠습니다.
import java.util.LinkedList; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; class Tree implements Comparable<Tree>{ int x; int y; int age; @Override public String toString() { return " x=" + x + ", y=" + y + ", age=" + age; } public Tree(int x, int y, int age) { this.x = x; this.y = y; this.age = age; } @Override public int compareTo(Tree o) { if(this.x==o.x&&this.y==o.y) { if(this.age>o.age) { return 1; } } return -1; } } class Main{ static int n,m,k; static int map[][];//양분 static int dx[]= {-1,-1,-1,0,0,1,1,1}; static int dy[]= {-1,0,1,-1,1,-1,0,1}; static PriorityQueue<Tree>tree = new PriorityQueue<Tree>(); static Queue<Tree>dead = new LinkedList<>();//죽은애들 담는 배열 static int winter[][] ; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); m = sc.nextInt(); k = sc.nextInt(); map = new int[n+1][n+1]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { map[i][j]=5;//초기 양분은 5로 설정 } } winter = new int[n+1][n+1]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { winter[i][j]=sc.nextInt();//겨울에 추가되는 양분의 양 } } for(int i=0;i<m;i++) {//x,y는 나무의 위치 z는 나무의 나이 int x = sc.nextInt(); int y = sc.nextInt(); int z = sc.nextInt(); tree.add(new Tree(x,y,z)); } while(k>0) { k--; spring(); summer(); fall(); winter(); } int answer = tree.size(); System.out.println(answer); } private static void checkarr() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { System.out.print(map[i][j]+" "); } System.out.println(); } } private static void spring() { //봄에는 나무가 자신의 나이만큼 양분을 먹고, 나이가 1 증가한다. //각각의 나무는 나무가 있는 1×1 크기의 칸에 있는 양분만 먹을 수 있다. //하나의 칸에 여러 개의 나무가 있다면, 나이가 어린 나무부터 양분을 먹는다. //만약, 땅에 양분이 부족해 자신의 나이만큼 양분을 먹을 수 없는 나무는 양분을 먹지 못하고 즉시 죽는다. Queue<Tree>tmp = new LinkedList<>(); while(!tree.isEmpty()) { Tree data = tree.poll(); if(data.age>map[data.x][data.y]) {//나무의 나이가 양분보다 많을경우 뒤진다. dead.add(data); }else {//나무의 나이가 양분보다 적거나 같을경우 나이 1 증가 map[data.x][data.y]-=data.age; int nAge = data.age+1; tmp.add(new Tree(data.x, data.y, nAge)); } } while(!tmp.isEmpty()) { tree.add(tmp.poll()); } } private static void summer() { //여름에는 봄에 죽은 나무가 양분으로 변하게 된다. //각각의 죽은 나무마다 나이를 2로 나눈 값이 나무가 있던 칸에 양분으로 추가된다. //소수점 아래는 버린다. while(!dead.isEmpty()){ Tree data=dead.poll(); map[data.x][data.y]+=data.age/2; } } private static void fall() { //가을에는 나무가 번식한다. 번식하는 나무는 나이가 5의 배수이어야 하며, //인접한 8개의 칸에 나이가 1인 나무가 생긴다. //어떤 칸 (r, c)와 인접한 칸은 //(r-1, c-1), (r-1, c), (r-1, c+1), (r, c-1), (r, c+1), (r+1, c-1), (r+1, c), (r+1, c+1) 이다. //상도의 땅을 벗어나는 칸에는 나무가 생기지 않는다. Queue<Tree>tmp = new LinkedList<>(); while(!tree.isEmpty()) { Tree data = tree.poll(); if(data.age%5==0) { for(int d=0;d<8;d++) { int nx = data.x+dx[d]; int ny = data.y+dy[d]; if(nx>=1&&nx<=n&&ny>=1&&ny<=n) { tmp.add(new Tree(nx,ny,1)); } } } tmp.add(data);//번식을 하지않더라도 트리는 다시 추가 } while(!tmp.isEmpty()) { tree.add(tmp.poll()); } } private static void winter() { //겨울에는 S2D2가 땅을 돌아다니면서 땅에 양분을 추가한다. //각 칸에 추가되는 양분의 양은 A[r][c]이고, 입력으로 주어진다. for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { map[i][j]+=winter[i][j]; } } } }
댓글을 작성하려면
로그인
해야 합니다.
jsw782 2년 전
예제 테스트케이스 다 맞게 나오는데 어느부분이 잘못됬는지 알려주시면 감사하겠습니다.