주노 님의 블로그

20240708 사전캠프 6일차 TIL 본문

TIL

20240708 사전캠프 6일차 TIL

juno0432 2024. 7. 8. 22:37

 

사전캠프 6일차 내용 간단요약

  • 14:00 ~ 14:30지난 주말 공부 정리
    SQL 3주차 - SQL문법
     웹 개발 종합반 3주차 - fetch를 이용한 api 데이터 처리
  • 14:30 ~ 15:00 : 지난주 TIL 복습
  • 15:00 ~ 16:00 : 알고리즘 공부 (19 ~ 23)
    20 : 정수 내림차순으로 정렬
    21 : 재귀함수에 대해 (재귀함수란? 재귀함수가 비효율적인가? )
  • 16:00 ~ 16:30 TIL 정리
  • 16:30 ~ 17:30 : 데일리 정리
    2주차 목요일 : Lv2.스파르타 자판기
    3주차 월요일 : SQL연습문제 1번
  • 17:30 ~ 18:30 : 강의
     웹 개발 종합반 4주차 - 파이어베이스 파이어스토어 활용

지난 주말 공부 정리 (SQL 3주차) - sql문법

더보기
  • Replace(컬럼, 현재 값, 바꿀 값)
    컬럼의 문자열을 바꾼다. 

  • substring(조회할 컬럼, 시작위치, 글자 수) == substr (조회할 컬럼, 시작위치, 글자 수)
    컬럼에서 시작위치~글자수 만큼만 출력한다.

  • concat(붙이고 싶은값1, 붙이고 싶은값 2, 붙이고 싶은값 3)
    여러 칼럼의 값을 하나로 붙이거나, 칼럼에 특정 문자를 붙이고 싶을때

  • if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
    분기를 적용해, 조건에 따라 값을 바꿀 수 있음
  • case when 조건1 tehn 값(수식)1 ~ end as 컬럼명
    조건 1에 부합한다면 값(수식)1로 데이터를 바꿈

  • DATA TYPE관련 오류(MYSQL외 오류)
    MYSQL외 다른 SQL문법에서는 DATA TYPE가 다를때 연산이 되지 않을 수 있음
    • RATING은 문자임, AVG함수를 쓸 수 없다

      1. 문자를 숫자로
      CAST(IF(rating='Not given', '1', rating) AS DECIMAL)
      rating을 decimal로 바꿔준다.

      2. 숫자를 문자로
      CONCAT(restaurant_name, '-', CAST(order_id AS CHAR))
      order_id를 char형으로 바꿔준다

지난 주말 공부 정리 (웹 개발 종합반 3주차) - fetch를 이용한 api 데이터 처리

더보기
  • 추억 저장하기 버튼을 누르면 postingbox가 사라지고 보여지게 하는 기능 구현
    제이쿼리의 .toggle을 이용한다
    <script>
      function openclose(){
        $('#postingbox').toggle();
      }
    </script>
       <div class="mytitle">
      <h1>나만의 추억앨범</h1>
      <button onclick="openclose()">추억 저장하기</button>
    </div>

    <div class="mypostingbox" id="postingbox">

$('#postingbox')를 통해 posting박스를 지시하고, 토글함수를 적용한다


    • 값들을 넣은다음 기록하기 버튼을 누르면, 앨범에 추가가 되는 기능 구현
      특정한 값의 내용(밸류값)을 가져오는 방법 .val()이용
            function makeCard(){
              let image = $('#image').val();
              let title = $('#title').val();
              let content = $('#content').val();
              let date = $('#date').val();
      
              let temp_html = `        
              <div class="col">
                <div class="card h-100">
                  <img
                    src="${image}"
                    class="card-img-top"
                    alt="..."
                  />
                  <div class="card-body">
                    <h5 class="card-title">${title}</h5>
                    <p class="card-text">${content}</p>
                  </div>
                  <div class="card-footer">
                    <small class="text-body-secondary">${date}</small>
                  </div>
                </div>
              </div>`;
              $('#card').append(temp_html);
            }
            //생략//
            <button onclick=makeCard() type="button" class="btn btn-dark">기록하기</button>


    • 클라이언트 - 서버 개념
      서버는 클라이언트에게 데이터를 제공할 때 키-값 쌍 형식의 JSON으로 제공해준다.
      예를 들어, {"MSRSTE_NM":"중구","PM10":4.0,"PM25":2.0}와 같이 키:값 형식으로 제공하는 것을 볼 수 있다.

      클라이언트는 서버에게 API를 요청한다. 주요 HTTP 메서드로는 다음과 같은 것들이 있다:
      GET : 조회 요청
      POST : 생성, 변경, 삭제 요청

      예를 들어, 다음과 같은 URL이 있을 때:
      https://movie.daum.net/moviedb/main?movieId=68593
      위 링크에서 **GET 방식**에서는 URL의 ? 이후의 내용이 쿼리 문자열로, 서버에 대한 GET 요청의 일부로 볼 수 있다. 여기서 ? 옆을 보면 `movieId=68593`이 있다. 이는 서버에게 `movieId=68593`인 영화를 요청하는 것이다.

    • fetch()
      자바스크립트에서 내장된 함수로 네트워크로 요청을 보내고 그 결과를 받아오는 역할
      RealtimeCityAir > row에 미세먼지 데이터가 들어있다.

      fetch("http://spartacodingclub.shop/sparta_api/seoulair")
      	.then(res => res.json()) 
      	.then(data => { 
      		console.log(data['RealtimeCityAir']['row'][0]);
      	})


      네트워크에 url(미세먼지데이터)의 첫번째 값을 받아온다.


    • fetch() 반복문
      foreach문을 사용해 반복한다.
      fetch("http://spartacodingclub.shop/sparta_api/seoulair").then(res => res.json()).then(data => { 
      		let rows = data['RealtimeCityAir']['row']
      		rows.forEach((a) => {
      			console.log(a['MSRSTE_NM'], a['IDEX_MVL'])
      		})
      	})



    • fetch() 활용
      미세먼지가 40초과일경우 폰트색을 빨간색으로 적용하고 싶다면?
      태그에 클래스를 부여하고 분기문을 작성한다.
          <style>
              div.question-box {
                  margin: 10px 0 20px 0;
              }
              .bad {
                  color: red;
              }
          </style>
      
          <script>
      			function q1() {
              fetch("http://spartacodingclub.shop/sparta_api/seoulair").then((response) => response.json()).then((data) => {
                  $('#names-q1').empty()
      						let rows = data['RealtimeCityAir']['row']
                  rows.forEach((a) => {
                      let gu_name = a['MSRSTE_NM']
      								let gu_mise = a['IDEX_MVL']
      								let temp_html = ``
      								if (gu_mise > 40) {
      									temp_html = `<li class="bad">${gu_name} : ${gu_mise}</li>`
      								} else {
      									temp_html = `<li>${gu_name} : ${gu_mise}</li>`
      								}
                      $('#names-q1').append(temp_html)
                  });
                })
            }
          </script>


    • fetch()를 이용해 일부 텍스트만 바꾸고 싶다면?
      span태그를 이용한다.
      <ul class="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
      		<li><a href="#" class="nav-link px-2 text-danger">spartaflix</a></li>
      		<li><a href="#" class="nav-link px-2 text-white">홈</a></li>
      		<li><a href="#" class="nav-link px-2 text-white">시리즈</a></li>
      		<li><a href="#" class="nav-link px-2 text-white">영화</a></li>
      		<li><a href="#" class="nav-link px-2 text-white">내가 찜한 콘텐츠</a></li>
      		<li><a href="#" class="nav-link px-2 text-white">현재기온: <span id="msg"></span>도</a></li>
      </ul>


      $(document).ready(function () {
          let url = "http://spartacodingclub.shop/sparta_api/weather/seoul";
          fetch(url).then(res => res.json()).then(data => {
              let temp = data['temp'];
              $('#msg').text(temp);
          })
      })

알고리즘 공부

20번 문제 - 정수 내림차순으로 배치하기

더보기

정수 내림차순으로 배치하기

import java.util.Arrays;
import java.util.*;
import java.lang.*;

// 20번째 06월 15일 정수 내림차순으로 배치하기 : 함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
public class cote20 {
    public static void main(String[] args) {
        Solution sol = new Solution();
        Scanner sc = new Scanner(System.in);
        int num1 = sc.nextInt();
        long result = sol.solution(num1);

        System.out.println(result);
    }
}

class Solution {
    public long solution(long n) {
        long answer = 0;
        String str = Long.toString(n);
        char [] num = str.toCharArray();
        Arrays.sort(num);
        StringBuilder sb = new StringBuilder(new String(num));
        sb.reverse();
        answer = Long.parseLong(sb.toString());
        return answer;
    }
}

long > string > char > sb > long 으로 변환하였다.
되게 복잡하게 변환했지만 딱히 생각나는게 이거밖에 없었음...

배열에 하나하나 넣는 방법도 생각나긴 했다
예를들어 배열에 값을 하나하나 집어넣고 sort한다음
result = result *10 + 배열[i];

시간복잡도는 비슷해서 패스

여기서 사용한 함수
.toString() : string형으로 타입변환 해준다
.toCharArray() : 문자 배열로 변환한다
Arrays.sort() : 배열을 오름차순으로 정렬한다

StringBuilder : 문자열을 수정할 수 있는 객체 제공 주요 메서드는 아래와 같음
.append(str) : 문자열을 이어 붙임
.reverse() : 문자열을 뒤집음
Long.parseLong() == Integer.parseInt() : 문자열을 타입변환해줌
.toString() : StringBuilder 객체를 String형으로 변환해줌
  ㄴ 참고 : StringBuilder객체는 String이 아니기때문에 String을 쓰려면 변환이 필요함

 

21번 문제 - 재귀함수란?

더보기

재귀함수
재귀함수란 : 조건이 만족할때 까지 자신의 로직을 반복한다.

import java.util.Scanner;

// 22번째 06월 18일 두 정수 사이의 합 :두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
public class cote23 {
    public static void main(String[] args) {
        Solution sol = new Solution();
        Scanner sc = new Scanner(System.in);
        int num1 = sc.nextInt();
        long result = sol.solution(num1);
        System.out.println(result);
    }
}
class Solution {
    public int solution(int num) {
        int answer = 0;
        answer = collatz(num,0);
        return answer;
    }
    private int collatz(long num, int count)
    {
        if(num==1){
            return count;
        }
        else if(count>=500)
        {
            return -1;
        }
        else if(num%2 == 0)
        {
            return collatz(num/2,count+1);
        }
        else {
            return collatz((num*3)+1,count+1);
        }
    }
}


재귀함수란 위의 코드를 보면 num==1이거나 count가 500이 넘어갈때까지 반복하는 코드이다
else if (num%2==0)에서보면 return값으로 collatz(num/2,count+1)을 주어 collatz함수 안에 또 다른 collatz함수로 들어가는것을 볼 수 있다 이렇게 연산하며 자동으로  num==1이거나 count가 500이되면 빠져나오는 식이다.

재귀함수의 예 - 피보나치 수열
피보나치 수열이란? 처음 두항을 1로 한 후, 그 다음 항 부터는 바로앞의 두 항을 더하는 수열이다..
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2) (n ≥ 2)
위 공식임

public class FibonacciRecursive {
    public static void main(String[] args) {
        int n = 10; // 예시로 10번째 피보나치 수를 구합니다.
        System.out.println(fibonacci(n)); // 출력: 55
    }

    public static int fibonacci(int n) {
        if (n <= 1) {
            return n;
        }
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

재귀를 이용한 피보나치 수열 계산
특징 : 코드가 간결하고 직관적임, F(5)를 계산하려면 F(4)와 F(3)을 계산해야 하고, F(4)를 계산하려면 다시 F(3)과 F(2)를 계산해야 하는 식으로 중복 계산이 많이 발생함.
시간복잡도 : O(2^n)

public class FibonacciIterative {
    public static void main(String[] args) {
        int n = 10; // 예시로 10번째 피보나치 수를 구합니다.
        System.out.println(fibonacci(n)); // 출력: 55
    }

    public static int fibonacci(int n) {
        if (n <= 1) {
            return n;
        }
        int a = 0, b = 1;
        for (int i = 2; i <= n; i++) {
            int next = a + b;
            a = b;
            b = next;
        }
        return b;
    }
}

O(2^n)반복문을 이용한 피보나치 수열 계산
특징 : 중복 계산이 없으며 각 피보나치 수를 한번씩만 계산함.
시간복잡도 : O(n)

재귀함수가 비효율적인 것을 알 수 있다.
문제 20번에서도 재귀함수가 중복을 거친다라고 느낄수 있다.

그럼에도 쓴 이유는?
재귀를 사용하는 알고리즘 문제(동적 프로그래밍 문제 제외)에는 재귀함수가 메서드 스택을 추가적으로 사용하고 메서드 호출에 대한 오버헤드가 발생할 수 있지만, 현대 컴퓨터시스템에는 반복문과 큰 차이가 나지않는다.
코드의 간결성과 문제의 논리를  그대로 작성할수 있어서 사용했다.

그럼 모든 경우에서 재귀가 비효율적인가?
아니다, 하노이탑 같은 경우는 재귀와 반복문의 성능 차이가 크지 않으며, 코드작성부문에서 반복문이 훨씬 비효율적인것을 알 수 있다.

만약 스택오버플로 문제가 발생한다면?

동적 프로그래밍(메모이제이션 등)으로 재귀의 비효율성을 제거한다.
동적 프로그래밍이란? 하위 문제의 결과를 저장하고 재사용함으로, 중복계산을 피하는 방법.


데일리 2주차 목요일 과제 - 스파르타 자판기

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class spartaVendingMachine {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        Map<String, Integer> drinks = new HashMap<>();
        drinks.put("사이다", 1700);
        drinks.put("콜라", 1900);
        drinks.put("식혜", 2500);
        drinks.put("솔의눈", 3000);

        System.out.println("스파르타 자판기 입니다");
        for (Map.Entry<String, Integer> entry : drinks.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue() + "원");
        }

        System.out.print("어떤 상품을 주문하시겠습니까? : ");
        String order = sc.nextLine();

        if (!drinks.containsKey(order)) {
            System.out.println("잘못 입력하셨습니다.");
            return;
        }

        System.out.print("지불할 금액을 입력하세요 : ");
        int money = sc.nextInt();

        int price = drinks.get(order);
        if (money >= price) {
            int remain = money - price;
            System.out.println(order + "를 구매하셨습니다. 남은 잔액 : " + remain + "원 입니다");
        } else {
            System.out.println("금액이 부족합니다");
        }
    }
}

 

데일리 3주차 월요일 - SQL연습문제 1번

더보기

1. sparta_employees 테이블에서 모든 직원의 이름(name)과 직급(position)을 선택하는 쿼리를 작성해주세요.

select name, position
from sparta_employees



2. sparta_employees 테이블에서 중복 없이 모든 직급(position)을 선택하는 쿼리를 작성해주세요.

select distinct(position)
from sparta_employees



3. sparta_employees 테이블에서 연봉(salary)이 40000과 60000 사이인 직원들을 선택하는 쿼리를 작성해주세요.

select name
from sparta_employees
where salary between 40000 and 60000



4. sparta_employees 테이블에서 입사일(hire_date)이 2023년 1월 1일 이전인 모든 직원들을 선택하는 쿼리를 작성해주세요.

select name
from sparta_employees
where hire_date < '2023-01-01'

 

 

 

 


강의(웹 개발 종합반 4주차) - 파이어베이스 파이어스토어 활용

 

더보기

1. 파이어베이스란? 

  • 구글이 개발한 모바일 및 웹 애플리케이션 개발 플랫폼

2. 파이어베이스 시작

3. 파이어스토어란?

  • 구글의 클라우드 기반 NoSQL 데이터베이스이다.
    SQL : 정리된 정보를 주로 다룸
    NoSQL : 복잡하거나 유연한 정보를 다룰 때 사용

4. 파이어베이스를 웹에 적용하기

  •  파이어베이스 세팅 코드
    firebaseConfig : 프로젝트 설정 > 내앱 > 구성
    아래 코드를 넣으려면 <script type="module">로 변경한다
    위로 변경을 하게되면 onclick 이벤트가 작동하지 않게 된다.
    // Firebase SDK 라이브러리 가져오기
    import { initializeApp } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-app.js";
    import { getFirestore } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
    import { collection, addDoc } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
    import { getDocs } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
    
    
    // Firebase 구성 정보 설정
    const firebaseConfig = {
    	본인 설정 내용 채우기 
    };
    
    
    // Firebase 인스턴스 초기화
    const app = initializeApp(firebaseConfig);
    const db = getFirestore(app);


 

  • 데이터 넣기 : addDoc
    온클릭 이벤트도 아래와 같이 변경.
    클래스를 id로 변경해야함.
    $("#id").click(async function () {
        let doc = {};
        await addDoc(collection(db, "콜렉션이름"), doc);
    })

     위와같이 변경하기.



  • $("#postingbtn").click(async function () { let image = $('#image').val(); let title = $('#title').val(); let content = $('#content').val(); let date = $('#date').val(); let doc = { 'image':image, 'title':title, 'content':content, 'date':date }; await addDoc(collection(db, "albums"), doc); })
  • 화면 새로고침
    window.location.reload()

  • 데이터 불러오기 : getDocs
    파이어스토어 데이터에서 불러오는 방법
    let docs = await getDocs(collection(db, "콜렉션이름"));
    docs.forEach((doc) => {
        let row = doc.data();
        console.log(row);
    });

    let docs = await getDocs(collection(db, "albums"));
            docs.forEach((doc) => {
                let row = doc.data();
                let image = row['image']
                let title = row['title']
                let content = row['content']
                let date = row['date']
    
                let temp_html = `            
                <div class="col">
                    <div class="card h-100">
                        <img src="${image}"
                            class="card-img-top" alt="...">
                        <div class="card-body">
                            <h5 class="card-title">${title}</h5>
                            <p class="card-text">${content}</p>
                        </div>
                        <div class="card-footer">
                            <small class="text-body-secondary">${date}</small>
                        </div>
                    </div>
                </div>`;
                $('#card').append(temp_html);
            });


 

 

'TIL' 카테고리의 다른 글

20240710 사전캠프 8일차 TIL  (0) 2024.07.10
20240709 사전캠프 7일차 TIL  (0) 2024.07.09
20240705 사전캠프 5일차 TIL  (1) 2024.07.05
20240704 사전캠프 4일차 TIL  (1) 2024.07.04
20240703 사전캠프 3일차 TIL  (0) 2024.07.03