'5월 7일' 열여섯 번째 기록 [TIL]

가은·2024년 5월 7일
0

I Learned [본 캠프]

목록 보기
24/135
post-thumbnail

👩‍🏫 오늘의 출석

❓열여섯 번째, 9 to 9을 해 본 소감❓

갑자기 뜬금없이 github 프로필을 꾸미는 것에 꽂혀서,, 하루 온 종일 정신이 이쪽에 팔려있었다. 이런 꾸미기 기능은 너무 재밌지만, 너무 할 수 있는 게 많아서 시간이 많이 든다. 거기다 github는 뭔가 더 익숙하지 않아서 적용하는 데 오래 걸리고 확인하려면 커밋을 하고 리드미 파일에서 나와야 확인을 할 수 있어서 오늘만 커밋을 100번 넘게 했다..

📑오늘 학습한 내용

🧩오늘의 알고리즘 : x만큼 간격이 있는 n개의 숫자 🧩

/*1차 시도*/
class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        
        answer[0] = x;
        for(int i = 1; i < n; i++) {
            answer[i] = x * (x+i);
        }
        return answer;
    }
}

/*2차 시도*/
class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];  
        answer [0] = x;
        
        for(int i = 1; i < n; i++) {
            answer[i] = x * (i+1);
        }
        return answer;
    }
}

위의 코드는 'x'의 음수 값을 제대로 처리하지 못한다는 문제가 있음. x가 음수이면 배열 요소가 증가하는 대신 감소하도록 코드를 수정해야 함.

/*3차 시도, 성공!*/
class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];  
        answer [0] = x;
        
        for(int i = 1; i < n; i++) {
            answer[i] = answer[i - 1] + x;
        }
        return answer;
    }
}

루프의 경우 x * (i + 1)을 직접 계산하는 대신 답변[i] = 답[i - 1] + x를 계산. 이렇게 하면 'x' 부호에 따라 증가하거나 감소하여 배열 요소가 올바르게 계산되어 'x'의 양수 값과 음수 값 모두에 대해 올바른 출력을 생성할 수 있음.

🧩 오늘의 SQL : 경기도에 위치한 식품창고 목록 출력하기 🧩

문제 : FOOD_WAREHOUSE 테이블에서 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요.

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN, 'N')
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE "경기%"
ORDER BY  WAREHOUSE_ID

💻자바의 정석 내용정리

hashCode()

  • 객체의 해시코드를 반환하는 메서드
  • Object 클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
  • equals()를 오버라이딩하면, hashCode()도 오버라이딩 해야함
    • equals()의 결과가 true인 두 객체의 해시코드가 같아야 하기 때문

equals()와 hashCode()는 오버라이딩 해주지 않으면 물리적으로 메모리에서 같은 값을 갖게 되어 진짜 같은지를 비교.
하지만 참조 변수에 경우 서로 다른 주소를 갖지만, 그 객체들의 내용이 전부 같으면 두 객체는 같다고 간주하여 내용이 같은지를 비교하려면 equals()와 hashCode()를 오버라이딩 해줘야 함.

2번째 심화반 실시간 강의도 들으며 오버로딩, 오버라이딩에 대해 조금 더 자세하게 배우고 다향성에 대해 배웠다.

💞 팀프로젝트

    private static void displayGradeView() {
        // 학생 ID와 과목 ID를 입력 받음.
        System.out.print("학생 ID를 입력하세요: ");
        String studentId = sc.next();
        System.out.print("과목 ID를 입력하세요: ");
        String subjectId = sc.next();

        // 해당 과목과 학생의 모든 회차에 대해 반복.
        System.out.println("학생 " + studentId + "의 과목 " + subjectId + "의 학점:");
        for (int round = 1; ; round++) {
            // 현재 회차의 점수를 찾음.
            Score score = findGrade(subjectId, studentId, round);
            if (score == null) {
                break; // 해당 회차의 점수가 없으면 반복문 종료
            }

            // 학점을 계산하고 출력.
            Grade grade = score.setGrade();
            System.out.println("회차 " + round + ": " + grade);
        }
    }
    private static Score findGrade(String subjectId, String studentId, int round) {
        for (Score score : scoreList) {
            if (score.getSubjectId().equals(subjectId) && score.getStudentId().equals(studentId) && score.getRound() == round) {
                return score; // 해당 과목, 학생, 회차에 해당하는 점수를 찾으면 반환.
            }
        }
        // 해당 과목, 학생, 회차에 해당하는 점수가 없으면 null을 반환.
        System.out.println("해당 과목, 학생, 회차에 해당하는 점수가 없습니다.");
        return null;
    }

선택한 학생의 특정 과목에 회차와 점수를 입력받아 grade로 저장하는 부분이 아직 완성되지 않아 일단은 grade 대신 입력받아 저장된 점수를 출력하는 코드를 작성하는 것으로 변경하였다.

    private static void displayGradeView() {
        // 학생 ID와 과목 ID를 입력 받음.
        System.out.print("학생 ID를 입력하세요: ");
        String studentId = sc.next();
        System.out.print("과목 ID를 입력하세요: ");
    String subjectId = sc.next();

        // 해당 과목과 학생의 모든 회차에 대해 반복.
        System.out.println("학생 " + studentId + "의 과목 " + subjectId + "의 점수:");
        boolean foundScore = false;
        for (int round = 1; ; round++) {
            // 현재 회차의 점수를 찾음.
            Score score = findGrade(subjectId, studentId, round);
            if (score == null) {
                break; // 해당 회차의 점수가 없으면 반복문 종료
            }

            // 현재 회차의 점수 출력
            System.out.println(round +"회차 : " + score.getScore());
            foundScore = true;
        }
        if (!foundScore) {
            System.out.println("해당 학생과 과목의 점수가 없습니다.");
        }
    }

    private static Score findGrade(String subjectId, String studentId, int round) {
        for (Score score : scoreList) {
            if (score.getSubjectId().equals(subjectId) && score.getStudentId().equals(studentId) && score.getRound() == round) {
                return score; // 해당 과목, 학생, 회차에 해당하는 점수를 찾으면 반환.
            }
        }
        // 해당 과목, 학생, 회차에 해당하는 점수가 없으면 null을 반환.
        return null;
    }

드디어 완성된 코드를 받아서 학점으로 조회될 수 있도록 코드를 수정하였다.

private static void displayGradeView() {
        System.out.print("학생 ID를 입력하세요: ");
        String studentId = sc.next();
        System.out.print("과목 ID를 입력하세요: ");
        String subjectId = sc.next();

        System.out.println("학생 " + studentId + "의 과목 " + subjectId + "의 학점:");

        // 모든 회차를 반복하고 학점을 표시
        for (int round = 1; ; round++) {
            Grade grade = findGrade(subjectId, studentId, round);
            if (grade == Grade.N) {
                break; // 해당 회차의 학점이 없으면 중지
            }
            System.out.println(round + "회차 : " + grade);

        }
    }

    private static Grade findGrade(String subjectId, String studentId, int round) {
        for (Score score : scoreList) {
            if (score.getSubjectId().equals(subjectId) && score.getStudentId().equals(studentId) && score.getRound() == round) {
                // 저장된 학점을 가져옴
                return score.getGrade();
            }
        }
        // 해당 회차에 대한 학점이 없을 경우 기본값으로 N을 반환
        return Grade.N;
    }

아래와 같은 출력 결과가 나오도록 작성한 코드! 드디어 제대로 된 결과를 확인 할 수 있어서 너무 좋았다.


0개의 댓글