inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 코딩테스트 - it 대기업 유제

7. "최소 회의실 개수" 문제 해법

방향바꾸기 문제 질문드립니다.

314

vkfksaosldk

작성한 질문수 27

0

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


class Node implements Comparable<Node>{
	int x;
	int y;
	int c;
	Node(int x, int y, int c){
		this.x=x;
		this.y=y;
		this.c=c;
	}
	@Override
	public int compareTo(Node o) {
		return this.c-o.c;
	}
}
class Main {
	 public int solution(int[][] board) {
	        int answer = 0;
	        
	        int n=board.length;
	        int m=board[0].length;
	        
	        int[][] dist =new int[n][m];
	        int INF = (int)1e9;
	        PriorityQueue<Node> q = new PriorityQueue<>();
	        q.add(new Node(0,0,0));
	        for(int i=0; i<n; i++) Arrays.fill(dist[i], INF);
	        dist[0][0]=0;
	        
	        int[] dx = {0,0,1,-1};
	        int[] dy = {1,-1,0,0};
	        
	        while(!q.isEmpty()) {
	        	Node tmp = q.poll();
	        	int nowx = tmp.x;
	        	int nowy = tmp.y;
	        	int nowc=tmp.c;
	        	int dir = board[nowx][nowy]-1;
	        	if(nowc>dist[nowx][nowy]) continue;
	        	
	        	for(int i=0; i<4;i++) {
	        		int nx = nowx+dx[i];
	        		int ny = nowy+dy[i];
	        		
	        		if(i==dir && dist[nx][ny]>nowc) {
	        			dist[nx][ny] = nowc;
	        			if(q.add(new Node(nx,ny,dist[nx][ny])));
	        		}
	        		else if(i!=dir && dist[nx][ny]>nowc+1) {
	        			dist[nx][ny] = nowc+1;
	        			q.add(new Node(nx,ny,dist[nx][ny]));
	        		}
	        	}
	        }
	        answer = dist[n-1][m-1];
	        return answer;
	    }

		public static void main(String[] args){
			Main T = new Main();
			System.out.println(T.solution(new int[][]{{3, 1, 3}, {1, 4, 2}, {4, 2, 3}}));
			System.out.println(T.solution(new int[][]{{3, 2, 1, 3}, {1, 1, 4, 2}, {3, 4, 2, 1}, {1, 2, 2, 4}}));
			System.out.println(T.solution(new int[][]{{3, 2, 1, 3, 1, 2}, {2, 1, 1, 1, 4, 2}, {2, 2, 2, 1, 2, 2}, {1, 3, 3, 4, 4, 4}, {1, 2, 2, 3, 3, 4}}));
			System.out.println(T.solution(new int[][]{{3, 2, 1, 3, 1, 2, 2, 2}, {2, 1, 1, 1, 4, 2, 1, 1}, {2, 2, 2, 1, 2, 2, 3, 4}, {1, 3, 3, 4, 4, 4, 3, 1}, {1, 2, 2, 3, 3, 4, 3, 4}, {1, 2, 2, 3, 3, 1, 1, 1}}));
			System.out.println(T.solution(new int[][]{{1, 2, 3, 2, 1, 3, 1, 2, 2, 2}, {1, 2, 2, 1, 1, 1, 4, 2, 1, 1}, {3, 2, 2, 2, 2, 1, 2, 2, 3, 4}, {3, 3, 1, 3, 3, 4, 4, 4, 3, 1}, {1, 1, 1, 2, 2, 3, 3, 4, 3, 4}, {1, 1, 1, 2, 2, 3, 3, 1, 1, 1}}));
		}
	 }

이렇게 작성하니까 배열 길이가 맞지 않다고 뜹니다.

어디가 잘 못된건가요???

 

 

java 코딩-테스트

답변 2

0

김태원

안녕하세요^^

인프런 AI의 답변능력이 대단하네요.

nx, ny 자표가 board 범위 밖으로 나가는 경우의 자표를 continue 해주어야 합니다. 아래 코드가 추가되어야 합니다.

if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
import java.io.*;
import java.util.*;


class Node implements Comparable<Node>{
	int x;
	int y;
	int c;
	Node(int x, int y, int c){
		this.x=x;
		this.y=y;
		this.c=c;
	}
	@Override
	public int compareTo(Node o) {
		return this.c-o.c;
	}
}
class Main {
	 public int solution(int[][] board) {
	        int answer = 0;
	        
	        int n=board.length;
	        int m=board[0].length;
	        
	        int[][] dist =new int[n][m];
	        int INF = (int)1e9;
	        PriorityQueue<Node> q = new PriorityQueue<>();
	        q.add(new Node(0,0,0));
	        for(int i=0; i<n; i++) Arrays.fill(dist[i], INF);
	        dist[0][0]=0;
	        
	        int[] dx = {0,0,1,-1};
	        int[] dy = {1,-1,0,0};
	        
	        while(!q.isEmpty()) {
	        	Node tmp = q.poll();
	        	int nowx = tmp.x;
	        	int nowy = tmp.y;
	        	int nowc = tmp.c;
	        	int dir = board[nowx][nowy]-1;
	        	if(nowc>dist[nowx][nowy]) continue;
	        	
	        	for(int i=0; i<4;i++) {
	        		int nx = nowx+dx[i];
	        		int ny = nowy+dy[i];
				if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
	        		if(i==dir && dist[nx][ny]>nowc) {
	        			dist[nx][ny] = nowc;
	        			if(q.add(new Node(nx,ny,dist[nx][ny])));
	        		}
	        		else if(i!=dir && dist[nx][ny]>nowc+1) {
	        			dist[nx][ny] = nowc+1;
	        			q.add(new Node(nx,ny,dist[nx][ny]));
	        		}
	        	}
				
	        }
	        answer = dist[n-1][m-1];
	        return answer;
	    }

		public static void main(String[] args){
			Main T = new Main();
			System.out.println(T.solution(new int[][]{{3, 1, 3}, {1, 4, 2}, {4, 2, 3}}));
			System.out.println(T.solution(new int[][]{{3, 2, 1, 3}, {1, 1, 4, 2}, {3, 4, 2, 1}, {1, 2, 2, 4}}));
			System.out.println(T.solution(new int[][]{{3, 2, 1, 3, 1, 2}, {2, 1, 1, 1, 4, 2}, {2, 2, 2, 1, 2, 2}, {1, 3, 3, 4, 4, 4}, {1, 2, 2, 3, 3, 4}}));
			System.out.println(T.solution(new int[][]{{3, 2, 1, 3, 1, 2, 2, 2}, {2, 1, 1, 1, 4, 2, 1, 1}, {2, 2, 2, 1, 2, 2, 3, 4}, {1, 3, 3, 4, 4, 4, 3, 1}, {1, 2, 2, 3, 3, 4, 3, 4}, {1, 2, 2, 3, 3, 1, 1, 1}}));
			System.out.println(T.solution(new int[][]{{1, 2, 3, 2, 1, 3, 1, 2, 2, 2}, {1, 2, 2, 1, 1, 1, 4, 2, 1, 1}, {3, 2, 2, 2, 2, 1, 2, 2, 3, 4}, {3, 3, 1, 3, 3, 4, 4, 4, 3, 1}, {1, 1, 1, 2, 2, 3, 3, 4, 3, 4}, {1, 1, 1, 2, 2, 3, 3, 1, 1, 1}}));
		}
	 }

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

vkfksaosldk님, 제시해주신 코드에서 발생한 배열 길이가 맞지 않는 문제는 배열의 인덱스가 범위를 벗어난 경우에 발생할 수 있습니다.

코드의 while 루프 내부에서 nxny는 배열 board의 범위를 벗어날 수 있는데, 이를 확인하지 않고 dist[nx][ny]에 접근하려 할 때 ArrayIndexOutOfBoundsException이 발생합니다. 따라서 배열에 접근하기 전 nxny가 배열 범위 안에 있는지 확인하는 조건을 추가해야 합니다.

예를 들어, 다음과 같은 조건을 for 루프 내부에 추가할 수 있습니다:

if(nx >= 0 && ny >= 0 && nx < n && ny < m) {
    // 배열 범위 안에 있을 때만 로직 실행
}

수정된 코드의 일부는 다음과 같습니다:

// ... 기존 코드 ...

while(!q.isEmpty()) {
    Node tmp = q.poll();
    int nowx = tmp.x;
    int nowy = tmp.y;
    int nowc=tmp.c;
    if(nowc>dist[nowx][nowy]) continue;

    for(int i=0; i<4;i++) {
        int nx = nowx+dx[i];
        int ny = nowy+dy[i];

        // 배열 범위를 체크하는 조건을 추가합니다.
        if(nx >= 0 && ny >= 0 && nx < n && ny < m) {
            int dir = board[nowx][nowy]-1;
            if(i==dir && dist[nx][ny]>nowc) {
                dist[nx][ny] = nowc;
                q.add(new Node(nx,ny,dist[nx][ny]));
            }
            else if(i!=dir && dist[nx][ny]>nowc+1) {
                dist[nx][ny] = nowc+1;
                q.add(new Node(nx,ny,dist[nx][ny]));
            }
        }
    }
}

dir 변수의 할당은 if(nx >= 0 && ny >= 0 && nx < n && ny < m) 조건문 안에서 수행되야 하며, i==dir 조건을 체크하기 전에도 범위 검사를 해야 합니다.

해당 부분을 수정하시어 프로그램이 올바르게 작동하는지 확인해 보시기 바랍니다.

비밀번호

0

67

1

과일 가져가기 이러한 경우에는 반례가 생기지 않나요?

0

161

2

cpu 스케줄링

0

106

2

외부 문제 질문

0

122

2

가장 많이 사용된 회의실

0

118

2

심사위원 문제 시간복잡도 질문

0

127

1

현관문 출입순서

0

98

1

미로의 최단거리 통로

0

74

1

집으로 이동 문제 코드

0

124

1

채점 사이트 개설

0

161

2

송아지를 잡자

1

110

1

다익스트라 + 환승횟수

0

135

2

문제풀이 해설 질문입니다.

0

124

2

"이동 횟수" 문제가 변형된다면?

0

156

2

예제 3번의 정답이 이해가 되지 않아요 선생님 ㅜㅜ

0

248

1

"비밀번호" 문제 확인 부탁드립니다!

0

170

1

최대 길이 연속수열 질문

0

193

1

잃어버린 강아지 문제 count 관련 질문있습니다

0

203

1

바둑대회 질문입니당

0

222

1

5. "최대 길이 바이토닉 수열" 에서 설명해주신 방법과 제가 직접 구현한 방법이 달라, 확인 한번 부탁드립니다

0

310

1

알파코드 풀이질문입니다

0

218

1

7번 비밀 번호 문제에 시간복잡도가 궁금합니다!

0

164

1

혹시 이렇게 작성해도 괜찮나요?

0

287

2

문제풀이 확인 부탁드립니다.

0

245

1