Sparta/CODEKATA

[250903] 스파르타코딩 본캠프 22일차

junecho 2025. 9. 3. 17:26

💥  CODEKATA                                                                                                           

~ 85문제

 

오늘의 코드카타 후기

 

 

 

 

85) 어제보다 높은 온도의 날짜 구하기

# 내코드 버전1
# 테스트케이스 통과, 본서버테스트 실패
WITH weathertwo AS (
    SELECT ROW_NUMBER() OVER(ORDER BY recordDate) AS id, recordDate, temperature
    FROM weather
    WHERE recordDate != "2015-01-01"
)
SELECT (a.id+1) as id
FROM (
    SELECT 
        w.id, (t.temperature - w.temperature) as cnt
    FROM weather w JOIN weathertwo t ON w.id = t.id
) a
WHERE a.cnt > 0

답은 맞는데 틀렸다고 함 ㅠ

  1. 일단 어제보다 높은 온도인데 2015-01-01보다 어제는 없으니까 이 행은 지우고 비교해야 해서 가상테이블을 만듦.
  2. 어차피 날짜별로 있으니까 날짜순대로 ROW_NUMBER() 로 순위를 매기고 id를 처음부터 다시 부여함. (join을 위해)
  3. 원본 테이블과 가상 테이블을 id로 조인시킴.
  4. 같은 id끼리 조인했지만 첫번째 행을 제외시켰기 때문에 01-01과 01-02 가 같은 id 상에 있음
  5. 같은 id끼리 온도를 뺌
  6. 온도가 0보다 큰 것을 where로 조건을 걸음
  7. id를 선택하는 것이 답인데, 원본 id를 선택하면 어제 날짜로 선택되므로 +1을 함

이렇게 구하면 안되나…?

궁금해서 ㅁㅈ튜터님께 여쭈어봄 (와 처음으로 튜터님한테 질문했다! 👏👏)

스윗하신 ㅁㅈ튜터님....S2

내 로직은 ROW_NUMBER()로 날짜순대로 인위적인 id를 다시 부여했는데, 이는 recordDate가 연속되고 ID도 정렬된다고 보장하지 않는 이상, 채점 서버에 있는 다양한 케이스에서는 실패할 가능성이 높음.

어제 라는 개념은 진짜 날짜 차이를 의미하는 것이므로 날짜를 직접 비교하는 방식 DATEDIFF 사용하는 것이 좋다고 하심.

DATEDIFF 를 사용해서 풀어보고 싶었는데, DATEDIFF(day, start_date, end_date) 는 스타트와 엔드 데이트의 일수 계산을 해주는 건데 이걸로 어떻게 푸는거지 . . ..??ㅠㅠ

 

# 내코드 버전2
# 테스트케이스 통과, 본서버테스트 통과 
WITH today AS (
    SELECT t.id, t.today, IF(t.temp IS NULL, w.temperature, w.temperature) as today_temp
    FROM weather w LEFT JOIN (
        SELECT id, DATE_ADD(recordDate, INTERVAL 1 DAY) as today, NULL AS temp
        FROM weather
    ) t ON w.recordDate = t.today
    WHERE t.id IS NOT NULL
),
temphi AS (
    SELECT t.id, t.today, t.today_temp, (t.today_temp - w.temperature) AS temp
    FROM weather w JOIN today t ON w.id = t.id
    WHERE (t.today_temp - w.temperature) > 0
)

SELECT w.id
FROM weather w LEFT JOIN temphi h ON w.recordDate = h.today
WHERE h.id IS NOT NULL

ㅋㅋ ㅠㅠ

원래 짰던 로직으로밖에 생각이 안남…. 원본 테이블에서 맨 처음 일수만 빼고, 그 다음 날을 가상테이블화 시켜서 join하고 온도 계산하는 것밖엔. . . .

그래서 일단 코드 버전2 는 통과하긴 함

가상테이블 2개 썼다는게 문제인데….ㅎ; 런타임 보니까 코드 개선해야 되는 건 맞는 것 같음

가상테이블을 본문절 프롬에다가 박아도 결과는 비슷했다

 

 

# 해설 답지
SELECT w1.id
FROM weather w1 JOIN weather w2 ON DATEDIFF(w1.recordDate, w2.recordDate) = 1
WHERE w1.temperature > w2.temperature

ㅋㅋ아니 도랏네

단 3줄인데 난 대체 몇 줄이나 늘여쓴거야;;;;

아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏjoin 할 때 무조건 같은 컬럼되는거 말고 datediff를 저기다가 쓸 수도 있구나 . . . ..

지피티 왈

  1. w1 테이블의 recordDate가 w2 테이블의 recordDate보다 정확히 1일 뒤인 행들을 조인합니다.
  2. 즉, w1은 오늘 날짜의 날씨 정보로, w2는 어제 날짜의 날씨 정보로 간주하여 두 행을 연결하는 것입니다.

 

 


파이썬 숙제 기억나는 문제들

 

 

53번 - 좀 어려웠던 문제

# 숙제 - 53
# 문자열 "abcd abcd babo'에서 각 문자에 개수를 딕셔너리에 저장 후 출력
# 출력 시 -> {'a': 3, 'b': 4, 'c': 2, 'd': 2, ' ': 2, 'o': 1}
# mystr = "abcd abcd babo"
# mydic = {}

for i in mystr:
    cnt = mystr.count(i)
    print(cnt, i)
    mydic[i] = cnt
print(mydic)

 

 

8번 - 1시간 이상 고민한 문제

# 숙제8 (어려움 모르면 패스)
# 피보나치 수열에서 14개만 출력
# a, b = 1, 1
# for문
# 출력

a, b = 1, 1
mylist = [a, b]
for i in range(0,10):
    mylist.append(mylist[i] + mylist[i+1])

print(mylist)

8번 피보나치 수열 드디어 풀었다 ….

로직은 알겠는데 어떻게 설계해야 되는지 이중 for문 써보고 요리조리 다 바꿔보고 난리 부르스를 침

'''

i0 + i1 = i2

i1 + i2 = i3

i2 + i3 = i4

'''

이런 로직이고 대체 어떻게 구현할까 하다가 for문 작성해둔거 다 지우고 다시 처음부터 해봄

mylist.append(mylist[0] + mylist[1])

mylist.append(mylist[1] + mylist[2])

....

 

하드코딩으로 로직 짜보면서 하다가 깨달음을 얻다 …..

역시 하드코딩이 최고시다

ㅎ ㅑ for문 한줄 띡이면 끝날 코드였는데 구현을 왜 이렇게 힘들게 생각했지??? 다시 생각해봐도 미스테리함

 

 

 

 


 

파이썬 숙제 다 풀다가 쉬운건 패스하고 풀고 싶은 것만 풀었음

 

▶  파이썬 숙제 ~58번

더보기
############################################################################################################
###튜플
# 숙제 - 33
# a = 11
# b = 22
# 위의 변수를 선언 후 a의 값을 22, b의 값을 11로 교환
# a, b = 11, 22
# a, b = b, a
# print(a,b)


# 숙제 - 34
# 값 3, 6, 9를 a, b, c 변수들에게 각각 할당해라
# a, b, c = 3, 6, 9
# print(a,b,c)


# 숙제 - 35
# (44, 33, 22, 11)의 튜플을 리스트로 변환 후 출력
# t = (44, 33, 22, 11)
# mylist = list(t)
# print(mylist)


# 숙제 - 36
# 리스트 [11, 22, 33, 44]에 11의 값을 110으로 변경
# 튜플 (11, 22, 33, 44)에 11의 값을 110 변경 시도
# mylist = [11, 22, 33, 44]
# mytuple = (11, 22, 33, 44)
# mylist[0] = 110
# print(mylist)
'''
# mytuple[0] = 110
# print(mytuple)
# TypeError: 'tuple' object does not support item assignment
'''

# 숙제 - 37
# 리스트 [44, 33, 22, 11]을 튜플로 변환하고, 55를 추가 시도해보아라.
# 안 된다면 그 이유는?
# 튜플은 요소를 수정할 수 없음
# mylist = [44, 33, 22, 11]
# mytuple = tuple(mylist)
# myint = 55
# mytuple2 = mytuple + (myint,)
# print(mytuple2)


# 숙제 - 38
# 리스트 튜플 차이점은?
# 함수 호출 시 인자를 전달 할 때 함수에서 데이터를 수정하고 싶지 않을 때, 어떤 자료형을 쓰면 되나요?
# 리스트 : 수정 가능. 튜플 : 수정 불가능하므로 튜플을 사용하면 됨


# 숙제 - 39
# 리스트, 튜플 중 메모리를 적게 쓰는 것은 무엇이고 그 이유는?
# 튜플이 고정된 자료형이니까 가변성인 리스트보다 메모리를 적게쓰지 않을까.??



############################################################################################################
################# 딕셔너리
# 숙제 - 40
# 빈 딕셔너리에 키: name, 값, 본인 이름을 추가하고 출력
# mydic = {}
# mydic["name"] = "최송아"
# print(mydic)


# 숙제 - 41
# {'name': 'won', 'age': 1000} 에서 키 age의 값을 출력
# dic = {'name': 'won', 'age': 1000}
# print(dic["age"])


# 숙제 - 42
# {'apple': 111, 'banana': 222, 'cherry': 333} 에서 모든 키 출력
# dic = {'apple': 111, 'banana': 222, 'cherry': 333}
# print(dic.keys())


# 숙제 - 43
# {'apple': 111, 'banana': 222, 'cherry': 'babo'} 에서 모든 값 출력
# dic2 = {'apple': 111, 'banana': 222, 'cherry': 'babo'}
# print(dic2.values())


# 숙제 - 44
# {'apple': 111, 'banana': 222, 'cherry': 'babo'} 에서 값이 babo가 있다면 babo 출력
# dic = {'apple': 111, 'banana': 222, 'cherry': 'babo'}
# for i in dic.values():
#     if i == "babo":
#         print(i)


# 숙제 - 45
# {'apple': 111, 'banana': 222, 'cherry': 'babo'} 에서 apple 삭제 후 출력
# dic = {'apple': 111, 'banana': 222, 'cherry': 'babo'}
# del dic["apple"]
# print(dic)


# 숙제 - 46
# {'apple': 111, 'banana': 222, 'cherry': 'babo'} 에서 banana의 값을 babooo로 수정
# dic = {'apple': 111, 'banana': 222, 'cherry': 'babo'}
# dic.update({"banana" : "babooo"})
# print(dic)


# 숙제 - 47
# {'a': 1, 'b': 2}와 {'c': 3, 'd': 4}를 합치시오,
# a = {'a': 1, 'b': 2}
# b = {'c': 3, 'd': 4}
# a.update(b)
# print(a)
######## print(a+b) dict 끼리 못합치네


# 숙제 - 48
# {'apple': 111, 'banana': 222, 'cherry': 'babo'}에서 모든 키와 모든 값을 순회하여 출력
# dic = {'apple': 111, 'banana': 222, 'cherry': 'babo'}
#
# for i, j in dic.items():
#     print(f"{i} => {j}")


# 숙제 - 49
# {'apple': 111, 'banana': 222, 'cherry': 'babo'} 키 'cherry'의 '값'을 출력 하시오
# 없을 경우 None이라고 출력
# dic = {'apple': 111, 'banana': 222, 'cherry': 'babo'}
# print(dic["cherry"])



# 숙제 - 50
# {'apple': 111, 'banana': 222, 'cherry': 'babo'} 의 길이 출력
# dic = {'apple': 111, 'banana': 222, 'cherry': 'babo'}
# print(len(dic))



# 숙제 - 51
# {'apple': 111, 'banana': '222', 'cherry': True} 값의 자료형 출력
# dic = {'apple': 111, 'banana': '222', 'cherry': True}
# print(type(dic))



# 숙제 - 52
# {'apple': 111, 'banana': '222', 'cherry': 333} 에 값을 합산하라
# hint 형변환
# dic = {'apple': 111, 'banana': '222', 'cherry': 333}
# total = 0
#
# for i in dic.values():
#     total += int(i)
# print(total)


# 숙제 - 53
# 문자열 "abcd abcd babo'에서 각 문자에 개수를 딕셔너리에 저장 후 출력
# 출력 시 -> {'a': 3, 'b': 4, 'c': 2, 'd': 2, ' ': 2, 'o': 1}
# mystr = "abcd abcd babo"
# mydic = {}
# 
# for i in mystr:
#     cnt = mystr.count(i)
#     print(cnt, i)
#     mydic[i] = cnt
# print(mydic)



# 숙제 - 54
# {'apple': 111, 'banana': 222, 'cherry': 'babo'}에서 키와 값을 각각 리스트로 변환 후 출력
# dic = {'apple': 111, 'banana': 222, 'cherry': 'babo'}
# mykey = []
# myvalue = []
#
# for i, j in dic.items():
#     mykey.append(i)
#     myvalue.append(j)
# print(mykey)
# print(myvalue)


# 숙제 - 55
# {'apple': 111, 'banana': 222, 'cherry': 'babo'} 에서 값 babo에 해당하는 키를 출력
# dic = {'apple': 111, 'banana': 222, 'cherry': 'babo'}
#
# for i, j in dic.items():
#     if j == "babo":
#         print(i)


# 숙제 - 56
# 중첩 딕셔너리를 만드시오



# 숙제 - 57
# 딕셔너리와 리스트의 차이점에 대해
# 메모리



# 숙제 - 58
# 딕셔너리에 get 메소드 사용 용도와 사용하는 이유에 대해

▶  파이썬 숙제 70~92번 (푸는중)

더보기
############################################################################################################
################# 함수
# 숙제 - 70
# hi 함수를 호출 시 hi 출력
# def hi():
#     hihi = "hi"
#     return hihi
# print(hi())


# 숙제 - 71
# hi 함수 호출 사 hi "여러분들의 이름"
# def hi():
#     name = input("이름을 입력하세요 >>> ")
#     welcome = f"hi {name}"
#     return welcome
# print(hi())


# 숙제 - 72
# 사용자가 입력한 두 개의 숫자를 받아 더해주는 함수 만드세요
# while True:
#     try:
#         x, y = map(int, input("두 개의 숫자를 입력하세요 (띄어쓰기로 구별) >>> ").split())
#         break
#     except:
#         print("정확히 입력하세요.")
#
# def plus(x:int, y:int):
#     sum = x + y
#     return sum
#
# print(plus(x, y))



# 숙제 - 73
# 1000개 이상의 숫자를 받아 더해주는 함수 만드세요
# 음 여러개 인자 받으려면 *args 써야되는구나 검색함
# def verymany(*args):
#     total = 0
#     for i in args:
#         total += i
#     return total
#
# print(verymany(1,2,3,54,2,3,2,31,23,12,3,213,424325,345534,534534435,33,33))



 # 숙제 - 74
 # 리스트를 받은 뒤 그 길이를 반환하는 함수를 만드세요
# def leng(mylist):
#     cnt = len(mylist)
#     return cnt
#
# print(leng([1,2,3,5,6,3,3,24,242,2]))


# 숙제 - 75
# 세개의 숫자를 비교하여 큰 숫자를 반환하는 함수
# 예시)
# 입력 -> func(50, 44444, 9)
# 출력 -> 44444
# def maxnum(x,y,z):
#     what = max(x,y,z)
#     return what
#
# print(maxnum(50, 444, 9))




# 숙제 - 76
# 20세 이상이면 True, 미만이면 False로 반환하는 함수
# while True:
#     try:
#         def age(user):
#             if user >= 20:
#                 return True
#             else:
#                 return False
#
#         userage = int(input("나이를 입력하세요 >>> "))
#         print(age(userage))
#         break
#     except:
#         print("숫자를 입력하세요.")


# 숙제 - 77
# 문자열의 첫 문자가 대문자인지 확인하는 함수
# def checked(mystr):
#     change_str = mystr.capitalize()
#     if mystr[0] == change_str[0]:
#         return "첫 문자 대문자 O"
#     else:
#         return "첫 문자 대문자 X"
#
# print(checked("Title is FALSE"))



# 숙제 - 78
# 문자열에서 모음의 개수를 세어 반환하는 함수
# def cnt(mystr):
#     aeiou = ["a", "e", "i", "o", "u"]
#     cntlist = []
#     for i in mystr:
#         if i in aeiou:
#            cntlist.append(i)
# 
#     return len(cntlist)
# print(cnt("aa ee oo"))



# 숙제 - 79
# 숫자 리스트에서 짝수만 합을 계산하는 함수



# 숙제 - 80
# 리스트와 특정 값을 받아 그 리스트에 그 값이 포함되어 있는지 확인하는 함수



# 숙제 - 81
# 두 개의 문자열을 받아 공통으로 포함된 문자를 반환하는 함수를 만드세요



# 숙제 - 82
# 문자열을 받아 문자를 반대로 반환하는 함수를 만드세요



# 숙제 - 83
# 삼각형의 밑변과 높이를 입력 받아 삼감형의 넓이를 계산하는 함수 만드세요



# 숙제 - 84
# 리스트를 받아 중복된 요소가 있는지 확인하는 함수



# 숙제 - 85
# 두개의 리스트를 받아 공통 요소만 반환하는 함수



# 숙제 - 86
# 문자열에서 숫자만 추출하는 함수



# 숙제 - 87
# 리스트(숫자)에서 최대값과 최솟값의 차이를 계산하는 함수






############################################################################################################
################# 재귀함수
# 숙제 - 88
# i hate u(그냥 써봄)
# 정수를 받아 그 정수의 팩토리얼을 계산하는 재귀함수



# 숙제 - 89
# 1부터 n까지의 합을 계산하는 재귀함수



# 숙제 - 90
# 숫자 리스트를 받아 재귀적으로 요소의 합을 계산하는 함수



# 숙제 - 91
# 숫자 리스트를 받아 재귀적으로 최대 값을 찾는 함수



# 숙제 - 92
# 숫자를 입력 받아 재귀적으로 정렬하는 함수

 

 


 

아티클 1

더보기

 💡 오늘의 아티클 (주제)


주제 : 개발 블로그는 어떻게 써야할까?

  • 요약
    • 개발 블로그를 단순 개인 공부 노트처럼 쓰는 것이 아닌 개인의 기술 역량을 어필할 수 있도록 운영하자
  • 주요 포인트
    • 블로그 운영의 목적 명확화 : 단순히 남들이 하니까 하는 것이 아니라, 어떤 목적으로 블로그를 운영하는지 명확한 의도와 근거를 갖자
    • “공부”보다 “활용” 강조 : 특정 개념을 단순히 학습한 내용을 나열하기보다, 그 개념을 프로젝트에 어떻게 적용하여 어떤 개선을 이루었는지 공유하자
    • 개념 설명의 깊이 : 일반적인 개념 소개를 넘어, 해당 개념의 내부 메커니즘, 장단점 등을 깊이 있게 파고들어 설명함으로써 '아무나 쓸 수 없는' 차별화된 글을 작성하자
  • 핵심 개념
    • 기술력 어필 ****: 블로그를 통해 자신이 보유한 기술적 지식과 문제 해결 능력 어필
    • 공유의 공간 : 블로그의 목적이 단순히 개인 기록에 머무는 것이 아니라, 타인에게 유용한 정보를 제공하는 공유 목적으로 글을 쓰는 공간
  • 개인 인사이트
    여태 이 글에서 개선해야 할 “개인 공부 노트”처럼 글쓰기를 그대로 하고 있어서 약간 충격먹었다. 블로그 이름 자체도 recording study log 공부 기록용이다 ㅎ../오직 정보 공유만을 위한 블로그를 운영할 실력은 아니니 배운 것을 활용한 예시를 넣음으로써 개선을 해봐야겠다
  • 정보성 글이야 검색하면 훨씬 양질의 글들이 많아서 오히려 차별화 된 공부기록용 블로그를 하자라고 생각한 것이었는데 썩 좋은 생각이 아니었나보다

 

 아티클 2

더보기

💡 오늘의 아티클 (주제)


주제 : 데이터 분석가가 갖춰야 할 9가지 역량

  • 요약
    • 데이터 분석가가 갖춰야 할 9가지 핵심 역량 - 하드 스킬과 소프트 스킬
  • 주요 포인트
    • 하드 스킬 : SQL, 파이썬과 같은 사용 언어, 통계학 지식, 도메인 및 비즈니스 이해, 다양한 툴 활용 능력, 그리고 업무 자동화 및 데이터 엔지니어링 역량을 강조
    • 소프트 스킬 : 커뮤니케이션, 협업 태도, 문제 정의 및 문제 해결 능력, 보고서 작성 능력을 꼽으며, 특히 실무에서 소프트 스킬의 중요성이 크다
    • 지속적인 역량 개발 : IT 기술의 가속화에 따라 최신 트렌드를 파악하고, 채용 공고 등을 통해 요구되는 역량을 준비하자
  • 핵심 개념
    • 데이터 드리븐 문화 (Data-driven culture) : 데이터에 기반하여 의사결정을 내리는 조직 문화
  • 개인 인사이트
    회사를 다니면서 일 잘하는 사람보다 커뮤니케이션과 협업 태도가 좋은 사람이 훨씬 낫다는 것을 뼈져리게 느꼈기 때문에 소프트 스킬이 매우 중요하다는 이 글에 깊은 공감을 한다.특히 요즘같은 AI가 사람보다 일 잘하는 시대에 중요한 것은 일 잘하는 것이 아닌, 사람만이 할 수 있는 소프트 스킬의 역량을 키우는 것이 훨씬 좋을 것이라고 생각한다.
  • 특히 데이터 드리븐 문화를 조성해야 하면서, 다른 직군들과 협업할 일이 많고, 의사결정자들을 설득하는 일을 하는 데이터 분석가는 “커뮤니케이션 및 협업 태도” 가 정말 중요하다.