📝 TIL

[TIL] 2주차 알고리즘 테스트

오늘 ONEUL 2022. 11. 24. 12:44

✍ Today I Learned

 

 

알고리즘 테스트

오늘은 대망의 알고리즘 테스트 날이다.
주어진 시간은 4시간, 문제는 총 3문제. 모의고사 때와는 다르게 2문제를 제출해야 하고,
이 중 하나만 맞아도 과락은 면할 수 있다.
저번 모의고사와 마찬가지로 주어진 시간 내에 3문제를 다 푸는 것이 목표!
..였지만 3번 문제는 시험장을 나와 조원들과 함께 풀이를 하였다...😅
다음은 오늘 알고리즘 테스트의 모든 문제와 내가 제출한 코드이다.

 


첫 번째 문제

 

문제를 분석해보자

  • 간단하게 0의 개수로 도개걸윷모를 나눌 수 있다. → 모(0개), 도(1개), 개(2개), 걸(3개), 윷(4개)
  • index에 맞게 배열을 생성하고, 반복문으로 0의 개수를 카운팅 해서 배열에 index로 접근한다.

 

코드로 구현해보자

package algorithm.realexam01;

public class Main {
    // 도개걸윷모에 index로 접근할 수 있게 String형 result 배열을 생성
    // 반복문을 이용해 입력 받은 배열에서 0의 개수를 카운트
    // result 배열에 0의 개수 == index로 접근

    public String solution(int[] arr1) {
        String[] result = {"모", "도", "개", "걸", "윷"};
        int zero_count = 0;
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] == 0) zero_count++;
        }
        return result[zero_count];
    }

    public static void main(String[] args) {
        Main method = new Main();
        int[] arr1 = {0,1,0,0};
        System.out.println(method.solution(arr1));
    }
}

 


 

두 번째 문제

 

문제를 분석해보자

  • 문자열 반복 메소드를 이용하여 주어진 횟수만큼 반복한다. → String.repeat(count)
  • 반복문의 증감식 변수 i를 repeat 메소드의 count로 이용할 것이기 때문에 index는 1부터 시작한다.
  • 공백은 입력받은 숫자에서 i만큼 감소하기 때문에 repeat(star-i)
  • 별은 1, 3, 5, 7 .. 패턴으로 증가하기 때문에 repeat(i+(i-1))

 

코드로 구현해보자

package algorithm.realexam02;

public class Main {
    // 별의 개수를 편하게 세기 위해 index는 1부터 시작하고,
    // 문자열을 반복해주는 repeat 메소드를 이용
    // 공백은 입력 받은 숫자에서 i만큼 감소하기 때문에 repeat(star-i)
    // 별은 1, 3, 5, 7 .. 패턴으로 증가하기 때문에 repeat(i+(i-1))

    public void solution(int star) {
        for (int i = 1; i <= star; i++) {
            System.out.print(" ".repeat(star-i));
            System.out.println("*".repeat(i+(i-1)));
        }
    }

    public static void main(String[] args) {
        Main method = new Main();
        int star = 9;
        method.solution(star);
    }
}

 


 

세 번째 문제

 

문제를 분석해보자

  • 이중 for문을 이용해 상하좌우의 값을 비교하면 ArrayIndexOutOfBoundsException 오류가 뜰 것이다. 경계선에 있는 수는 비교할 값이 없기 때문에 index 범위 오류가 뜨는 것이다.
  • 이를 해결하기 위해 해당 5x5 2차원 배열 테두리에 0을 감싼다. 즉 7x7 2차원 배열로 만들어 테두리를 0으로 채운다.
int[][] arr1 = {{7,4,6,5,9}, {6,1,3,4,5}, {4,8,5,6,9}, {1,3,0,6,4}, {6,4,8,1,7}};

// 이런식으로 변환
// 0 0 0 0 0 0 0
// 0 7 4 6 5 9 0
// 0 6 1 3 4 5 0
// 0 4 8 5 6 9 0
// 0 1 3 0 6 4 0
// 0 6 4 8 1 7 0
// 0 0 0 0 0 0 0
  • int형 배열의 초기값은 0이므로 테두리를 제외한 공간에 입력받은 배열을 채워 넣으면 알아서 테두리는 0이 된다.
  • "*"이 들어가야 하기 때문에 정답을 담을 String형 배열을 생성한다.
  • 이제 if문에 and 조건을 걸어 상하좌우를 비교하고, 비교하고 있는 수가 더 크다면 "*"을, 작다면 현재 값을 넣어준다.
  • 2중 for문을 이용해 정답을 출력한다.
    • 배열 출력하는 꿀팁!
    • 1차원 배열 출력: Arrays.toString(arr)
    • 2차원 배열 출력: Arrays.deepToString(arr)

 

코드로 구현해보자

package algorithm.realexam03;

import java.util.Arrays;

public class Main {
    // 5x5 배열 테두리에 0을 감싸 7x7 배열을 생성
    // 이제 index 범위 오류가 나지 않으므로 조건문 걸어서 비교!
    // 0 0 0 0 0 0 0
    // 0 7 4 6 5 9 0
    // 0 6 1 3 4 5 0
    // 0 4 8 5 6 9 0
    // 0 1 3 0 6 4 0
    // 0 6 4 8 1 7 0
    // 0 0 0 0 0 0 0

    public void solution(int[][] arr1) {
        // 입력 받은 배열 arr
        // 0을 추가해서 만든 배열 zeroArr
        // 정답을 담는 배열 asnwer

        String[][] answer = new String[5][5];
        int[][] zeroArr = new int[7][7];

        // zeroArr 생성
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1.length; j++) {
                zeroArr[i+1][j+1] = arr1[i][j];
            }
        }

        // 상하좌우 값 비교하여 answer 배열에 담기
        for (int i = 1; i < arr1.length+1; i++) {
            for (int j = 1; j < arr1.length+1; j++) {
                if (zeroArr[i][j] > zeroArr[i][j+1] && zeroArr[i][j] > zeroArr[i][j-1] && zeroArr[i][j] > zeroArr[i+1][j] && zeroArr[i][j] > zeroArr[i-1][j]) {
                    answer[i-1][j-1] = "*";
                } else {
                    answer[i-1][j-1] = Integer.toString(zeroArr[i][j]);
                }
            }
        }
        
        // answer 배열 출력
        for (int i = 0; i < answer.length; i++) {
            for (int j = 0; j < answer[i].length; j++) {
                System.out.print(answer[i][j]);
            }
            System.out.println();
        }
    }

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

        method.solution(arr1);
    }
}

 


 

오늘의 나는

3번 다차원 배열 유형의 문제는 끝까지 풀지 못해서 결국 조원분께 도움을 요청해 풀이에 대한 설명을 들었다.
나는 단순하게 접근해서 조건문으로 모든 예외처리를 하려 했는데,
2차원 배열을 0으로 감쌀 생각을 하시다니.. 정말 창의력 대마왕이신 듯.
전체적인 흐름을 눈으로 익힌 뒤 다시 한번 혼자 풀어보니 생각만큼 난해한 문제는 아니었다.
끝까지 스스로의 힘으로 풀어볼 걸 하는 아쉬움도 있다.

알고리즘 주간은 오늘이 마지막이지만,
조원들과 1일 1알고리즘을 약속했다.
프로그래머스 Lv.1 문제들을 익숙해질 만큼 풀어내고 나면
자주 나오는 알고리즘 유형별로 공부해볼 생각이다.

다음 주특기 주차도 잘 해내 보자!