240518_TIL

J Lee·2024년 5월 18일

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 코드카타 120번
이름의 첫글자만 대문자, 나머지는 소문자로 바꾸는 문제.

SELECT user_id,
       Concat(Upper(LEFT(name, 1)), Lower(Substr(name, 2))) AS name
FROM   users
ORDER  BY 1 
  1. left로 제일 앞의 1글자 추출 + upper
  2. substr로 2번째 이후부터의 글자 추출 + lower
  3. concat으로 합치면 끝.

알고리즘 코드카타 44번

갈수록 문제도 참 구구절절...

명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.

아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.

가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.

모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.

처음에는 가장 큰 숫자를 무조건 커버해야 하므로 가장 큰 숫자를 먼저 찾고 그 뒤에 남은 한 변의 길이를 구해야겠다고 생각했는데, 그렇게 되니 알고리즘으로 구현하기가 너무 어려워졌다.

가로, 세로 어떤 방향으로든 돌릴 수 있다는 점을 생각해서 무조건 큰 길이가 먼저 나오도록 sizes를 새로 정의했다. 이렇게 되면 돌리네 마네 생각할 필요가 없어진다.

def solution(sizes):
    x = []
    for a,b in sizes:
        if b>a:
            a,b = b,a
        x.append([a,b])
    print(x)


이제 가로길이 중 가장 큰 수를 커버해야 하므로 가로는 80이 되고, 세로길이 중 가장 큰 수를 커버해야 하므로 세로는 50이 된다. [a,b] 조합 중 가장 큰 a와 b를 찾으면 되는 셈.

def solution(sizes):
    x = []
    for a,b in sizes:
        if b>a:
            a,b = b,a
        x.append([a,b])
    w = max(i[0] for i in x)
    h = max(i[1] for i in x)
    answer = w*h
    return answer

가로, 세로를 돌리는 방향으로 계속 생각했으면 아마도 기어이 못 풀었을 것 같다. 이럴 때는 그냥 하나의 기준을 잡아서 모든 값들을 다 고정시켜 놓은 다음에 생각하는 것이 속편할 듯.

이제 팀프로젝트 데이터 좀 파봐야지..ㅎㅎ

profile
기본기를 소홀히 하지 말자

0개의 댓글