[코딩 공부] 4일차(2/16)

성철민·2023년 2월 16일
0

배움

목록 보기
4/42

Schedule1. 스파르타코딩클럽

내일배움캠프 5기 합류 전 기본적인 강의를 들어야 한다고 한다.

강의: [왕초보] 비개발자를 위한, 웹개발 종합반

웹개발을 위한 기본적인 강의 (HTML, CSS, JavaScript)

진도

  • JavaScript, jQuery, Fetch 공부하기
  • Java와 JavaScript 사이에 관계 없음
  • <script> 태그를 이용해서 JavaScript 작성 가능
  • <button>호출해서 버튼 클릭 시 함수 호출 가능
  • JavaScript
    1. 변수와 리스트, 딕셔너리 등의 자료형
    2. 딕셔너리: key와 value로 이루어져 있음
  • JQuery
    1. JQuery는 <div id=""> 이런 식으로 지칭해줌
    1. <script> 내 함수 등에서 $(#id) 로 id 호출가능
    2. $('#id').text(텍스트) : id의 텍스트를 JQuery의 텍스트로 하라
    3. $('#id').css('color', 'red') : id의 텍스트 컬러를 red로 하라
  • 반복문: 리스트 내의 모든 값을 하나씩 꺼내올 수 있다 (.forEach)
리스트.forEach((변수) => {
	console.log(변수)
    })
  • 조건문 : if ~ else
  • JavaScript
    1. 백틱(`)을 쓰면 백틱 안에 변수를 넣을 수 있다.
    let temp_html = `<p>${a}</p>`
  • JQuery
    1. id.append() : 괄호 안의 값을 붙여줌
    1. id.empty() : id 안의 값을 비워줌
  • JSON ( JavaScript Object Notation )
    1. 데이터를 저장하거나 전송할 때 많이 사용하는 경량 DATA 교환 방식
    1. 단순히 데이터를 표시하는 표현 방법
    2. 일반적으로 서버와 클라이언트 간의 교류에서 많이 사용

감상
웹사이트에서 HTML, CSS, Javascript, JQuery를 함께 사용할 수 있었다. 아직 기초 부분이라 쉽지만 익숙해지도록 해야겠다.


강의: [왕초보] 엑셀보다 쉬운, SQL

웹개발을 위한 기본적인 강의 (SQL)

진도

  • LEFT JOIN : NULL값이 생성될 가능성이 있음. 왼쪽 테이블을 기준으로 오른쪽 테이블에 없는 값을 찾아낼 때 사용
  • UNION ALL : 위와 아래의 테이블을 전부 합칠 수 있음 ( order는 깨짐 )
  • Subquery
    1. WHERE에 들어가는 경우
    1. SELECT에 들어가는 경우
      • 메인 쿼리문이 돌아갈 때마다 서브쿼리문이 호출된다
    2. FROM에 들어가는 경우(***)
      • 서브쿼리문 속에서 데이터를 뽑아올 수 있다.
  • With : 서브쿼리문을 메인쿼리문에 전부 적는 대신 쿼리문 맨 위에 임시 table로 저장할 수 있다.
WITH table1 as (
	select course_id, count(distinct(user_id)) as cnt_checkins from checkins
	group by course_id
	), table2 as (
	select course_id, count(*) as cnt_total from orders
	group by course_id 
)
select c.title,
a.cnt_checkins,
b.cnt_total,
(a.cnt_checkins/b.cnt_total) as ratio
from
table1 a
inner join
table2 b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id

감상
이제 쿼리문이 점점 복잡해져서 한 눈에 볼 수 있도록 정리하고 구동 순서도 잘 기억해야겠다. 마서브쿼리문이 나오면서 많이 복잡하다.


Schedule2. BAEKJOON

파이썬 문제 풀어보기

단계별로 풀어보기('8단계. 기본수학 2' 도전중)


9020번. 골드바흐의 추측

개요: 2보다 큰 짝수 n이 주어졌을 때, 두 소수의 합이 n이 되는 두 소수를 출력

초기 접근:
1. 에라스토테네스의 체로 입력받은 n만큼의 소수를 구한다
2. 이 소수를 작은 수부터 반복시켜 두 소수를 구한다

시간 초과

def sieve(n):
    prime_number = [True] * (n + 1)
    prime_number[0] = prime_number[1] = False
    for i in range(2, int(n ** 0.5) + 1):
        if prime_number[i]:
            for j in range(i * i, n + 1, i):
                prime_number[j] = False
    collecting = [x for x in range(len(prime_number)) if prime_number[x]]
    return collecting



T = int(input())

for repeat in range(T):
    N = int(input())
    prime_number_list = sieve(N)
    max_value = 0
    for climb_up in prime_number_list:
        if climb_up > N // 2:
            break
        if (N - climb_up) in prime_number_list and (N - 2 * climb_up >= 0):
            max_value = max(max_value, climb_up)
    
    print(max_value, N - max_value)
  • 정답은 나왔지만 시간 초과가 되었다.
  • 각 케이스마다 소수를 구하는 탓에 시간복잡도가 증가한 것으로 보인다.
  • 소수 리스트를 한번 저장해두고 그 다음 케이스의 n이 더 크다면 추가로 소수를 리스트에 추가하는 방식으로 해야할 것 같다.

정답

def sieve(n):
    prime_number = [True] * (n + 1)
    prime_number[0] = prime_number[1] = False
    for i in range(2, int(n ** 0.5) + 1):
        if prime_number[i]:
            for j in range(i * i, n + 1, i):
                prime_number[j] = False
    collecting = [x for x in range(len(prime_number)) if prime_number[x]]
    return collecting

T = int(input())
prime_number_list = sieve(10000)

for repeat in range(T):
    N = int(input())
    max_value = 0
    for t in range(N // 2, 0, -1):
        if t in prime_number_list and (N - t) in prime_number_list:
            print(t, N - t)
            break
  • 어떻게 해도 시간 초과가 되어서 아예 문제 조건대로 소수를 n = 10000까지 한번에 구하고 계속 사용하는 방식을 썼다.
  • 그랬는데도 시간 초과가 되어서 차이가 가장 적은 값을 탐색할 때 N // 2부터 -1씩 내려가는 방법을 취했더니 맞았다.

ChatGPT 코드


profile
developer

0개의 댓글