본문 바로가기

IT To do and To was

22년 11월 18일_엉망인 날은 내 인생에 왜 넣어 SQL문제 및 큰수의 법칙 완벽정리 + 파이썬 놓치고 있는 기초 뇌새김

728x90
반응형

금요일[불금이네요 아름다운 하루입다]

 

1. 백준 中 SQL

2. programmers python 강의 수강

3. 이것이

4. https://github.com/JaeYeopHan/Interview_Question_for_Beginner + 지망회사 틀 잡기

 

GitHub - JaeYeopHan/Interview_Question_for_Beginner: Technical-Interview guidelines written for those who started studying progr

:boy: :girl: Technical-Interview guidelines written for those who started studying programming. I wish you all the best. :space_invader: - GitHub - JaeYeopHan/Interview_Question_for_Beginner: Techn...

github.com

1>

아? 백준엔 SQL문제가 없는 듯하다

프로그래머스 SQL를 풀었다.

 

보호소에서 중성화한 동물

SELECT OUTS.ANIMAL_ID, OUTS.ANIMAL_TYPE, OUTS.NAME FROM ANIMAL_INS INS
JOIN ANIMAL_OUTS OUTS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE INS.SEX_UPON_INTAKE LIKE "%Intact%" AND(OUTS.SEX_UPON_OUTCOME LIKE "%Neutered%"OR
OUTS.SEX_UPON_OUTCOME LIKE "%Spayed%")
ORDER BY OUTS.ANIMAL_ID;

상품을 구매한 회원비율 구하기

SELECT YEAR(SALES_DATE), 
MONTH(SALES_DATE), 
COUNT(DISTINCT(OS.USER_ID)) AS PUCHASED_USERS,
ROUND(
    (COUNT(DISTINCT(OS.USER_ID)))
    /
    (SELECT COUNT(USER_ID) FROM USER_INFO WHERE YEAR(JOINED)=2021), 1)    
FROM ONLINE_SALE AS OS
JOIN (
    SELECT USER_ID
    FROM USER_INFO
    WHERE YEAR(JOINED) = 2021
) AS UI
ON OS.USER_ID = UI.USER_ID
GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE);

칫 결곈가 상품을 구매한 회원 비율 구하기..어렵다

2>

기초를 다지니까 좋다

 

함수의 매개변수의 return값의 인수를 맞춘 후 

 

print 시 

print("값은 {}".format(변수명))

 

n = 12

 ownership = n in list명

print(owership) boolean 형식으로 나옴

 

del list명[인덱스]

list명.remove(값) # 중복된 값이라면 먼저 나온 값 하나만 지워짐

 

for i, name in enumerate(리스트명):

    print('{}번 : {}'.format(i, name))

 

enumerate 는  숫자도 같이 반환해준다

 

--모듈

import math

math.ceil(2.5) 

올림 // 3

math.floor(2.5)

내림 // 2

 

import random

candidates = ['가위','바위','보']

a = random.chioce(candidates) //무작위로 선택

 

import urllib.request

url = input()

response = urllib.request.urlopen(url)

data = response.read()

decode = data.decode('utf-8')

print(decode) // html 문서 갖고옴

 

다른 py문서에 함수를 import 해서 해당 문서에 import 다른 py문서명

사용 시 다른py문서명.함수명 //같은 폴더에 들어있어야 함

 

import datetime

 

now = datetime.datetime.new()

today = datetime.date.today()

 

 

print(list명.pop(인덱스값))

print(dict명.pop(키값))

 

dict에서 for key, value iin ages.items() :  라고 기재하면

print('{} : 키 {} : 밸류'.formate(key, value))

를 사용할 수 있다. 딕셔너리는 순서를 따르지 않아서 같은 for문이여도 값이 다를 수 있다.

 

list, dict 둘 다 이름.clear()를 기입할 경우 값들이 다 비워짐

 

dict명1.update(dict명2)

 

튜플의 packing, unpacking

예시 )

c = 10, 12

a,b = c

print(a) // 10

print(b) // 12가 됨

의 경우 같은 키가 존재할 경우 update의 인자값의 키에 따른 값으로 변경됨

 

for a in dict.items():

    print('{}와 {}'.format(*a))

해도 enumerate 와 같은 결과가 나옴

 

for i in range(len(리스트명))

    print(리스트명[i])

 

continue -> 반복문의 나머지 부분을 보지 않고 반복문의 처음으로 돌아간다.

 

3>

92p

큰 수의 법칙

주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙이다. 단, 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 k번을 초과하여 더해질 수 없는 법칙이 특징이 있다.

 

주어진 배열 중 숫자를 통해 M번을 통해 가장 큰수를 만드는 것이나, 같은 수가 K번 이상 연속으로 더해지면 안된다.

K번 더한 후 두번째로 큰 수를 더한 후 다시 가장 큰 수를 더하면 된다.

하지만, 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른 것으로 간주하여, 다시말해 같은 숫자라고 하더라도 다르게 취급한다.

 

단순한 방법

n,m,k = map(int, input().split()) # n은 배열의 개수이다.
array = list(map(int, input().split()))

array.sort() # 정렬
first = array[n-1] # 가장 큰 수 얻음
second = array[n-2] # 그 다음 큰 수

result = 0

while True:
    for i in range(k): #k 만큼 돌고 while문 덕분에 m이 0이 아닌 이상 second를 거치고 다시 시작
        if m == 0 :
            break # m이 0이면 for문 종료
        result += first
        m -= 1
    if m == 0 :
        break # m이 0이면 while문 종료
    result += second # range(k)가 끝나고 m이 0이 아닐 때 수행
    m -= 1 # 더한 횟수 빼기
    
print(result) #최종

하지만 시간복잡도가 높아서 반복되는 수열에 대해 파악해야한다.

 

가장큰수가 k만큼 반복된 후 두번째 큰수가 하나 더해지는게 m/개수 만큼 반복된다.

즉, 가장큰수가 K만큼 + 두번째 큰수가 하나 = k+1 개가 m /(k+1)이 반복되는 횟수가 되고 

반복되는 횟수에 k를 곱하면 총 큰수가 더해지는 횟수를 알 수 있다.

 

이때 나누어 떨어지지 않는 경우엔 m을 (K+1)로 나눈 나머지 만큼 가장 큰수가 추가로 더해진다.

 

이걸 식으로 정의하면

int(M/ (K+1)) * K + M % (K+1)

n, m, k = map(int, input().split())
data = list(map(int, input().split())
result = 0

data.sort()
first = data[n-1]
second = data[n-2]

# 가장 큰 수가 더해지는 횟수 계산
count = int(m/(k+1)) *k
count += m % (k+1)

result += (count) * first
result += (m-count) * second

print(result)

나는 한번 cycle을 돌리는 책의 내용에 힌트를 얻고

 

cycle을 구한 후 m의 몫만큼 횟수를 반복하고 나머지 만큼 큰 수를 더하면 된다고 연상이 되어 이렇게 코드를 짰다.

n,m,k = map(int, input().split()) # n은 배열의 개수이다.
array = list(map(int, input().split()))

array.sort() # 정렬
first = array[n-1] # 가장 큰 수 얻음
second = array[n-2] # 그 다음 큰 수

cycle = (first * k) + second # 한 사이클을 만들음
a = m//(k+1) # m에 벗어나지 않을 만큼의 더할 횟수를 구함
b = m % (k+1) # 나머지를 구함
d = b * first # 나머지의 값을 구함

result =(a*cycle) + d  # 한 사이클에 따른 값 + 나머지
print(result)

더 직관적이지 않은가? 아닌가..?ㅎㅋㅋ

 

4>

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/commit/44e83d84d50e259c88b598ae5d717491b4dadeb3

 

Update README.md (#171) · JaeYeopHan/Interview_Question_for_Beginner@44e83d8

Co-authored-by: Jbee <ljyhanll@gmail.com>

github.com

이어서 보자 너무나 흥미로운 글이 나열되어있어서 좋다. 시간이 늦어서 다음에 집중하고 숙지하는게 좋을 거같다.

 

꼭 코딩테스트를 보는 곳, 난이도가 쉽든 어렵든 보는 곳

직원이 100명 이상이 되는 곳

본사에서 일을하는 곳

거리가 50분 이내인 곳

경력이 되는 곳

내가 즐거운 곳

 

 

// yesterday wished to today list.

. 지망하는 회사 정하기_✔️

. 병원가기_✔️

. 도서관에서 딴짓하지 않기_✔️

. 이것이보기

. SQL 백준 풀어보기_없어서 프로그래머스 품

. https://school.programmers.co.kr/learn/courses/2/lessons/179 여기부터 다시 시작_✔️

 

tomorrow wish list

. 병원 전화하기

. 도서관에서 딴짓하지 않기

. 프로그래머스 0lv 풀기

. opic 영상 1시간 보기

. https://school.programmers.co.kr/learn/courses/2/lessons/292 여기서 부터 다시 시작

. 이것이 진도 나가기

728x90
반응형