프로그래머스 이웃한 칸 자바 문제 풀이
문제 인식
- 고른칸의 위치 h,w 에 해당하는 색깔이 board[h][w] 의 오른쪽,왼쪽,위,아래에 해당 색과 똑같은 색이 몇개 있나 추출하는 문제
- board의 길이는 1 이상 7 이하
- h,w는 0 이상 board 길이보다 적어야 함
- board는 영어 소문자로만 이루어져있음
문제 접근
Lv.1 단계라 문제 속에 풀이를 순서대로 하면 풀리지만 앞으로 알고리즘을 풀기 위해서는 따라칠것만이 아니라 해결과정을 세세하게 파보았다.
- 필요한 변수명들 지정
코테 입문기라 아직 문제의 파악에는 시간이 오래걸렸다.이를 위해서 내가 개선한 방법은 일단 필요한 변수명들을 하나씩 지정해줬다.
필요한 변수명은 보드의 길이를 알려줄 n
, 양방향의 같은 색으로 칠해진 개수를 알 수 있는 return 값 count
, h와 w의 각각 변화량을 알려줄 리스트 형태의 dh,dw
- for 반복문
1
2
int[] dh = {0,1,-1,0}; // h의 변화량
int[] dw = {1,0,0,-1}; // w의 변화량
위의 변수명 dh,dw
의 리스트 형태에 따라 각각의 위,아래,오른쪽,왼쪽을 비교해봐야하기에 4번의 비교 반복이 필요하다.
- if 조건문
반복안속의 if 조건문이다. 이 문제를 풀기 위해서는 4번의 반복동안 골라준 board[h][w]와 각각 양방향의 색을 비교해봐야 하기에 h_check,w_check
변수명을 따로 지정해주고
1
2
3
4
5
6
7
int h_check = h + dh[i];
int w_check = w + dw[i];
if (0 <= h_check && h_check < n && 0 <= w_check && w_check < n){
if(board[h][w].equals(board[h_check][w_check])) {
count += 1;
}
}
이런식으로 접근 하면 h_check에 dh,dw의 각각 i번째 값을 더하면서 board[h_check][w_check]이 board[h][w]와 동일한지 비교 가능했다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public int solution(String[][] board, int h, int w) {
// 각 칸에 색깔 이름 담긴 리스트 board
// 고른칸의 위치 h,w
int n = board.length; // 정수를 저장할 변수, board의 길이
int count = 0; // 같은 색으로 색칠된 칸의 개수
int[] dh = {0,1,-1,0}; // h의 변화량
int[] dw = {1,0,0,-1}; // w의 변화량
for(int i=0; i<=3; i++) {
int h_check = h + dh[i];
int w_check = w + dw[i];
if (0 <= h_check && h_check < n && 0 <= w_check &&w_check < n){
if(board[h][w].equals(board[h_check][w_check])) {
count += 1;
}
}
}
return count;
}
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.