BOJ16236 아기상어

2024. 4. 12. 03:04· Problem Solving/구현

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

 

16236번: 아기 상어

N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가

www.acmicpc.net

 

 

BFS를 사용하고 정렬과 구현이 필요한 문제다.

 

import java.util.*;
import java.io.*;

public class Main {
	
	static int n;
	static int[][] map;
	static Node shark;
	
	public static void main(String args[]) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		map = new int[n][n];
		for(int i=0; i<n;i++) {
			String[] temp = br.readLine().split(" "); 
			for(int j=0; j<n; j++) {
				map[i][j] = Integer.parseInt(temp[j]);
				if(map[i][j] == 9) {
					shark = new Node(i,j,2,0);
					map[i][j]=0;
				}
			}
		}
		
		
		int ans = 0;
		int eat_count=0;
		while(true){
			// 그중 제일가까운 물고기 선택 
			Node found_fish = find_fish(shark);

			//먹을 수 없다면 break;
			if( found_fish == null) {
				break;
			}
			// 물고기 섭취수 증가  
			eat_count++;
			
			
			// 사이즈만큼의 물고기를 먹으면 사이즈 1 증가, 섭취수0으로 초기화 
			if(eat_count==shark.size) {
				eat_count=0;
				shark.size++;
			}
			
			//물고기 빈칸으로 만들기 
			map[found_fish.r][found_fish.c]=0;
			
			//상어 위치 이동 
			shark.r = found_fish.r;
			shark.c = found_fish.c;
			
			ans+=found_fish.step;
		}
		
		System.out.println(ans);

			
	}
	
	


	public static Node find_fish(Node start){
		List<Node> arr= new ArrayList<>();
		int result_step=500;
		boolean[][] visited = new boolean[n][n];
		int[] move_r = {1,-1,0,0};
		int[] move_c = {0,0,1,-1};
		Queue<Node> q = new LinkedList();
		q.offer(start);
		visited[start.r][start.c]=true;
		while(!q.isEmpty()) {

			Node now = q.poll();
			if(result_step< now.step) {
				Collections.sort(arr,(n1, n2) -> {
					if(n1.r==n2.r) {
						return n1.c-n2.c;
					}
					return n1.r-n2.r;
				});
				return arr.get(0);
			}
			
			if(map[now.r][now.c]!=0 && map[now.r][now.c]<shark.size) {
				arr.add(now);
				result_step = now.step;
				
			}
			
			for(int i=0;i<4;i++) {
				Node next= new Node(now.r+move_r[i], now.c+move_c[i],0,now.step+1);
				
				if( next.r<0 || next.r>=n || next.c<0 || next.c>=n || visited[next.r][next.c] || map[next.r][next.c]>shark.size) {
					continue;
				}
				
				visited[next.r][next.c]=true;
				q.offer(next);
				
			}
		}

		
		
		if(arr.isEmpty()) {
			return null;
		}else {
			Collections.sort(arr,(n1, n2) -> {
				if(n1.r==n2.r) {
					return n1.c-n2.c;
				}
				return n1.r-n2.r;
				
			});
			return arr.get(0);
		}
	}
	
	
	public static class Node{
		int r;
		int c;
		int size;
		int step;
		
		public Node(int r, int c, int size, int step) {
			this.r = r;
			this.c = c;
			this.size=size;
			this.step=step;
		}
		
		public String toString() {
			return "["+r+", "+c+", "+step+"]";
		}
	}

}

'Problem Solving > 구현' 카테고리의 다른 글

BOJ14891 톱니바퀴  (0) 2024.04.12
BOJ1018 체스판 다시 칠하기  (0) 2024.02.01
BOJ1120 문자열  (2) 2024.02.01
BOJ4673 셀프넘버  (0) 2024.02.01
BOJ1110 더하기 사이클  (0) 2024.02.01
'Problem Solving/구현' 카테고리의 다른 글
  • BOJ14891 톱니바퀴
  • BOJ1018 체스판 다시 칠하기
  • BOJ1120 문자열
  • BOJ4673 셀프넘버
윤재에요
윤재에요
윤재에요
yunzae.log
윤재에요
전체
오늘
어제
  • 분류 전체보기 (438)
    • Computer Science (115)
      • 데이터베이스 (50)
      • 네트워크 (18)
      • 소프트웨어 공학 (1)
      • 알고리즘 (10)
      • 자료구조 (9)
      • 컴퓨터구조 (0)
      • 운영체제 (0)
      • 데이터 통신 (16)
      • 프로그래밍언어론 (11)
    • Project (20)
      • 후크(Flutter) (1)
      • BDSR로그북(App,BackEnd) (2)
      • 나만의 주점(STM32,Arduino,androi.. (9)
      • 공다(App,BackEnd) (2)
      • 카카오쇼핑 클론코딩 (4)
      • 암호화폐자동매매 (2)
    • Problem Solving (208)
      • 자바 문법 (20)
      • 파이썬 문법,함수 (6)
      • 그리디 (5)
      • 구현 (43)
      • DFS (3)
      • BFS (17)
      • 정렬 (15)
      • 이진 탐색 (16)
      • 다이나믹 프로그래밍 (6)
      • 최단 경로 (5)
      • 그래프 (1)
      • 자료구조 (5)
      • 투포인터 (15)
      • SQL (44)
      • 구간합 (7)
    • I leaned (78)
      • 스프링,스프링부트 (31)
      • Git (6)
      • JAVA (5)
      • Etc (30)
    • 취업 (15)
      • PT면접 (6)
      • 기술면접 (9)
      • 인성면접 (0)
    • log (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • 개미전사
  • 최단거리
  • 이것이 코딩테스트다.
  • 부품찾기
  • 데이터베이스
  • weak entity
  • DP
  • UML
  • 카카오테크캠퍼스
  • 다이나믹프로그래밍
  • 최단 거리
  • 제약 사항
  • 효율적인화폐구성
  • 다이나믹
  • 참조 무결성
  • 교환정렬
  • 먀
  • 이것이 코딩테스트다
  • 다이어그램
  • 힙큐
  • 재시도
  • E-R Model
  • 그리디
  • 플로이드 워셜
  • 이것이코딩테스트다
  • 기수정렬
  • 다익스트라
  • Relationship model
  • 계수정렬
  • 파이썬

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
윤재에요
BOJ16236 아기상어
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.