본문 바로가기

TIL

[240328] 파이썬: 코드카타 49 & SQL: 코드카타 167

[파이썬 코드카타]

두 개 뽑아서 더하기

https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

*참고 intertools 라이브러리 설명 및 활용 문제 풀이 및 https://datananalysis.tistory.com/112

 

1) 어떤 문제가 있었나

정수 배열 number에서 서로 다른 인덱스의 2개 수를 뽑은 뒤 더해서 만들 수 있는 모든 수를 오름차순 배열로 담아 반환

 

numbers = [2,1,3,4,1]

result = [2,3,4,5,6,7]

 

2) 내가 시도해본 건 무엇인가

지난 문제풀이에서 활용했던 itertools 라이브러리 활용 

 

3) 어떻게 해결했나

def solution(numbers):
    import itertools as it
    
    iter_list = list(it.combinations(numbers, 2))
    answer = []
    
    for i in iter_list:
        if sum(i) not in answer:
            answer.append(sum(i))
    answer.sort()
    return answer

 

4) 무엇을 새롭게 알았나

- (복습) 삼총사 문제에서 경우의 수를 내는데 활용한 itertools 라이브러리 재학습 (중복은 자기 원소를 포함하는지 여부)

└ permutation: 순서는 고려하지만 중복 없는 것 

└ combination: 순서도 중복 없는 것 

└ product(permutation with repetition): 순서랑 중복 모두 있고, repeat 파라미터 적용 필요

└ combinatnion_with_replacement: 순서는 없으나 중복 허용

- 라이브러리 없이 경우의 수 만드는 법 with double for문과 set

└ for 문을 2번 사용해서 각각의 원소가 다 한 번씩 만날 수 있도록 함 

└ set(): 집합 함수

   : set으로 묶으면 중복 값을 없애주고, { } 로 형태로 변환되면서 정렬처리 됨.

   : 단, set처리한 후 list로 또 묶으면 정렬 순서가 달라질 수 있으니 체크 후 sorted()를 같이 써야 할 수도 있음 

# 다른 사람 풀이 참조
numbers = [2,1,3,4,1]
answer = []

for i in range(len(numbers)):
    for j in range(i+1, len(numbers)):
        print(i, j) 
        # (0, 1~4), (1, 2~4), (2, 3~4), (3, 4)
        answer.append(numbers[i] + numbers[j])
sorted(list(set(answer)))

print(answer)  # 경우의 수 합계값 모두 리스트화
# [3, 5, 6, 3, 4, 5, 2, 7, 4, 5] 

print(set(answer))  # 집합하여 중복 제거 
# {2, 3, 4, 5, 6, 7}

print(list(set(answer))) # 다시 리스트로
# [2, 3, 4, 5, 6, 7]

print(sorted(list(set(answer)))) # 마지막 정렬
# [2, 3, 4, 5, 6, 7]

[SQL 코드카타]

 

1) 어떤 문제가 있었나

Average Population of Each Continent

https://www.hackerrank.com/challenges/average-population-of-each-continent/problem?isFullScreen=true

 

2) 내가 시도해본 건 무엇인가

대륙이 NULL인 값을 where 에서 제외하고, 평균 인구수도 round 0으로 처리하였으나 오답 처리

> rounded down to nearest integer 가 내림이라는 의미인 것 같아 내림 처리할 수 있는 함수 서치 

 

3) 어떻게 해결했나

select COUNTRY.Continent, FLOOR(avg(CITY.Population)) 
 from CITY 
 join COUNTRY on CITY.CountryCode = COUNTRY.Code
 where COUNTRY.Continent is not null
  group by COUNTRY.Continent;

 

4) 무엇을 새롭게 알았나

- CEILING(값) : 소수점 자리를 정수로 절상, 올림 처리하는 함수. 영단어로 천장, 최고치 등의 뜻 

- FLOOR(값) : 소수점 자리를 정수로 절삭, 내림 처리하는 함수. 영단어로  바닥, 최저치 등의 뜻