본문 바로가기

항해99

[항해99] 프로그래머스 알고리즘 연습하기 (2)

이번에는 챌린지 문제 중 어려웠던 문제를 다시 리뷰해보려고 한다.

28문제 중 4문제 밖에 풀지 못했는데, 생각보다 어려웠던 것 같다.

 

※ K번째 수 정렬

- 풀었으나 어려움

 

작성 코드

public static void main(String[] args) {
        int[] array = {1, 5, 2, 6, 3, 7, 4};
        int[][] commands = {{2, 5, 3}, {4, 4, 1}, {1, 7, 3}};
        int s = 2;
        int j = 5;
        int k = 3;
        System.out.println(Arrays.toString(solution(array, commands))); }

    public static int[] solution(int[] array, int[][] commands) {
        // 배열 자르기 / 정렬 / n번째 수 구하기

        int[] a = new int[commands.length];
        for (int i = 0; i < commands.length; i++) {
            int x = commands[i][0];
            int y = commands[i][1];
            int z = commands[i][2];
            int[] arr = new int[y - x];
            int[] array1 = Arrays.copyOfRange(array, x - 1, y);
            Arrays.sort(array1);

            a[i] = array1[z - 1];
        }
        return a;
    }

}

 

코드 리뷰 

1. x는 잘라낼 시작 위치, y는 끝 위치, z는 찾을 숫자의 위치

2. int[] array1 = Arrays.copyOfRange(array, x - 1, y); : 배열에서 지정된 범위에 해당하는 부분을 복사해서 array1에 저장 (인덱스는 0부터 시작하니까 x에서 1을 뺴줘야함)

3. Arrays.sort로 배열을 새로 정렬해줌

4. 정렬된 배열에서 찾을 숫자의 위치에 해당하는 값을 배열 a에 저장

 

※ 가장 가까운 같은 글자

 

작성 코드

    public static void main(String[] args) {
        String s = "banana";
        //char[] a = s.toCharArray();
        int[] answer = new int[s.length()];
        // ArrayList<Integer> z = new ArrayList<Integer>();
        for (int i = 0; i < s.length(); i++) {
            for (int j = i; j >= 0; j--) {
                if (s.charAt(i) == s.charAt(j) && answer[i] == 0) {
                    answer[i] = i - j;
                }
            }
            if (answer[i] == 0) {
                answer[i] = -1;
            }
        }

        //System.out.println(answer);
        System.out.println(Arrays.toString(answer));
    }
}

 

이 코드는 두 번째 반복문과 조건문을 어떻게 해야 할 지 잘 떠오르지 않아서 어려웠던 것 같다.

 

코드 리뷰

1. 결과값을 저장할 배열을 초기화 해줌 (각 문자까지의 거리를 저장함)

2. 첫 번째 for문 : 문자열을 돌면서 문자까지의 거리를 계산

3. 두 번째 for문

  • 현재 문자 인덱스 i 부터 문자열 시작 부분(인덱스 0)까지 역방향으로 반복
  • 루프 내에 현재 인덱스는 인덱스 j 에 있는 문자와 동일하며 현재 문자의 거리가 아직 계산되지 않는 경우
  • 조건이 충족되면 i와(현재문자) 동일한 문자가 가장 가까운 이전 문자(j)사이 거리를 계산 (j는 뒤로 이동 하니까 i-j)