https://school.programmers.co.kr/learn/courses/30/lessons/161990
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
내 코드
package programmers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class 바탕화면정리 {
public static void main(String[] args) {
System.out.println(Arrays.toString(solution(new String[]{"..........", ".....#....", "......##..", "...##.....", "....#....."})));
}
public static int[] solution(String[] wallpaper) {
/* 문제 의도
wallpaper 배열에서 #이 있는 위치 중 result로 리턴해줄 때 [y축 중에서 가장 작은 수, x축 중에서 가장 작은 수, y축 중에서
가장 큰 수 + 1, x축 중에서 가장 큰 수 + 1]
wallpaper 배열에는 #이 중복되어 있는 경우가 있어서 indexOf 내장함수를 사용할 순 없다. -> 반복문으로 #이 또 있으면 #에 대한
인덱스 저장을 수정하는 식으로 해야함.
*/
char[][] arr = new char[wallpaper.length][wallpaper[0].length()];
for (int i = 0; i < wallpaper.length; i++) {
arr[i] = wallpaper[i].toCharArray();
}
List<int[]> pointList = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] == '#') {
pointList.add(new int[]{i, j});
}
}
}
int[] yArr = new int[pointList.size()];
int[] xArr = new int[pointList.size()];
for (int i = 0; i < pointList.size(); i++) {
yArr[i] = pointList.get(i)[0];
xArr[i] = pointList.get(i)[1];
}
int ySmall = Arrays.stream(yArr).min().getAsInt();
int xSmall = Arrays.stream(xArr).min().getAsInt();
int yBig = Arrays.stream(yArr).max().getAsInt() + 1;
int xBig = Arrays.stream(xArr).max().getAsInt() + 1;
return new int[]{ySmall, xSmall, yBig, xBig};
}
}
이번에는 솔은 성공했으나 코드가 조금 지저분하다는 생각은 든다. y축 중에서 가장 작은 수, x축 중에서 가장 작은 수, y축 중에서 가장 큰 수 + 1, x축 중에서 가장 큰 수 + 1 이걸 리턴해주면 된다는 로직을 찾았다.
가장 먼저 wallpaper 배열을 2중 배열로 만들고 파일이 존재하는 부분(wallpaer 배열 문자열 객체에서 #이 있는 좌표 위치)을 리스트로 저장했다. 그 다음 y좌표만 따로 저장할 yArr 배열과 x좌표만 따로 저장할 xArr 배열을 생성했고 거기서 가장 작은 수, 큰 수 등을 변수로 초기화해 배열 값에 하드코딩하여 리턴해서 만들었다.
상대 코드
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 i=0; i< wallpaper.length;i++ ){
for(int j=0; j<wallpaper[i].length();j++){
if(wallpaper[i].charAt(j)=='#'){
minX = Math.min(minX,i);
minY = Math.min(minY,j);
maxX = Math.max(maxX,i);
maxY = Math.max(maxY,j);
}
}
}
return new int[]{minX,minY,maxX+1,maxY+1};
}
}
일단 눈에 띄는 것은 굳이 2중 배열로 바꾸지 않은 점이다. 그 다음은 가장 큰 수, 가장 작은 수를 제공해주고 있는 Integer.MAX_VALUE, Integer.MIN_VALUE 등을 활용한 부분이다. 저런 방식을 생각했으나 가장 작은 수를 의미하는 변수에 큰 수를 어떻게 넣어주어야 할지 몰라서 배열을 만드는 방식으로 진행했는데 차후에는 그런 부분없이 만들 수 있을 것 같다.
'java > 메모장' 카테고리의 다른 글
JPA, querydsl는 네이티브 쿼리를 보완할 수 있을까? (0) | 2024.03.21 |
---|---|
[코딩테스트] 공원 산책 (0) | 2024.02.18 |
[코딩테스트] 추억 점수 (0) | 2024.02.18 |
[코딩테스트] 달리기 경주 (0) | 2024.02.18 |
형 변환 (0) | 2024.02.12 |