문제는 프로그래머스에 가서 읽어보자.
https://school.programmers.co.kr/learn/courses/30/lessons/161990
나도 모르게 if문을 발라버렸다. 자존심에 스크래치 났다. 이대로라면, 오늘 꿀잠을 잘 수 없기 때문에 조금 더 생각해보기로 했다.
파일이 위치하게 되면, 왼쪽 위 모서리와 오른쪽 밑 모서리가 드래그 가능한 공간이 된다.
하지만, 좌표를 어떻게 비교할지는 직접 파일을 놔보면서 몇 개의 케이스를 생각해보자.
최소거리
를 구하는 것이다. 즉, 지금 주황 형광색 시작지점이 최소거리가 될 수 있는 지점인걸 알 수 있다.2개까지만 놓는것도 괜찮지만, 혹시라도 모를 예외나 반례가 발생할 수 있다. 3개까지 놓아보자.
예상대로, 새로운 파일의 시작점과 끝점을 드래그 해야하는 Point와 비교해서 시작점은 최솟값으로 갱신,끝점은 최댓값으로 갱신하는걸 알 수 있다.
개선 전 코드
class Solution {
public int[] solution(String[] wallpaper) {
int[] answer = new int[4];
boolean firstTime = true;
for(int x=0;x<wallpaper.length;x++){
for(int y=0;y<wallpaper[x].length();y++){
//없는 경우 무시
if(wallpaper[x].charAt(y)=='.')
continue;
//파일발견
int sx = x;
int sy = y;
int ex = x+1;
int ey = y+1;
if(firstTime){
answer[0] = sx;
answer[1] = sy;
answer[2] = ex;
answer[3] = ey;
firstTime = false;
}
if(sx<answer[0]){
answer[0] = sx;
}
if(sy<answer[1]){
answer[1] = sy;
}
if(answer[2]<ex){
answer[2] = ex;
}
if(answer[3]<ey){
answer[3] = ey;
}
}
}
return answer;
}
}
개선 후 코드
class Solution {
public int[] solution(String[] wallpaper) {
int minX = Integer.MAX_VALUE;
int minY = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
int maxY = Integer.MIN_VALUE;
for(int x=0;x<wallpaper.length;x++){
for(int y=0;y<wallpaper[x].length();y++){
//없는 경우 무시
if(wallpaper[x].charAt(y)=='.')
continue;
//파일발견
minX = Math.min(minX,x);
minY = Math.min(minY,y);
maxX = Math.max(maxX,x);
maxY = Math.max(maxY,y);
}
}
int[] answer = {minX,minY,maxX+1,maxY+1};
return answer;
}
}