본문 바로가기

알고리즘

등산로 조성

문제: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PoOKKAPIDFAUq

 

 

 

 

 

package swexpertmoitest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

/**
 * 1] t입력

	for(i 1~=t)
	
	  2] n(지도크기) / k(자를 수 있는 범위) 입력
	  3] a[n,n] 입력, 원본도 백업
	  4] 가장 높은 위치 찾기
	
	  5] 가장 높은 점 리스트 기준으로 반복문 수행
	      6] 지도에 대해서 for(;;)
							for(;;) 수행
	
	
	      7] 높은 위치 기점으로 한좌표 (1~k)만큼 깍기
	      8] 시작점에서 상하좌우 이동 -> dfs...
	      9] 점수계산(맥스와 비교해서 갱신)
	      10] 지도복구/ (7번)에서 
 * @author yky1990
 */
public class 등산로 
{	
	public static int t,n,k;
	public static int[][] map;
	public static boolean[][] v;
	public static ArrayList<Point> hPointsList = new ArrayList();
	public static ArrayList<Integer> ans = new ArrayList();
	public static int[] dx = new int[] {0,1,0,-1};
	public static int[] dy = new int[] {1,0,-1,0};
	public static int maxPt=0;
	public static int maxCnt=0;
	public static void main(String[] args) 
	{
		Scanner scan = new Scanner(System.in);
		t = scan.nextInt();
		
		for(int i=1;i<=t;i++) 
		{
			n = scan.nextInt();
			k = scan.nextInt();
			map = new int[n][n];
			inputMap(scan);
			findTallestPoints();
			hiking(i);
		}
		
		scan.close();
	}
	private static void hiking(int idx) {
		
		for(int i=0;i<hPointsList.size();i++) 
		{
			int curX = hPointsList.get(i).x;
			int curY = hPointsList.get(i).y;
			
			for(int a=0;a<n;a++) 
			{
				for(int b=0;b<n;b++) 
				{
					if(a==curX && b==curY) {continue;}//현재 기준점은 skip
					
					for(int x=1;x<=k;x++) // 지도 고치는 것
					{
						map[a][b] = map[a][b]-x;
						if(map[a][b]<0) {map[a][b] = map[a][b]+x;break;}
						int cnt=1;
						dfs(curX,curY,cnt);
						if(!ans.contains(maxCnt))ans.add(maxCnt);
						//복구
						map[a][b] = map[a][b]+x;
					}
				}
			}
		}
		System.out.println("#"+idx+" "+ans.get(ans.size()-1));
		maxPt=0;
		maxCnt=0;
		ans.clear();			
		hPointsList.clear();
	}
	private static void dfs(int curX, int curY,int cnt) {
		if(cnt>maxCnt)maxCnt=cnt;
		for(int i=0;i<4;i++) 
		{
			int nx = curX+dx[i];
			int ny = curY+dy[i];
			
			if(nx>=0 && ny>=0 && n>nx && n>ny) 
			{
				if( map[nx][ny]<map[curX][curY]) 
				{
					dfs(nx,ny,cnt+1);	
				}
			}
		}
	}
	private static void printMap() 
	{
		for(int i=0;i<n;i++) 
		{
			for(int j=0;j<n;j++) 
			{
				System.out.print(map[i][j]+" ");
			}System.out.println();
		}
	}
	private static void findTallestPoints() 
	{
		for(int i=0;i<n;i++){for(int j=0;j<n;j++) {if(map[i][j]==maxPt){hPointsList.add(new Point(i,j));}}}
	}
	
	private static void inputMap(Scanner scan) {
		for(int i=0;i<n;i++) 
		{
			for(int j=0;j<n;j++) 
			{
				map[i][j]=scan.nextInt();
				if(maxPt<map[i][j])maxPt=map[i][j];
			}
		}
	}
}
class Point
{
	int x;
	int y;
	public Point(int x,int y) 
	{
		this.x = x;
		this.y = y;
	}
	@Override
	public String toString() 
	{
		return "[x : "+x+" y : "+y+"]";
	}
}

 

 

 

 

2회차 (설계 & 구현 40분 소요)

package academymoi;

import java.util.ArrayList;
import java.util.Scanner;

public class 등산로조성 {
	public static int[] dx = { 0, 1, 0, -1 };
	public static int[] dy = { 1, 0, -1, 0 };
	public static int T, N, K;
	public static int[][] map;
	public static ArrayList<Point> hPointList = new ArrayList();
	public static int maxCnt = 0;

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		T = scan.nextInt();
		for (int i = 1; i <= T; i++) {
			// 입력 & 가장 높은 부분 찾기
			input(scan);

			//
			mountainPath();
			System.out.println("#" + i + " " + maxCnt);
			maxCnt = 0;
			hPointList.clear();
		}

		scan.close();
	}

	private static void mountainPath() {

//		System.out.println(hPointList.toString());

		for (int i = 0; i < hPointList.size(); i++) {
			int stdx = hPointList.get(i).x;
			int stdy = hPointList.get(i).y;

			for (int a = 0; a < N; a++) {
				for (int b = 0; b < N; b++) {
					if (stdx == a && stdy == b)
						continue;
					else {
						// [1] 깍고 탐색하고 원복하고
						for (int x = 1; x <= K; x++) {
							map[a][b] = map[a][b] - x;

							// stdx,stdy 에서 탐색하고
							dfs(stdx, stdy, 1);

							// 원복하고
							map[a][b] = map[a][b] + x;

						}
					}
				}
			}

		}
	}

	private static void dfs(int stdx, int stdy, int cnt) {

		if (cnt >= maxCnt)
			maxCnt = cnt;
		// TODO Auto-generated method stub
		int nx = stdx;
		int ny = stdy;
		int val = map[nx][ny];

		for (int i = 0; i < 4; i++) {
			nx = stdx + dx[i];
			ny = stdy + dy[i];
//			System.out.println("nx:"+nx+" ny:"+ny);
			if (nx >= 0 && ny >= 0 && nx < N && ny < N) {
				if (map[nx][ny] < val) {
					dfs(nx, ny, cnt + 1);
				}
			}
		}
	}

	/**
	 * 입
	 * @param scan
	 */
	private static void input(Scanner scan) {
		N = scan.nextInt();
		K = scan.nextInt();
		map = new int[N][N];
		int tm = 0;
		for (int j = 0; j < N; j++) {
			for (int k = 0; k < N; k++) {
				map[j][k] = scan.nextInt();
				if (tm < map[j][k])
					tm = map[j][k];
			}
		}

		for (int j = 0; j < N; j++) {
			for (int k = 0; k < N; k++) {
				if (map[j][k] == tm) {
					hPointList.add(new Point(j, k));
				}
			}
		}
	}
}

class Point {
	int x;
	int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	@Override
	public String toString() {
		return "Point [x=" + x + ", y=" + y + "]";
	}

}

'알고리즘' 카테고리의 다른 글

공통조상찾기  (0) 2019.09.25
보호필름 설계 & 구현  (0) 2019.09.24
이진탐색  (0) 2019.09.22
보호필름[모의문제]  (0) 2019.09.17
재귀 유용한 틀(1)  (0) 2019.09.16