[코딩 공부] 3일차(2/15)

성철민·2023년 2월 15일
0

배움

목록 보기
3/42

Schedule1. 스파르타코딩클럽

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

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

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

진도(1-13, 1-14. )

  • 부트스트랩: 다른 개발자들이 미리 만들어 놓은 꾸미기 파일을 이용해서 웹페이지를 만들 수 있다.
  • div안의 오브젝트들을 가운데 정렬할 때 아래 4줄 코드를 쓰면 된다.
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
  • 어둡게 하기
 background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('https://movie-phinf.pstatic.net/20210715_95/1626338192428gTnJl_JPEG/movie_image.jpg');
  • .mytitle > button : mytitle이라는 class안의 button에 스타일 적용
  • .mytitle > button:hover : mytitle이라는 class안의 button에 마우스를 올렸을 때 스타일 적용
  • background-color: transparent : 배경색 투명 지정
  • border: 1px solid white : 테두리 두께, 형태, 색깔 지정 가능
  • getbootstrap.com 사이트에서 다른 개발자들이 만들어 놓은 파일들을 사용할 수 있음

감상
간단한 웹사이트 메인을 만들고 그걸 github에 올려서 배포할 수 있었다


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

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

진도

  • 앞서 배운 절, 구문들을 이용해서 여러가지 데이터들을 출력해보기
  • JOIN : LEFT JOIN, INNER JOIN, OUTER JOIN 등이 있다
  • 두가지 테이블을 JOIN해 데이터를 뽑아내기
  • 테이블 as '별명'으로 짧게 테이블을 지칭할 수 있다
    예)
SELECT c1.title, c2.week, count(*) FROM courses c1
INNER JOIN checkins c2 on c1.course_id = c2.course_id
INNER JOIN orders o on c2.user_id = o.user_id
WHERE o.created_at >= '2020-08-01'
GROUP BY c1.title, c2.week
ORDER BY c1.title, c2.week

감상
JOIN의 기준이 되는 칼럼을 바로 찾아볼 수 있도록 하고 각 테이블에 어떤 정보가 있는지 눈에 익도록 해야 추후 실무에서 바로바로 필요한 데이터들을 뽑아낼 수 있을 것 같다.


Schedule2. BAEKJOON

파이썬 문제 풀어보기

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


2581번. 소수

개요: 전 문제와 다르게 입력값 M, N을 받고 그 범위 내의 소수의 합과 최솟값을 구하는 문제

초기 접근: 지난 번에 소수를 구할 때 배웠던 제곱근 방식을 적용하고 범위는 리스트로 구현해주면 될 것이라 생각했다.

정답

M = int(input())
N = int(input())

num_candidate = [x for x in range(M, N + 1)]  # 입력받은 M, N 범위의 자연수를 리스트로 저장
if 1 in num_candidate:  # 리스트 내에 1이 있다면 0으로 치환
    num_candidate[num_candidate.index(1)] = 0

for i in range(len(num_candidate)):  # 후보 리스트를 처음부터 돌면서 소수 판별
    for j in range(2, int(num_candidate[i] ** 0.5) + 1):  # 2부터 후보의 제곱근까지 수로 나눴을 때 나머지가 0일 경우 소수가 아닌 것으로 판별
        if num_candidate[i] % j == 0:
            num_candidate[i] = 0
            break

check_list = [x for x in num_candidate if x != 0] # 소수를 구한 리스트 중에서 0이 아닌 값을 추출
if check_list == []: # 전부 소수가 아니라 check_list가 비었다면 -1을 리턴
    print(-1)
else:
    print(sum(num_candidate))
    print(min(check_list))
  • 전체적인 코드를 적는 건 쉬웠지만 생각치 못했던 반례 때문에 두번 틀렸다.
  • 반례는 1로 범위 내에 1이 포함되어 있다면 1까지 소수로 포함되는 것이었다.
  • 그래서 리스트 중에 1이 포함되어 있다면 1을 0으로 치환해 소수 리스트에서 제거해주는 if문으로 반례를 해결했다.
  • 위 코드의 시간 복잡도는 O((N)*sqrt(N)) 즉 N^3/2이다.

ChatGPT 코드

import math

# 소수 판별 함수
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

# 입력 받기
m, n = map(int, input().split())

# 소수의 합과 최솟값 구하기
sum_of_primes = 0
min_prime = None
for i in range(m, n + 1):
    if is_prime(i):
        sum_of_primes += i
        if min_prime is None:
            min_prime = i
        elif i < min_prime:
            min_prime = i

# 결과 출력
if min_prime is None:
    print(-1)
else:
    print(sum_of_primes)
    print(min_prime)
  • 챗GPT의 코드는 에라스토테네스의 체 알고리즘을 사용해 답을 구했다.

11653번. 소인수분해

개요: 정수 N이 주어지면 N을 소인수분해하는 문제

초기 접근:
1. N의 소수 중 N의 절반까지 구해서 리스트에 저장
2. 소수 중 작은 수부터 반복문을 돌려서 N이 나눠지는 수 찾고 소인수분해 리스트에 저장
3. 남은 수를 다시 소수 중 작은 수부터 반복문을 돌려서 저장
4. 그렇게 해서 남은 수가 소수가 되면 남은 수를 리스트에 저장하고 종료
5. 리스트를 오름차순 sorting하고 한줄에 하나씩 출력

시간초과

N = int(input())

prime_number_candidate = [x for x in range(2, N + 1)]  # 입력받은 M, N 범위의 자연수를 리스트로 저장

for i in range(len(prime_number_candidate) // 2 + 1):  # 후보 리스트를 처음부터 절반까지 돌면서 소수 판별
    for j in range(2, int(prime_number_candidate[i] ** 0.5) + 1):  # 2부터 후보의 제곱근까지 수로 나눴을 때 나머지가 0일 경우 소수가 아닌 것으로 판별
        if prime_number_candidate[i] % j == 0:
            prime_number_candidate[i] = 0
            break

prime_number = [x for x in prime_number_candidate if x != 0] # 소수를 구한 리스트 중에서 0이 아닌 값을 추출

flag = True  # 이중 반복문을 탈출하기 위한 플래그 설치
while flag:  # flag가 True일 경우 계속 반복
    for k in prime_number:  # while문이 True일 동안 소수 리스트를 처음부터 반복
        if N // k == 1 and N % k == 0:  # 남은 N을 소수로 나눴을 때  몫이 1이 되고 나머지가 0이 되면 더 이상 나눌 수 없다고 판단 flag = False 호출
            print(k)
            flag = False
        elif N // k >= 2 and N % k == 0:  # 몫이 2 이상이며 나머지가 0일 경우 k를 출력하고 N을 k로 나눈 몫을 N에 다시 저장하고 for문 빠져나옴
            print(k)
            N = N / k
            break
  • 터미널에서는 잘 작동했지만 시간초과가 발생했다.

ChatGPT 코드

N = int(input())

factor = 2
while N != 1:
    if N % factor == 0:  # factor가 N을 나누면 나머지가 0일 경우, 즉 factor가 N의 약수일 경우
        print(factor)
        N //= factor  # N을 factor로 나눈 몫으로 갱신
    else:
        factor += 1  # N을 나눌 수 없을 경우 factor를 1 증가시킴
  • 나누는 수 factor 변수를 2로 두고 while문으로 N이 1이 될 때까지 나눈다
  • factor로 나눌 수 없을 경우 factor를 1 증가시켜 계속한다.
  • 마지막으로 factor로 N을 나누었을 때 1이 되었다면 while문을 빠져나온다.

1929번. 소수 구하기

개요: 범위의 소수를 작은 순서대로 한줄에 하나씩 출력하는 문제

초기 접근: 범위를 바로 for문에 집어넣어 걸러가면서 하나씩 출력하는 방법

정답

M, N = map(int, input().split())

for candidates in range(M, N + 1):
    if candidates < 2:
        continue
    
    flag = 0
    for i in range(2, int(candidates ** 0.5) + 1):
        if candidates % i == 0:
            flag = 1
            break
    
    if flag == 0:
        print(candidates)
  • 정답을 도출했으나 응답시간이 조금 오래 걸렸다
  • 기존 소수를 구하는 방식대로 하되 flag를 만들어서 for문을 다 돌고도 flag == 0일 경우 소수로 판단하고 출력하는 방식으로 했다.
profile
developer

0개의 댓글