-
[프로그래머스 level2] 당구 연습 자바 반사코딩테스트 2025. 4. 21. 13:40반응형
https://school.programmers.co.kr/learn/courses/30/lessons/169198
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
/** * 1쿠션 * @param m 당구대 가로 * @param n 당구대 세로 * @param startX 시작점 x * @param startY 시작점 y * @param balls 공위치 * @return 1쿠션으로 타격시 공이 굴러간 거리의 최솟값 제곱을 담은 배열 */
피드백
🔍 핵심 아이디어: 이미지 반사 (Mirrored Image)
1쿠션으로 목적구를 맞춘다는 것은 벽을 한 번 튕긴 후 목적구에 도달하는 것입니다.
이를 수학적으로 처리할 수 있는 가장 직관적인 방법은:
"벽에 튕긴 것을 생각하는 대신, 목적구를 벽 너머로 반사시켜서 직선 거리로 계산하는 것"
✅ 4가지 반사 케이스
당구대의 네 벽을 기준으로 목적구를 반사한 위치 4곳을 생각합니다:
상단 벽 기준으로 반사: (gX, 2*n - gY)
하단 벽 기준으로 반사: (gX, -gY)
좌측 벽 기준으로 반사: (-gX, gY)
우측 벽 기준으로 반사: (2*m - gX, gY)
각 반사된 좌표를 startX, startY 와의 거리 제곱을 비교하여 최소값을 구합니다.
⚠️ 예외 처리
시작점과 목적구가 수직 또는 수평으로 일치할 경우, 직접적으로 벽을 이용한 반사가 안 될 수 있으니 제외합니다.
예: 같은 y좌표에서 상하 반사를 시도하면 공이 자기 자신을 먼저 맞춤public int[] solution(int m, int n, int startX, int startY, int[][] balls) { int[] answer = new int[balls.length]; for(int i = 0; i < balls.length; i ++){ int gX = balls[i][0], gY = balls[i][1]; int minDist = Integer.MAX_VALUE; //반사좌표 int[][] reflects = new int[][]{ {gX, -gY}, // 아랫 벽 {gX, 2*n - gY}, // 윗 벽 {-gX, gY}, // 왼쪽 벽 {2*m -gX, gY} // 오른쪽 벽 }; for(int[] reflect : reflects){ int rX = reflect[0], rY = reflect[1]; //예외처리 : 일직선상 수구 if((startX == gX && gX == rX && ((startY < gY && gY < rY) || (startY > gY && gY > rY)) || (startY == gY && gY == rY && ((startX < gX && gX < rX) || (startX > gX && gX > rX))))){ continue; } int dx = startX - rX, dy = startY - rY; int distSquere = dx*dx + dy*dy; minDist = Math.min(minDist, distSquere); } answer[i] = minDist; } return answer; }
반응형'코딩테스트' 카테고리의 다른 글
[프로그래머스] 호텔 대실 자바 (Level 2) (0) 2025.04.25 [프로그래머스] 미로탈출 (Level 2) 자바 BFS 큐 (0) 2025.04.24 [프로그래머스 level2] 리코쳇로봇 자바 BFS 큐 (0) 2025.04.20 [프로그래머스 level2] 광물 캐기 자바 DFS / greedy 방식 (0) 2025.04.20 [프로그래머스 level2] 과제 진행하기 자바 시간순 정렬, Stack (0) 2025.04.20