본문 바로가기
java/메모장

[코딩테스트] 바탕화면 정리

by choi-dev 2024. 2. 18.

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