이웃한 칸
[프로그래머스] [PCCE 기출문제]
문제 설명
각 칸마다 색이 칠해진 2차원 격자 보드판이 있습니다. 그중 한 칸을 골랐을 때, 위, 아래, 왼쪽, 오른쪽 칸 중 같은 색깔로 칠해진 칸의 개수를 구하려고 합니다.
보드의 각 칸에 칠해진 색깔 이름이 담긴 이차원 문자열 리스트 board
와 고른 칸의 위치를 나타내는 두 정수 h
, w
가 주어질 때 board[h][w]
와 이웃한 칸들 중 같은 색으로 칠해져 있는 칸의 개수를 return 하도록 solution
함수를 완성해 주세요.
이웃한 칸들 중 몇 개의 칸이 같은 색으로 색칠되어 있는지 확인하는 과정은 다음과 같습니다.
- 정수를 저장할 변수
n
을 만들고board
의 길이를 저장합니다. - 같은 색으로 색칠된 칸의 개수를 저장할 변수
count
를 만들고 0을 저장합니다. h
와w
의 변화량을 저장할 정수 리스트dh
,dw
를 만들고 각각 [0, 1, -1, 0], [1, 0, 0, -1]을 저장합니다.- 반복문을 이용해
i
값을 0부터 3까지 1 씩 증가시키며 아래 작업을 반복합니다. 4-1. 체크할 칸의h
,w
좌표를 나타내는 변수h_check
,w_check
를 만들고 각각h + dh[i]
,w + dw[i]
를 저장합니다. 4-2.h_check
가 0 이상n
미만이고w_check
가 0 이상n
미만이라면 다음을 수행합니다. 4-2-a.board[h][w]
와board[h_check][w_check]
의 값이 동일하다면count
의 값을 1 증가시킵니다. count
의 값을 return합니다.
제한사항
- 1 ≤
board
의 길이 ≤ 7 board
의 길이와board[n]
의 길이는 동일합니다.- 0 ≤
h
,w
<board
의 길이 - 1 ≤
board[h][w]
의 길이 ≤ 10 board[h][w]
는 영어 소문자로만 이루어져 있습니다.
입출력 예
board | h | w | result |
---|---|---|---|
[[“blue”, “red”, “orange”, “red”], [“red”, “red”, “blue”, “orange”], [“blue”, “orange”, “red”, “red”], [“orange”, “orange”, “red”, “blue”]] | 1 | 1 | 2 |
[[“yellow”, “green”, “blue”], [“blue”, “green”, “yellow”], [“yellow”, “blue”, “blue”]] | 0 | 1 | 1 |
입출력 예 설명
입출력 예 #1
주어진 보드를 나타내면 아래 그림과 같고, board[1][1]
의 인접한 칸들은 화살표가 가리키는 칸들입니다. 따라서 board[1][1]
주변의 “red” 칸은 총 2개입니다.
입출력 예 #2
주어진 보드를 나타내면 아래 그림과 같고, board[0][1]
의 인접한 칸들은 화살표가 가리키는 칸들입니다. 따라서 board[0][1]
주변의 “green” 칸은 총 1개입니다.
- cpp를 응시하는 경우 리스트는 배열과 동일한 의미이므로 풀이에 참고해주세요.
- java를 응시하는 경우 리스트는 배열, 함수는 메소드와 동일한 의미이므로 풀이에 참고해주세요.
import java.util.ArrayList;
import java.util.List;
class Solution {
public int solution(String[][] board, int h, int w) {
// board의 길이를 저장합니다.
int n = board.length;
// 같은 색으로 색칠된 칸의 개수를 저장할 변수 count를 만들고 0으로 초기화합니다.
int count = 0;
// h와 w의 변화량을 저장할 정수 리스트 dh, dw를 만들고 각각 [0, 1, -1, 0], [1, 0, 0, -1]을 저장합니다.
List<Integer> dh = new ArrayList<>();
List<Integer> dw = new ArrayList<>();
int[] dhArr = {0, 1, -1, 0};
int[] dwArr = {1, 0, 0, -1};
for (int a : dhArr) {
dh.add(a);
}
for (int a : dwArr) {
dw.add(a);
}
// 반복문을 이용해 인접한 칸들을 체크합니다.
for (int i = 0; i < 4; i++) {
int h_check = h + dh.get(i);
int w_check = w + dw.get(i);
// 인덱스가 범위 내에 있고, 현재 위치와 인접한 칸의 색이 같다면 count를 증가시킵니다.
if (h_check >= 0 && h_check < n && w_check >= 0 && w_check < n &&
board[h][w].equals(board[h_check][w_check])) {
count++;
}
}
// count 값을 반환합니다.
return count;
}
}
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Leave a comment