-
출처 : 프로그래머스 코딩테스트 연습, https://school.programmers.co.kr/learn/courses/30/lessons/161990
머쓱이의 바탕화면을 정리해주자~
- 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 함
- 시작점 S(x, y) 끝점 E(x, y) => 이으면 네모네모
- 빈칸은 ".", 파일이 있는 칸은 "#"
- 결과는 시작점과 끝점 [x, y, x, y]
나의 풀이
- #을 만나면 체크한다.
(시작점에는 가장 작은 좌표, 끝점에는 가장 큰 좌표가 오겠구나 했음)
- 여기서 중요한 점은 시작할때 시작점 x, y에 wallpaper에서 제일 큰 값을 셋팅해주는 것임
(그렇지 않으면 계속 0이 나올 것임)
(정사각형이 아니므로 시작점 x에 가로길이, y에 세로길이 셋팅 또는 편하게 둘다 가장 큰값 Integer.Max_VALUE으로 셋팅)
(끝점에는 가장 작은 값을 셋팅해줄 수 있는데 0으로 초기화 되어 있으므로 굳이 안해주어도 된다.)
- 직사각형이기 때문에 시작점에 1을 더한것이 끝점이다.
class Solution { public int[] solution(String[] wallpaper) { int[] result = new int[4]; result[0] = wallpaper.length-1; result[1] = wallpaper[0].length()-1; for(int i = 0; i < wallpaper.length; i++) { for(int j = 0; j < wallpaper[i].length(); j++) { if(wallpaper[i].charAt(j) == '#') { result[0] = Math.min(i,result[0]); // 시작점 x result[1] = Math.min(j,result[1]); // 시작점 y result[2] = Math.max(i+1,result[2]); // 끝점 x result[3] = Math.max(j+1,result[3]); // 끝점 y } } } return result; } }
'최소한의 이동거리'라는 단어가 나와서 긴장했었는데 단순히 가장 작은 범위를 뜻하는 것이었다.
다른사람의 풀이 참고
나는 이부분에서 +1을 해주면서 계산을 했는데 반복문을 다 돌고 결과 값에 +1을 해주는 것이 더 효율적인 것 같다.
// for문 시작 result[2] = Math.max(i,result[2]); result[3] = Math.max(j,result[3]); // for문 끝 result[2] +=1; result[3] +=1;
'자바알고리즘' 카테고리의 다른 글
[프로그래머스 LV.2] JadenCase 문자열 만들기 (java) (0) 2023.04.23 [프로그래머스 LV. 1] 공원 산책 (java) (0) 2023.04.03 [262가지 문제로 정복하는 코딩 인터뷰 간단요약] 8장 스택과 큐 (0) 2022.12.24 [262가지 문제로 정복하는 코딩 인터뷰 간단요약] 7장 연결리스트 (0) 2022.12.13 [262가지 문제로 정복하는 코딩 인터뷰 간단요약] 5장 배열(2) (1) 2022.12.10 댓글