Coding History

국비 지원 IT(웹앱개발) 취업반 강의 8일차

BlackBirdIT 2024. 6. 17. 17:50

오랜만의 수업이라 아침에 깨어나기 힘들었다. 여행 때문에 블로그 작성, 공부를 하지 못한 3일동안을 빼면 그래도 꾸준히 했던 탓에 적응은 되게 빨리 되는 것 같다. 수업의 시작은 여태껏 블로그 작성이나 깃 허브를 잘 업로드하고 있었는지 강사님의 확인부터 시작했다. 나는 여행 간 3일은 빼면 꾸준히 문제풀이와 유튜브 시청한 내용을 정리해서 올렸기 때문에 무난히 통과 했다(3일은 왜 안올렸냐고 물으셔서 여행다녀왔다고 말씀드렸다..) 난 항상 맨 앞자리에 앉기 때문에 뒤의 동료들의 상황은 잘 모르지만 강사님이 나오셔서 왜 이렇게 많이들 안했냐고 하셨다. 난 다들 나보다 훨씬 더 빡세게 할거라고 생각했었는데 그게 아니여서 의아하기도 했고 열심히 했다고 하기도 힘든 수준이지만 그래도 조금 뿌듯하기도 했다. 서론이 길었다.
오늘 배운 것은 일단 여태껏 배운 것을 상기 시키기 위함인지 코드를 써 주시곤 코드 해석을 주석처리해서 써보라고 하셨다. 다 아는 코드라고 생각했는데 막상 글로 정리하려니 약간 버벅거리긴 했지만 주석처리해서 잘 썼다.

import java.awt.*;
import java.util.Arrays;

class Main {
    public static void main(String[] args) {
        // greet 매서드 호출
        String msg = greet("Jin"); //name 값 입력
        System.out.println(msg); // msg 출력

        // createPoint 매서드 호출
        Point point = createPoint(5, 10); // createPoint x에 5 y에 10
        System.out.println("Point create at(" + point.x + ", " + point.y + ")"); // point 값 출력

        // firstNEvenNumbers 메서드 호출
        int[] evens = firstNEvenNumbers(5); // 배열 5개 입력
        System.out.println("first 5 even numbers : " + Arrays.toString(evens)); // 배열 5개 출력
    }
    // greet 메서드 생성
    public static String greet(String name) {
        return "Hello, " + name + "!"; // 인삿말과 이름 리턴
    }
    // createPoint 메서드 생성
    public static Point createPoint(int x, int y) {
        return new Point(x, y); // 포인트 값 리턴
    }
    // firstNEvenNumbers 메서드 생성
    public static int[] firstNEvenNumbers(int n) {
        int[] evenNumbers = new int[n]; // 배열 생성

        for (int i = 0, num = 2; i < n; i++, num += 2) {
            evenNumbers[i] = num; // 입력 된 수만큼 짝수 값 배열에 저장 (입력값이 5니까 다섯번 저장)
        }
        return evenNumbers; // 저장 된 배열 짝수 값 리턴
    }
}
// 출력 :
//hello, Jin!
//Point create at(5, 10)
//first 5 even numbers : [2, 4, 6, 8, 10]

나는 이렇게 썻고 강사님이 해석해주신 것은 매개변수나 문자열, 인스턴스까지 나올 정도로 상세하게 해석하셨다. 나중엔 그림을 그리셔서 그대로 가져오지는 못할 것 같다. 근데 난 이정도로 해석하면 충분하지 않나 싶다. 코드가 어떻게 작동되고 어디서 값을 가져오고 어떻게 출력되는지 알면 된거 아닌가.

그리고 감 찾기를 위해서 소수찾기 문제만 그 이후로 수업 마칠 때 까지 풀었다.

처음엔 값을 입력했을 때 소수인가 아닌가를 판별하는 코드를 작성했다.

public static boolean isPrimeNumbers(int m) {
        if (m == 1){
            return false;
        }
        for (int i = 2; i < m; i++) {
            if (m % i == 0) {
                return false;
            }
        }
        return true;
    }
}

이거까지는 쉽게 했었는데 이후에 문제가 어려웠다.
값을 입력하면 특정 값 까지 소수가 몇개가 있는지 출력해주는 코드를 작성하는데 어려움을 겪었다.

난 계속 하다가 안돼서 강사님의 풀이를 보고 했는데, 위의 코드를 활용하는 방식으로 강사님은 코드를 보여주셨다.
나도 저 코드를 활용하려고 했는데 강사님 처럼 활용하는게 아니고 메서드 하나 안에 다 집어넣으려고 했었다. 일단 강사님이 풀어주신 코드는

class Main2 {
    public static void main(String[] args) {
        int rs = one_to_n_Prime_Numbers_count(10);
        System.out.println("rs : " + rs);
        // rs : 4
        rs = one_to_n_Prime_Numbers_count(13);
        System.out.println("rs : " + rs);
        // rs : 6
        rs = one_to_n_Prime_Numbers_count(100);
        System.out.println("rs : " + rs);
        // rs : 25
    }

    private static int one_to_n_Prime_Numbers_count(int m) {
        int count = 0;
        for (int i = 1; i <= m; i++) {
            if (isPrimeNumbers(i)) {
                count++;
            }
        }
        return count;
    }
    public static boolean isPrimeNumbers(int m) {
        if (m == 1){
            return false;
        }
        for (int i = 2; i < m; i++) {
            if (m % i == 0) {
                return false;
            }
        }
        return true;
    }
}

이렇게 메서드를 그대로 두고 쓰셨다. 그래서 프로그래머스에 이 코드를 제출 했는데 효율성검사에서 통과하지 못해서 나는 배열을 활용해서 풀었다.

class Main {
    public static void main(String[] args) {
        int rs = one_to_n_Prime_Numbers_count(10);
        System.out.println("rs : " + rs);
        // rs : 4
        rs = one_to_n_Prime_Numbers_count(13);
        System.out.println("rs : " + rs);
        // rs : 6
        rs = one_to_n_Prime_Numbers_count(100);
        System.out.println("rs : " + rs);
        // rs : 25
    }

    private static int one_to_n_Prime_Numbers_count(int m) {
        int count = 0;
        boolean[] isPrime = new boolean[m + 1];
        for (int i = 2; i <= m; i++) {
            isPrime[i] = true;
        }
        for (int i = 2; i * i <= m; i++) {
            if (isPrime[i]) {
                for (int j = i * i; j <= m; j += i) {
                    isPrime[j] = false;
                }
            }
        }
        for (int i = 2; i <= m; i++) {
            if (isPrime[i]) {
                count++;
            }
        }

        return count;
    }
}

알고리즘 문제는 볼 때 마다 머리가 한 번씩 깨지면서 푸는 것 같다.

그러고 제곱근관련 문제를 주시고 취업 관련 얘기후 수업은 끝났다. 이거 포스팅 하고 바로 다음 포스팅에 제곱근 문제 풀이 해야겠다.

아직 못풀었다..