문제

 

코딩테스트 연습 - 중성화 여부 파악하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

오랜만에 푼 SQL,,

SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed' 단어가 들어 있으면 중성화 한 동물로 'O'를 출력, 

중성화 하지 않은 동물은 'X'를 출력하면 되는 문제이다.

실행결과를 아래처럼 나오게 하면 된다.

 

 

풀이

SELECT ANIMAL_ID, NAME, 
    CASE WHEN (SEX_UPON_INTAKE LIKE '%Neutered%' 
            OR SEX_UPON_INTAKE LIKE '%Spayed%') 
            THEN 'O' ELSE 'X' END AS 중성화
 FROM ANIMAL_INS
 ORDER BY ANIMAL_ID

 

SELECT에 CASE 문을 사용하고 컬럼 별칭을 붙여 출력했다.

 

끝!

반응형

오랜만에 그리디 ! 

 

문제

 

1049번: 기타줄

첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주

www.acmicpc.net

 

끊어진 기타줄 N개와 M개의 기타 브랜드들이 주어지고 

각 M개의 기타줄을 6개 패키지로 구매할때와 낱개로 구매할때 1개 가격이 주어진다.

모든 브랜드들을 고려해 가장 저렴하게 구매할 수 있는 가격을 출력하면 된다!

 

처음에 한 브랜드만 선택해야 한다 생각하고 구현했다가 틀리고,

패키지로만 구매하는 경우를 고려하지 않아 또 틀렸다!

 

 

풀이

if __name__ == '__main__':
    N, M = map(int, input().split()) # N=끊어진줄, M=브랜드
    minp = mins = 7000
    ps = N // 6 #패키지
    p = N % 6   #낱개

    for i in range(M):
        pak, sol = map(int,input().split())
        minp = min(minp,pak) 
        mins = min(mins,sol)
        tmp = min(minp*ps+mins*p, mins*N, minp*(ps+1))

    print(tmp)

 

결과

반응형

문제: 보물

 

1026번: 보물

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거

www.acmicpc.net

 

S = A[0] × B[0] + ... + A[N-1] × B[N-1]

 

크기 N의 배열 A, B이 있고, 위 공식 값이 최소가 되도록 A의 원소 위치를 변경하는 문제이다.

위 공식 값이 최소가 되려면 A[N-1] * B[N-1]A의 최소값 * B의 최대값이 되어야 한다. 

나는 직접 원소를 이동시키진 않았고 A, B 배열을 복사해 최대값, 최소값을 갱신하고 삭제해가며 값을 계산했다.

 

 

풀이

if __name__ == '__main__':
    N = int(input())
    A = list(map(int, input().split()))
    B = list(map(int, input().split()))

    tmpA = A
    tmpB = B
    answer = 0

    for i in range(N):
        mina = min(tmpA)
        maxb = max(tmpB)
        if len(tmpA)>0:
            tmpA.remove(mina)
            tmpB.remove(maxb)
        answer += (maxb * mina)

    print(answer)

 

 

반응형

 

요새 알고리즘을 하는둥 마는둥 깔짝이다

저번 주에 오오오오랜만에 코테를 무려 4개나 치루고,, 많은 자극을 받았다.

 

기본 문제부터 다시 차근차근 풀어볼 예정으로 오랜만에 백준으로 문풀을 했다.

 

 

문제 : 다리놓기

 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net

 

 

 

< 그림과 같이 강 동쪽(M)에서 강 서쪽(N)으로 겹치지 않게 다리를

놓을 수 있는 경우의 가지수를 출력하면 된다 ~_~

조합문제여서 python combinations를 사용해서 쓰면 (N=13, M=29)만 되어도

실행시간이 엄청 오래걸리고 제출 시 런타임에러가 발생한다.

 

문제에서 의도한 바는 조합 공식 (m!/n!(m-n)!) 을 활용해 푸는 거인 것 같지만,,

파이썬에는 조합의 개수를 바로 구해주는 math 함수가 있다. (개꿀)

 

 

 

 

풀이

import math

if __name__ == '__main__':
    T = int(input())
    for _ in range(T):
        N,M = map(int,input().split()) # mCn
        arr = list(range(1,M+1))

        #print(len(list(it.combinations(arr,N)))) #Runtime ERR
        print(math.comb(M,N))

 

math.comb(M,N)를 사용하면 M개에서 N개를 조합으로 선택할 때의 경우의 수를 출력한다.

 

반응형

문제

 

Best Time to Buy and Sell Stock - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

예제

Input: prices = [7,1,5,3,6,4]
Output: 5

Constraints:
1 <= prices.length <= 105
0 <= prices[i] <= 104

주식이 1인 시점에서 6인 시점에 팔아야 최대 이득을 볼 수 있고 이득은 5이다.

브루트포스로 풀면 O(n^2)으로 제출 시 타임아웃 에러가 난다.

 

주식의 최소값과 이득을 계속해서 갱신하는 방법으로 O(n)에 해결해야 하는 문제이다.

 

 

풀이

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        result = 0
        minp = sys.maxsize
        
        for p in prices:
            minp = min(p, minp) #최소값 갱신
            result = max(result, p-minp) #이득 갱신
        
        return result

결과

 

반응형

문제 

 

Longest Palindromic Substring - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문자열에서 가장 긴 팰린드롬 문자열을 추출하는 문제이다. (팰린드롬 : 앞뒤가 똑같은 문자열)

 

(연관문제 : 유효한 팰린드롬)

 

LeetCode 125. Valid Palindrome - 유효한 팰린드롬 (python)

문제 Valid Palindrome - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 팰린드롬 :..

rokroks.tistory.com

 

예제

Input: s = "babad"
Output: "bab"
Explanation: "aba" is also a valid answer.

 

풀이 (python)

class Solution:
    def longestPalindrome(self, s: str) -> str:
        
        def expand(l:int, r:int)->str: #left, right 이중 포인터
            while l>=0 and r<len(s) and s[l]==s[r]:
                l-=1
                r+=1
            return s[l+1:r] # 인덱스 l부터 r-1까지 
        
        result = ''
        
        if len(s)<2 or s==s[::-1]:  #예외처리
            return s
        
        for i in range(len(s)-1):
            result = max(result,
                         expand(i, i+1), #팰린드롬 길이가 짝수인 경우
                         expand(i, i+2), #팰린드롬 길이가 홀수인 경우
                         key=len)
                         
        return result

투 포인트를 사용해 팰린드롬 길이가 짝수/홀수 인 경우를 구분했고

인덱스를 확장하며 팰린드롬을 리턴하는 expand(left, right) 함수를 만들어 길이 기준 (key=len)으로

최대길이 문자열을 반환했다.

반응형

문제

 

코딩테스트 연습 - 두 개 뽑아서 더하기

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한

programmers.co.kr

 

풀이

import collections as coll
def solution(numbers):
    answer = []
    dic = coll.defaultdict(int)
    numbers.sort()
    
    ln = len(numbers)
    
    for i in range(ln):
        for j in range(ln):
            if i==j: continue
            x=numbers[i]+numbers[j]
            if x not in dic:
                dic[x]=0
    
    answer = list(dic.keys())
    answer.sort()
    return answer

ㅋㅋ.. 3월에 코테를 왕창 볼 예정이어서 빡공해야 하는데

쉬운 문제만 골라 풀고있다 ㅠㅠㅠㅠ 흑흑 정신채리~~~

반응형

문제

 

Group Anagrams - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

애너그램 : ate=tea=eat > 같은 문자들로 문자열을 재배열

애너그램끼리 그룹짓는 문제이다.

 

풀이

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        
        dic = collections.defaultdict(list)
        
        for arr in strs:
            tmp = ''.join(sorted(arr)) #sorted(arr) -> list 반환, sorted("tea")=['a', 'e', 't']
            dic[tmp].append(arr)

        return dic.values()

 sorted()는 리스트, 문자, 숫자 모두 정렬이 가능하다 list 형으로 반환한다. (용도에 맞게 join 하기)

반응형

문제 

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

2019 KAKAO BLIND RECRUITMENT 출제 문제이다.

뭔소린가 싶은데 문제에 친절하게 실패율 공식도 적혀있고 입출력 설명도 자세해서 그대로 짜면 된다.

 

  • 실패율은 다음과 같이 정의한다.
    • 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

 

풀이

def solution(N, stages):
    answer = []
    score = collections.defaultdict(float)

    for i in range(1, N + 1):
        success = 0
        stop = 0
        cur = 0
        for x in stages:
            if x >= i:
                success +=1
            if x == i:
                stop +=1
        if success == 0 or stop == 0:
            score[i] = 0 # 0 나누기 예외처리
        else:
            score[i] = stop/success

    score = sorted(score.items(), key=lambda x: x[1], reverse=True)  # dict v기준 내림차순정렬

    for k in score:
        answer.append(k[0]) 

    return answer

위 입력값(N, stages)으로 실행 후 실패율 내림차순(reverse=True)으로 딕셔너리를 정렬했다.

(오름차순은 따로 지정안해줘도 됨~~~)

score 딕셔너리 정렬전/후, answer 리스트 출력

끝!

반응형

문제

 

코딩테스트 연습 - 없는 숫자 더하기

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

programmers.co.kr

 

풀이

import collections 

def solution(numbers):
    answer = 0
    dic = collections.defaultdict(int)
    
    for x in numbers:
        if str(x) not in dic:
            dic[str(x)]+=1
    
    for x in range(10):
        if str(x) not in dic:
            answer+=x
    
    return answer

입출력 예시

반응형

+ Recent posts