알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://school.programmers.co.kr/learn/courses/30/lessons/250125
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Think🤔
문제 파악 30분 동안 먼저
하나를 2차원 배열해서 정한 후 그 주변을 검사 하는 것
처음에 일단 인덱스 값들을 나열해 보았음
00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33
그럼 이 인덱스값들 중
이 가운데 부분들은 상 하 좌 우 4군데의 색깔을 검사해주면 되고
이 뒤가 0인 부분들은 왼쪽을 빼서 검사 하면 된다.
뒤에가 마지막인 경우 , 앞에가 마지막인 경우 , 처음이 0인 경우 각각
오른쪽 검사 X , 아래쪽 검사 X , 위쪽 검사 X
이렇게 IF문으로 걸러주면 된다 기본값은 4방향 다 검사하는 것
class Solution {
public int solution(String[][] board, int h, int w) {
int answer = 0;
String pick = board[h][w]; // 선택한 색
int bF = 0; // 처음 무조건 0
int bL = board.length; // 마지막은 길이
System.out.println("pick :" + pick + ", bF = " + bF + ", bL : " + bL);
if(h == bF){ // 위에 검사 x
if(pick.equals(board[h+1][w])){
answer++;
}
if(pick.equals(board[h][w-1])){
answer++;
}
if(pick.equals(board[h][w+1])){
answer++;
}
}
if(h == bL){ // 아래 검사 x
if(pick.equals(board[h-1][w])){
answer++;
}
if(pick.equals(board[h][w-1])){
answer++;
}
if(pick.equals(board[h][w+1])){
answer++;
}
}
if(w == bF){ // 왼쪽 검사 x
if(pick.equals(board[h-1][w])){
answer++;
}
if(pick.equals(board[h+1][w])){
answer++;
}
if(pick.equals(board[h][w+1])){
answer++;
}
}
if(w == bL){ // 오른쪽 검사 x
if(pick.equals(board[h-1][w])){
answer++;
}
if(pick.equals(board[h+1][w])){
answer++;
}
if(pick.equals(board[h][w-1])){
answer++;
}
}
if(h != bF && h != bL && w != bF && w != bL){
if(pick.equals(board[h-1][w])){
answer++;
}
if(pick.equals(board[h+1][w])){
answer++;
}
if(pick.equals(board[h][w-1])){
answer++;
}
if(pick.equals(board[h][w+1])){
answer++;
}
}
return answer;
}
}
효율적으로 반복문을 돌려서 IF로 넘어가주고 PLUS 해주는 느낌인데 생각이 안나서 그냥 막 적었다.
이렇게 하니 몇몇 테스트 에서 실패(런타임 에러)가 뜸
h,w가 0일수도 있음 조건에 0 <= h,w < board 이렇게 되어 있음
이렇게 모든 경우를 검사하는 방법 말고 문제에 나와 있는대로 코드를 작성해보자
class Solution {
public int solution(String[][] board, int h, int w) {
int answer = 0;
int n = board.length; // 1번
// 정수 리스트 h와 w의 변화량을 저장할 정수 리스트
int[] dh = {0,1,-1,0};
int[] dw = {1,0,0,-1};
for(int i=0; i<4; i++){
int h_check = h + dh[i];
int w_check = w + dw[i];
if((h_check >=0 && h_check < n) && (w_check >= 0 && w_check < n)){
if(board[h][w].equals(board[h_check][w_check])){
answer++;
}
}
}
return answer;
}
}
의사 코드대로 작성하니 바로 풀 수 있었다..
Solution✍
class Solution {
public int solution(String[][] board, int h, int w) {
int answer = 0;
int n = board.length; // 1번
// 정수 리스트 h와 w의 변화량을 저장할 정수 리스트
int[] dh = {0,1,-1,0};
int[] dw = {1,0,0,-1};
for(int i=0; i<4; i++){
int h_check = h + dh[i];
int w_check = w + dw[i];
if((h_check >=0 && h_check < n) && (w_check >= 0 && w_check < n)){
if(board[h][w].equals(board[h_check][w_check])){
answer++;
}
}
}
return answer;
}
}
Review🤩
어떻게 이런 생각을 ... 흠흠
'Algorithm' 카테고리의 다른 글
[프로그래머스] 3월에 태어난 여성 회원 목록 출력하기 , 대여 기록이 존재하는 자동차 리스트 구하기 , 가격대 별 상품 개수 구하기 , 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.01.15 |
---|---|
[프로그래머스] 달리기 경주 (0) | 2024.01.15 |
[프로그래머스] 둘만의 암호 (0) | 2024.01.11 |
[프로그래머스] 대충 만든 자판 (0) | 2024.01.09 |
[프로그래머스] 아이스 아메리카노 (0) | 2024.01.05 |