내일배움캠프 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 : 테두리 두께, 형태, 색깔 지정 가능
감상
간단한 웹사이트 메인을 만들고 그걸 github에 올려서 배포할 수 있었다
웹개발을 위한 기본적인 강의 (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의 기준이 되는 칼럼을 바로 찾아볼 수 있도록 하고 각 테이블에 어떤 정보가 있는지 눈에 익도록 해야 추후 실무에서 바로바로 필요한 데이터들을 뽑아낼 수 있을 것 같다.
파이썬 문제 풀어보기
개요: 전 문제와 다르게 입력값 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이다.
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의 코드는
에라스토테네스의 체 알고리즘
을 사용해 답을 구했다.
개요: 정수 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
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문을 빠져나온다.
개요: 범위의 소수를 작은 순서대로 한줄에 하나씩 출력하는 문제
초기 접근: 범위를 바로 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
일 경우 소수로 판단하고 출력하는 방식으로 했다.