본문 바로가기

Algorithm/Programmers

Level 1: PCCP 기출문제 - 이웃한 칸, 이중 배열의 랜덤 엑세스

이 문서의 내용

    문제 풀이: 이중 배열의 랜덤 엑세스

    이중 배열 전체에 엑세스하지 않고 랜덤 엑세스로 필요한 Element만 참조합니다(상, 하, 좌, 우).

    이때 엑세스 포인트가 배열의 크기를 넘어서는 경우에 대한 예외 처리가 필요합니다.

    class Solution {
    	public int solution(String[][] board, int h, int w) {
    		String l = (0 <= w - 1) ? board[h][w -1] : "";
    		String r = (w + 1 < board[0].length) ? board[h][w + 1] : "";
    		String t = (0 <= h - 1) ? board[h -1][w] : "";
    		String b = (h + 1 < board.length) ? board[h + 1][w] : "";
            
    		int answer = 0;
    		if (0 == l.compareTo(board[h][w])) ++answer;
    		if (0 == r.compareTo(board[h][w])) ++answer;
    		if (0 == t.compareTo(board[h][w])) ++answer;
    		if (0 == b.compareTo(board[h][w])) ++answer;
    		return answer;
    	}
    }
    코드 비고
    Line 3:6 (0 <= w - 1) ? board[h][w -1] 이중 배열의 좌, 우, 상, 하에 엑세스합니다.
    각 엑세스 포인트는 배열의 크기를 넘어서지 않도록 예외 처리합니다.
    (w + 1 < board[0].length) ? board[h][w + 1]
    (0 <= h - 1) ? board[h -1][w]
    (h + 1 < board.length) ? board[h + 1][w]
    Line 9:12 compareTo(board[h][w]) 기준이 되는 Element와 비교합니다.

    문제 풀이: 엑세스 포인트를 배열로 구성, 공통 로직으로 문제를 해결

    엑세스가 필요한 좌표를 배열로 미리 구성하고 이를 루프하면 공통 로직으로 문제를 해결 할 수 있습니다.

    class Solution {
    	public int solution(String[][] board, int h, int w) {
    		int[] dh = { 0, 0, -1, 1 };
    		int[] dw = { -1, 1, 0, 0 };
    		
    		int answer = 0;
    		for (int i = 0; i < 4; ++i)
    		{
    			int cw = w + dw[i];
    			int ch = h + dh[i];
    			if (0 > cw ||
    			    0 > ch ||
    			    cw > board[0].length ||
    			    ch > board.length) continue;
    			if (0 == board[ch][cw].compareTo(board[h][w]))
    				++answer;
    		}
    		
    		return answer;
    	}
    }
    코드 비고
    Line 3:4 dh = { 0, 0, -1, 1 } dhdw는 이중 배열에서 좌, 우, 상, 하에 대한 이동량입니다.
    dw = { -1, 1, 0, 0 }
    Line 7:17 for (...) 공통된 로직으로 문제를 해결합니다.
    기존 방식은 이동 방향에 따라서 4가지 조건문을 구성해야 했습니다.