광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • BOJ
  • 애플워치 앱 만들기
  • 개념
  • DP
  • OS
  • 애플워치 앱
  • BFS
  • 합주
  • 드린이
  • 다이나믹 프로그래밍
  • 오블완
  • 구현
  • 컴퓨터 사이언스
  • 티스토리챌린지
  • 운영체제
  • 파이썬
  • 백준
  • 알고리즘
  • 자바
  • 프로그래머스

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니

광규니네

카테고리 없음

[Java/자바 백준 17070] 파이프 옮기기1

2022. 2. 24. 16:43
반응형

풀이

문제를 잘 못 읽어서 2~3시간 날린 문제 ㅜㅜ

 

그림을 봤을때 파이프 2개가 붙어서 이동하는 줄 알고 그거에 대해서 초점을 맞추고

풀이를 했는데  왜 안될까 하다가 파이프 1개만 이동하는것이네용 !

 

삽질을 좀 오래했지만, 문제를 잘 보자는 교훈을 얻었다...

 

문제 자체는 어렵지 않습니다.

재귀를 이용해서

방향별로 나아갈 수 있는 방향을 잡고,

만약 대각선으로 이동한다면 그 주변 위치 탐색해서 1 이 없으면 전진 가능하며

해당 위치 도달하면 +1 씩 해줍니다.

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

public class Main {
	static int N, answer;
	static int[][] map;
	// 동 남 동남 
	static int[] dx = {0,1,1};
	static int[] dy = {1,0,1};
	
 	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++) {
			StringTokenizer st= new StringTokenizer(br.readLine());
			for(int j = 0 ; j < N ; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		// dir 0, 가로.  1 세로 2 대각
		dfs(0,1,0);
		System.out.println(answer);
		
	}

 	// 동 냠 동남 
	private static void dfs(int x, int y, int dir) {
		if(x == N-1 && y == N-1 && map[x][y] != 1) {
			answer += 1;
			return;
		}
		Loop : for(int i = 0 ; i < 3 ; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if(0 > nx || nx >= N || 0 > ny || ny >= N || map[nx][ny] == 1) continue;
			
			// 방향 가로 
			if(dir == 0) {
				if(i == 1) continue;
				else if(i == 2) {
					if(!isAvailable(nx, ny)) continue Loop;	
				}
			}
			// 세로 
			else if(dir == 1) {
				if(i == 0) continue;
				else if(i == 2) {
					if(!isAvailable(nx, ny)) continue Loop;	
				}
			}
			else if(dir == 2){
				if(i == 2 && !isAvailable(nx, ny))  continue Loop;
			}
			
			dfs(nx,ny,i);
		}
	}

	private static boolean isAvailable(int x, int y) {
		boolean flag = true;
		int[] checkX = {-1,0};
		int[] checkY = {0,-1};
		for(int i = 0 ; i < 2; i++) {
			int nx = x + checkX[i];
			int ny = y + checkY[i];
			if(0 > nx || nx >= N || 0 > ny || ny >= N) continue;
			if(map[nx][ny] == 1) flag =false;
		}
		return flag;
	}
}
반응형
저작자표시 (새창열림)
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바