본문 바로가기
코딩테스트/프로그래머스

[프로그래머스/java] 거리두기 확인하기 - 카카오 기출

by drCode 2022. 8. 28.
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/81302

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

※ 문제 접근 방법

  1. answer를  places의 길이만큼 초기화
  2. for문 - places 생성
  3. P의 위치를 담을 Queue 생성
  4. chArr 배열 초기화
  5. 문자열을 쪼개서 chArr에 값을 넣는다
  6. P의 위치를 Queue에 넣는다
  7. while문을 돈다
  8. visit에 P 위치 방문여부 체크
  9. 방향별 탐색
  10. 배열 크기 초과하는지 확인
  11. X일 때는 그냥 넘어감
  12. P일 땐 바로 결과 0
  13. O일 땐 O의 위치에서 다시 탐색
  14. O 주변에 P가 있을땐 바로 return 0;
  15. O 주변에 O, X 일땐 return 1
package checkDistance;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 
 * @author dr854
 * https://school.programmers.co.kr/learn/courses/30/lessons/81302
 * 코딩테스트 연습 2021 카카오 채용연계형 인턴십 거리두기 확인하기
 */

public class CheckDistance {
	public static void main(String[] args) {
		Solution s = new Solution();
		String[][] places = {{"POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"}, {"POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"}, {"PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"}, {"OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"}, {"PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"}};
		System.out.println(Arrays.toString(s.solution(places)));
	}
}

class Solution {
	int[] dy = {0, 1, 0, -1};
	int[] dx = {1, 0 ,-1, 0};
	String[][] chArr;
	boolean[][] visit;
	
    /**
     * @param places
     * @return
     */
    public int[] solution(String[][] places) {
        int[] answer = new int[places.length];
        
        for (int i = 0; i < places.length; i++) {
			String[] strArr = places[i];
			
			Queue<Pos> q = new LinkedList<Pos>();
			
			chArr = new String[5][5];
			
			for (int j = 0; j < strArr.length; j++) {
				String[] temp = strArr[j].split("");
				
				for (int k = 0; k < temp.length; k++) {
					chArr[j][k] = temp[k];
					
					if(temp[k].charAt(0) == 'P') {
						q.add(new Pos(j, k));
					}
				}
				
				System.out.println(Arrays.toString(chArr[j]));
			}
			
			
			int result = 1;
			
			while(!q.isEmpty()) {
				Pos cur = q.poll();
				visit = new boolean[5][5];
				visit[cur.y][cur.x] = true;
				
				for (int j = 0; j < 4; j++) {
					int nx = dx[j] + cur.x;
					int ny = dy[j] + cur.y;
					
					if(nx < 0 || nx >= 5 || ny < 0 || ny >= 5) continue;
					if("X".equals(chArr[ny][nx])) continue;
					
					if("P".equals(chArr[ny][nx]))  {
						result = 0;
						break;
					}
					
					result = find(ny, nx);
					if(result == 0) break;
					
				}
				
				if(result == 0) break;
			}
			
			answer[i] = result;
			System.out.println();
		}
        
        return answer;
    }
    
    public int find(int r, int c) {
    	visit[r][c] = true;
    	
    	for (int i = 0; i < 4; i++) {
			int ny = r + dy[i];
			int nx = c + dx[i];
			
			if(nx < 0 || nx >= 5 || ny < 0 || ny >= 5) continue;
			if(visit[ny][nx]) continue;
			if("X".equals(chArr[ny][nx])|| "O".equals(chArr[ny][nx])) continue;
			
			return 0;
		}
    	
    	return 1;
    }
}

class Pos {
	int y,x;
	
	public Pos(int y, int x) {
		this.y = y;
		this.x = x;
	}
}

 

 

728x90
반응형

댓글