본문 바로가기
내일배움캠프/회고록

7월 16일 화요일

by jhdevtrace 2024. 7. 17.

결론

프로젝트에 넣을 기능을 구현하고 있다.

알고리즘 풀이를 하다가, 런타임 에러를 마주하고, 그에 대한 원인을 확인했다.

오늘 한 일

SQL :

12세 이하인 여자 환자 목록 출력하기

 

알고리즘 :

삼총사

크기가 작은 부분 문자열

 

프로젝트 :

방명록 입력 내용 db에 저장, db에서 방명록 내용 가져오기 기능 구현

 

본문

SQL

12세 이하인 여자 환자 목록 출력하기  코드

SELECT PT_NAME, PT_NO, GEND_CD ,AGE, COALESCE(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;

 

 

COALESCE 함수

COALESCE(TLNO, 'NONE')는 SQL 함수인 COALESCE를 사용한 것입니다. 이 함수는 여러 개의 인자를 받아 첫 번째로 NULL이 아닌 값을 반환합니다. 만약 첫 번째 인자가 NULL이면, 두 번째 인자를 반환합니다. COALESCE 함수는 여러 개의 인자를 받을 수 있으며, 인자들 중에서 첫 번째로 NULL이 아닌 값을 찾아 반환합니다.

예를 들어, COALESCE(TLNO, 'NONE')는 다음과 같이 동작합니다:

TLNO 열의 값이 NULL이면 'NONE'을 반환합니다.
TLNO 열의 값이 NULL이 아니면 그 값을 반환합니다.
따라서 위의 쿼리에서 COALESCE(TLNO, 'NONE') AS "전화번호"는 TLNO 열의 값이 NULL일 경우 'NONE'으로 대체하여 "전화번호"라는 별칭을 가진 새로운 열을 생성하는 것입니다.

 

 

제출 코드

SELECT MCDP_CD, COUNT(*) AS "5월예약건수"
FROM APPOINTMENT
WHERE EXTRACT(YEAR FROM APNT_YMD) = 2022 AND EXTRACT(MONTH FROM APNT_YMD) = 5 
GROUP BY MCDP_CD
ORDER BY "5월예약건수" ASC, MCDP_CD ASC;

 

 

삼총사 코드

class Solution {
    public int solution(int[] number) {
        int answer = 0;
        int count=0;
        
        for(int i=0;i<number.length;i++){
            for(int j=i+1;j<number.length;j++){
                for(int k=j+1;k<number.length;k++){   
                    int sum=number[i]+number[j]+number[k];
                    if(sum==0){
                        count++;
                    }
                }
            }
        }
        
        
        
        return count;
    }
}

크기가 작은 부분 문자열 문제

이 문제를 푸는데, 처음 짠 코드에서 런타임 에러가 발생했다.

나는 반복문 안에 직접 메서드를 넣어놔서, 어떤 메서드를 불러올 때, 시간이 오래 걸리는 것인가 생각했다. 그래서 처음 런타임 에러와 마주했을 때, 반복문 밖으로 빼서 초기화 시켜줄 수 있는 것들은 시도해보았다. 그리고 그와 관련된 질문을 했는데, gpt 답변은 다음과 같다.

결론 : 문자열이 int의 범위를 벗어날 경우 런타임 에러가 발생할 수 있다고 한다.

 

gpt 답변 :

런타임 에러가 발생한 이유는 Integer.parseInt 메서드가 오래 걸리는 것이 아니라, 문자열이 나타내는 수가 int 범위를 초과할 때 발생할 수 있는 NumberFormatException 때문입니다. int 타입은 32비트 정수로, 값의 범위는 -2,147,483,648에서 2,147,483,647 사이입니다. 변환하려는 숫자가 이 범위를 벗어나면 예외가 발생합니다.

Integer.parseInt는 int 범위 내의 숫자를 빠르게 변환할 수 있지만, 범위를 벗어나는 경우 런타임 에러가 발생합니다. 이는 메서드 자체가 느리기 때문이 아니라, 범위 초과로 인한 예외 처리 과정에서 발생하는 문제입니다.

따라서 Long.parseLong을 사용하여 더 큰 숫자를 처리할 수 있도록 하면 런타임 에러를 피할 수 있습니다.

 

 

혼자 만들고 막힌 코드(런타임 에러 발생, 답이 나오긴 함)

class Solution {
    public int solution(String t, String p) {
    
        int answer=0;
        int value=0;
        int pValue = Integer.parseInt(p);
        for(int i=0;i<t.length()-p.length()+1;i++){
            value = Integer.parseInt(t.substring(i,i+p.length()));
            if(value<=pValue){
                answer++;     
            }
        }
        
        return answer;
    }
}

gpt에게 도움받은 코드(제출)

class Solution {
    public int solution(String t, String p) {
        int count = 0;
        int len = p.length();
        long pValue = Long.parseLong(p); // p를 long 타입으로 변환

        // t에서 길이가 len인 부분 문자열을 순회하며 확인
        for (int i = 0; i <= t.length() - len; i++) {
            String substring = t.substring(i, i + len);
            long value = Long.parseLong(substring);
            if (value <= pValue) {
                count++;
            }
        }

        return count;
    }
}

 

 

프로젝트

html, css를 먼저 만들어서 프로젝트를 빨리 진행할까 했는데, 태준님과 논의해본 결과, 그렇게 하면 태준님 분량이 너무 없어지게 되었다. 그래서 어느정도 태준님도 프로젝트에 투입할 정도의 강의를 들으셔서, 내일(수요일)부터는 바로 코드를 작성하기로 결론을 내렸다. 그래서 나는 만들고 있던 html 뼈대는 멈추고, 그냥 주요 기능 먼저 테스트로 만들었다. 아래의 두가지 기능을 변형해서 넣으면 될 것 같다.

 

 

방명록 작성 후, 버튼 눌렀을 때, 데이터베이스에 저장

      // //작성버튼 눌러서 파이어베이스에 값을 저장하기
      // $("#testBtn").click(async function () {
      //   let testV = {
      //     name: "name2",
      //     content: "content2",
      //     time: timestamp,
      //   };
      //   await addDoc(collection(db, "testDB2"), testV);
      //   alert("테스트 버튼 쿠리꾸 ㅇㅅㅇ");
      //   window.location.reload();
      // });

 

 

파이어베이스에서 방명록 이름, 내용, 시간 데이터 가져오기

      // 파이어베이스에 접근, 시간 정렬, 최근 2개만 가져오기
      const testDB2 = await getDocs(
        query(collection(db, "testDB2"), orderBy("time", "desc"), limit(2))
      );
      testDB2.forEach((doc) => {
        const data = doc.data();

        // 타임스템프 시간을 사람 눈에 보기 편하게 바꾸는 기능(yy-mm-dd hh:mm:ss)
        let day = data.time.toDate();

        let year = day.getFullYear();
        let month = ("0" + (day.getMonth() + 1)).slice(-2);
        let days = ("0" + day.getDate()).slice(-2);
        let hours = ("0" + day.getHours()).slice(-2);
        let minutes = ("0" + day.getMinutes()).slice(-2);
        let seconds = ("0" + day.getSeconds()).slice(-2);

        let timetime =
          year +
          "-" +
          month +
          "-" +
          days +
          " " +
          hours +
          ":" +
          minutes +
          ":" +
          seconds;

        console.log("testDB2 데이터 == ", data); //////////////////////////////////////////////////////////////////////
        console.log("time == ", timetime);
      });

'내일배움캠프 > 회고록' 카테고리의 다른 글

7월 30일 화요일  (0) 2024.07.30
7월 17일 수요일  (2) 2024.07.18
7월 15일 월요일 개강  (5) 2024.07.15
7월 4일 목요일  (0) 2024.07.08
7월 3일 수요일  (0) 2024.07.04