Coding Test/programmers

lv.2 풀이 day1

210B 2023. 3. 1. 00:11
최댓값과 최솟값

def solution(s):
    s = list(map(int,s.split()))
    answer = str(min(s)) + " " + str(max(s))
    return answer

JadenCase 문자열 만들기

'구분자'.join(리스트) : join 함수는 매개변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸어 반환하는 함수
'리스트0(구분자)리스트1(구분자)리스트2' 의 형식
def solution(s):
    snt = s.split()
    for i in range(len(snt)):
        if not snt[i][0].isnumeric():
            snt[i] = snt[i][0].upper() + snt[i][1:].lower()
                
    answer = ' '.join(snt)
        
    return answer

틀렸다! 왜 틀렸지???

def solution(s):
    answer=''
    snt = s.split()
    for i in range(len(snt)):
        snt[i] = snt[i].capitalize()
    answer=' '.join(snt)
    return answer

capitalize 함수 사용함

 

문제가 개편되었다고 해서 나와 같은 풀이를 제출한 사용자가 있었지만 별로 의미를 두지 않기로 했다

capitalize와 upper lower의 차이를 가르는 히든 테케는 뭐였을까

++ 아마 이거 때문인듯


올바른 괄호

def solution(s):
    stack = []
    answer = ''
    for i in range(len(s)):
        if s[i] =='(':
            stack.append(1)
        else:
            if not stack:
                return "false"
            else:
                stack.pop()
    if not stack:
        return "true"
    else:
        return "false"

테스트 결과 "true"가 기대값 true와 다릅니다 >> 이런 멘트를 띄우면서 오답 처리 됐는데 python 의 boolean 리턴값을 조심해야겠다.

def solution(s):
    stack = []
    answer = ''
    for i in range(len(s)):
        if s[i] =='(':
            stack.append(1)
        else:
            if not stack:
                return False
            else:
                stack.pop()
    if not stack:
        return True
    else:
        return False

스택/큐 문제라서 스택 개념으로 풀려고 노력해봤음 딱히 어렵지는 않았다.


이진 변환 반복하기

def solution(s):
    answer = []
    def binch(st, answer):
        zero = 0
        st = list(st)
        i = 0
        while(st):
            if st[i] == '0':
                st.pop()
                zero += 1
            else:
                i += 1
        num = len(st)
        answer[0] += 1
        answer[1] += zero
        
        return bin(num)
    
    number = int(s)
    while ( number != 1):
        number = binch(str(number), answer)
        
    return answer

첫 시도... 처참하게 망. 시간 초과됨

def solution(s):
    answer = [0,0]
    
    while(s != '1'):
        cnt = s.count('0')
        n = len(s)-cnt
        s = str(bin(n))[2:]
        answer[0] += 1
        answer[1] += cnt
        
    return answer

계속 0b11이 출력되길래 의문이었는데 bin() 함수를 쓰면 0b가 앞에 붙어서 함께 출력되는 걸 잊고 있었다.

 

collections의 counter 함수를 활용한 풀이도 보였는데 이진수에서는 굳이 필요성이 느껴지지 않았다. 어차피 0아니면 1이라서 자릿수만 알면 되니까

0을 공백으로 바꾸는 풀이도 있었다.


짝지어 제거하기

def solution(s):
    def pair(s):
        i = 0
        for i in range(len(s)-1):
            if s[i] == s[i+1]:
                s[i] = ''
                s[i+1] = ''
                break
                
    result = ''
    s = list(s)
    while(result != str(pair(s))):
        result = pair(s)
    
    if s == '':
        answer = 1
    else:
        answer = 0

    return answer

또 10초 초과해서 튕겼다.

실행 시간을 줄이지 못해서 구글링 좀 했는데 스택을 사용해서 푼 사람이 있길래 후다닥 다시 풀었음

def solution(s):
    stack = []
    
    for i in range(len(s)):
        if len(stack) == 0:
                stack.append(s[i])
        elif stack[-1] == s[i]:
                stack.pop
        else:
            stack.append(s[i])
    
    if len(stack) == 0:
        answer = 1
    else:
        answer = 0

    return answer

영어 끝말잇기

def solution(n, words):
    answer = [0,0]

    for i in range(len(words)):
        if words[i] in words[0:i]:
            answer = [i%n+1, i//n+1]
        elif words[i][0] != words[i-1][-1]:
            answer = [i%n+1, i//n+1]
            
    return answer

로직은 맞는것 같은데 계속 테케 하나를 통과를 못한다

wow...

def solution(n, words):
    answer = [0,0]

    for i in range(1,len(words)):
        if words[i] in words[0:i]:
            answer = [i%n+1, i//n+1]
        elif words[i][0] != words[i-1][-1]:
            answer = [i%n+1, i//n+1]
            
    return answer

for 문 범위 시작을 1로 설정해주니 통과되었다.

  • 저장하지 않는 방법으로 할 때 반복문 범위는 1~len(words)로 해야한다.(0~len(words)로 하면 안 됨)
  • 왜냐하면 비교를 할 때 words[i][0] != words[i-1][-1] 을 하기 때문이다.

>>이렇다고 한다.. 근데 왜 [1,1]로 나왔는지는 여전히 모르겠다

 

와 근데 제출해보니 튕겼다

def solution(n, words):

    for i in range(1,len(words)):
        if words[i] in words[0:i]:
            return [i%n+1, i//n+1]
        elif words[i][0] != words[i-1][-1]:
            return [i%n+1, i//n+1]
            
    return [0,0]

answer 리스트를 따로 설정하지 않고 바로 리턴해버리면 통과가 되는데 왜 answer 리스트를 설정하면 틀리는 테케가 있었는지 궁금하다.

 

좀 생각해봤는데 틀리는 경우가 나오면 즉시 게임을 멈추고 그 값을 반환해야하는데 answer 리스트 값을 설정하는 경우 계속해서 갱신이 되어 최초 오답자가 아닌 최종 오답자를 출력하게 되고 그로 인해 오답 처리가 되는 것 같다.


예상 대진표

def solution(n,a,b):
    answer = 1
    while (a+1)//2 != (b+1)//2:
        a = (a+1)//2
        b = (b+1)//2
        answer += 1

    return answer

너무 간단한 문제였음


구명보트

from collections import deque

def solution(people, limit):
    people.sort(reverse=True)
    peopleD = deque(people)
    
    def greedy(people, limit, cnt):
        weight = peopleD[0]
        peopleD.popleft()
        
        for i in range(0, len(peopleD)):
            if (weight + peopleD[i]) <= limit:
                peopleD.remove(peopleD[i])
                return cnt + 1
        else:
            return cnt+1
            
    cnt = 0
    while peopleD:
        cnt = greedy(people,limit,cnt)

    return cnt

list.pop(0)을 쓰려고 했는데 시간 복잡도가 어마무시하게 늘어난다고 해서 deque를 썼다.

데크 관련 파이썬 내장함수 공부해야할듯

헐 데크 썼는데도 몇몇 테케에서 시간 초과가 나왔다. for 문 돌릴때 이진탐색으로 돌려봐야겠다.

 

from collections import deque

def solution(people, limit):
    people.sort(reverse=True)
    peopleD = deque(people)
    
    cnt = 0
    while peopleD:
        if len(peopleD) == 1:
            cnt += 1
            break
        
        if peopleD[0] + peopleD[-1] <= limit:
            peopleD.popleft()
            peopleD.pop()
        else:
            peopleD.popleft()
        cnt += 1

    return cnt

성공


카펫

bfs문제지만 연립방정식으로 h와 w의 식을 구할 수 있을 것 같아서 구해봤는데 어디서 틀린건지 틀린 테케가 잇었다.

from numpy import sqrt

def solution(brown, yellow):
    answer = []
    h, w = 0, 0
    
    w = sqrt((brown-4)*(brown-4)-16*yellow)//4+sqrt((brown+4)*(brown+4))//4
    h = sqrt((brown+4)*(brown+4))//4-sqrt((brown-4)*(brown-4)-16*yellow)//4
    
    return [w, h]

노트 한장 앞뒤면에 필기해가면서 했는데 틀려서 마음이 아팠지만 bfs로 풀었다.

from math import sqrt

def solution(brown, yellow):
    for i in range(1, int(sqrt(yellow)) + 1):
        if yellow % i == 0:
            j = yellow // i
            if 2 * i + 2 * j + 4 == brown:
                return [j + 2, i + 2]
    return answer