23.06.22 TIL

정길규·2023년 6월 22일

이노캠 알고리즘 문제 풀이

오늘 이노캠에서 알고리즘 문제 시험이 있었다. 그래서 오늘 문제를 풀이하면서 알게된 점을 정리 해볼려고 한다.

자연수 뒤집어 더하기

문제는 int형 입력값을 받으면 거꾸로 뒤집어서 출력하는 문제이다.

public class Main {
    public String solution(int n) {
    
        // 입력값 int 형을 String 형으로 변환
        String str = Integer.toString(n);

        // String 의 각 자리수로 나누어 배열로 만듬.
        String[]strs = str.split("");

        // 새로운 배열을 만들어서 거꾸로 대입함.
        String[] newStrs = new String[strs.length];
        for (int i = 0, j = strs.length - 1; i < strs.length; i++, j--) {
            newStrs[i] = strs[j];
        }
        // join 메서드를 이용해서 각 "+"를 각사이에 추가해서 String 으로 반환
        String joinStr = String.join("+", newStrs);

        // 배열의 합을 구함
        int sum = 0;
        for (String num: strs) {
            sum += Integer.valueOf(num);
        }

        return joinStr + "=" + sum;
    }
}

위와 같이 구현을 하였다. 풀고나서 String을 뒤집기는 위와 같이 새로운 배열을 만들어서 for문을 이용해서 뒤집을수도 있지만 찾아보니 StringBuilder 또는 StringBuffer 클래스의 reverse() 메서드를 이용하면 쉽게 문자열 뒤집기가 가능하다.

String str = "Hello";

StringBuilder sb = new StringBuilder(str).reverse();

System.out.println(sb); // olleH

위와 같이 쉽게 문자열을 뒤집을 수 있었다.

양옆앞뒤 큰 수찾기

이 문제는 4방 탐색 문제이다. 예전에 한번 비슷한 문제를 본기억이 있어서 문제 풀이 접근은 쉽게 하였다.

public class Main {
    public void solution(int[][] arr1) {

        String[][] strArr = new String[arr1.length][arr1[0].length]; // 새로운 String 2차원 배열

        int[][] check = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 상, 하, 좌, 우

        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1[i].length; j++) {
                boolean maxC = true;
                for (int k = 0; k < check.length; k++) { // 상, 하, 좌, 우 이동
                    int y = i + check[k][0];
                    int x = j + check[k][1];

                    if (y < 0 || y >= arr1.length || x < 0 || x >= arr1[i].length) { // 상, 하 , 좌, 우 로 이동하여 배열 밖으로 이동시  넘김
                        continue;
                    } else {
                        if (arr1[i][j] <= arr1[y][x]) {
                            maxC = false;
                        }
                    }
                }
                if (maxC) {
                    strArr[i][j] = "*"; // 좌우 비교 해서 재일 큰수면 "*" 로 입력
                } else {
                    strArr[i][j] = String.valueOf(arr1[i][j]); // 아니면 본인 값 입력
                }
            }
        }

        // strArr[][] 배열 출력
        for (int i = 0; i < strArr.length; i++) {
            for (int j = 0; j < strArr[i].length; j++) {
                System.out.print(strArr[i][j] + " ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Main method = new Main();
        int[][] arr1 = {{3,4,1,4,9},{2,9,4,5,8},{9,0,8,2,1},{7,0,2,8,4},{2,7,2,1,4}};

        method.solution(arr1);
    }
}

이 문제를 풀이하면서 각 배열에서 상하좌우 이동해서 확인하는 것 까지는 쉽게 구현했는데 이동을 했을때 배열 밖으로 이동할 경우 어떻게 구현해야 될지 생각하는데 오랜 시간이 걸려었다.(continue가 포함되어 있는 if문) 그리고 이 문제도 출력할 때 StringBuilder 클래스를 사용했으면 더 간단하게 코드를 구현할수 있지 않았을까 한다.

마치며

처음 알고리즘 문제를 풀때에는 많이 힘들었는데 풀다보니 예전보다는 나아진것 같았다. 그런데 풀다보니 처음가 다르게 생각해서 푼다기 보다는 점점 외워서 푸는 듯한 느낌이 드는것 같다. 많이 알고리즘 문제는 많이 풀어보면 된다는게 이래서 그런건가 생각이 든다.

0개의 댓글