일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- isuppercase()
- StringBuilder
- 최대공약수
- 프로그래머스 레벨1
- 최대공약수와 최소공배수
- 동일성과 동등성
- while과 two-pointer
- 래퍼타입
- 스프링뼈대
- ineer join
- toLowerCase()
- 자바 유클리드
- 스프링환경설정
- Git사용법
- 자바 스트링
- stringbuilder의 reverse()
- 스프링
- git 컨벤션
- replaceAll()
- addDoc
- 자바 최대공약수
- 유클리드호제법
- sql 데이터형 변환
- 자바 최소공배수
- 최소공배수
- 모던자바
- string
- string과 stringbuilder
- 베주계수
- islowercase()
- Today
- Total
주노 님의 블로그
20240708 사전캠프 6일차 TIL 본문
사전캠프 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형으로 바꿔준다
-
RATING은 문자임, AVG함수를 쓸 수 없다
지난 주말 공부 정리 (웹 개발 종합반 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. 파이어베이스 시작
- https://firebase.google.com/?hl=ko > 로그인 > 콘솔로 이동 >프로젝트 만들기
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 (0) | 2024.07.05 |
20240704 사전캠프 4일차 TIL (1) | 2024.07.04 |
20240703 사전캠프 3일차 TIL (0) | 2024.07.03 |