코딩테스트 연습 8일차

김채원·2023년 2월 4일
0

coding_test

목록 보기
8/11

어느새 주말이네요.
그리고 Lv.1 문제도 절반을 넘겼습니다.
다음주가 끝날 때엔 Lv.2를 풀고 있도록 노력해보겠습니다.


Lv.1

문자열 내 마음대로 정렬하기

틀린 코드
"인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다." < 이 조건이 어렵다.

def solution(strings, n):
    answer = []
    sort_dic = {}

    for idx,item in enumerate(strings):
        if item[n] in sort_dic.keys():
            sort_dic[item[n+1]] = idx  
        sort_dic[item[n]] = idx

    sort_dic = dict(sorted(sort_dic.items()))
    for idx in sort_dic.values():
        answer.append(strings[idx])
    
    return answer

그냥...sort부터 때리고 n기준으로 바꾸면 어떨까?
그럼 동일 문자는 사전순으로 그대로 유지될테고 n번째가 다른 item만 순서가 바뀔듯?

틀린 코드 2
테스트 케이스는 통과하는데 채점하니 처참하다...ㅠㅠ
내가 정렬 알고리즘을 잘 모르나보다.
일단 전체 정렬부터 하는게 올바른 접근 방법임을 알았다!

def solution(strings, n):
    strings.sort()
    
    for idx in range(len(strings)-1):
        if strings[idx][n] > strings[idx+1][n]:
            strings[idx],strings[idx+1] = strings[idx+1],strings[idx]  

    return strings

수정 코드
sorted에 key가 혹시라도 될까 싶었는데 되더라...
윽....ㅠㅠ

def solution(strings, n):
    strings.sort()     
    return sorted(strings, key=lambda x:x[n])

K번째 수

틀린 코드
index error가 뜬다...대체 왜....?
범위를 초과할 수가 없는데 왜 테케도 통과 못하는거지?

def solution(array, commands):
    answer = []
    for item in commands:
        array = sorted(array[item[0]-1:item[1]])
        answer.append(array[item[2]-1])   
    return answer

수정 코드
이럴수가..ㅎㅎㅎ...어이없다....

def solution(array, commands):
    answer = []
    for item in commands:
        tmp = sorted(array[item[0]-1:item[1]])
        answer.append(tmp[item[2]-1])
    return answer

숏코딩

def solution(array, commands):
	return [sorted(array[c[0]-1:c[1]])[c[2]-1] for c in commands]

숫자 문자열과 영단어

쪼갤까?하다가 제한시간 10초를 보고 쪼개면 안될 것 같았다..
또 문자문자 붙어있는건 쪼갤 수 있는 방법이...ㅠㅠ
못 쪼개면 대체로 넘어가자.

틀린 코드
대체도 안되네???ㅠㅠ뭐지....
뜨는 에러는 무려..문자열을 숫자로 바꿀 수 없습니다...
대체가 아예 안 됐다는 뜻이다...

def solution(s):
    answer = 0
    num_str = {"zero":"0","one":"1","two":"2","three":"3",
              "four":"4","five":"5","six":"6","seven":"7",
              "eight":"8","nine":"9"}
    for k,v in num_str.items():
        answer = s.replace(k,v)
    return int(answer)

이건 왜 되는데? 프로그래머스 자식들아

def solution(s):
    num_str = {"zero":"0","one":"1","two":"2","three":"3",
              "four":"4","five":"5","six":"6","seven":"7",
              "eight":"8","nine":"9"}
    
    for k,v in num_str.items():
        s = s.replace(k,v)
    return int(s)

두 개 뽑아서 더하기

틀린 코드
제일 먼저 생각난건 이런 방법.
근데 테케 2개 통과 못함 ㅠㅠ

import itertools 

def solution(numbers):
    answer = sorted([sum(c) for c in itertools.combinations(numbers, 2)])
    answer = list(set(answer))
    return answer

수정 코드
set으로 변환하면 정렬이 보장되지 않는다고 한다...
몰랐던 사실. 정렬 한 번 더하니 정답!

import itertools 

def solution(numbers):
    answer = sorted([sum(c) for c in itertools.combinations(numbers, 2)])
    answer = sorted(list(set(answer)))
    return answer

2016년

datetime 라이브러리 사용
근데..ㅎ 쓰면 안되겠지?

import datetime

def solution(a, b):
    day = datetime.datetime(2016, a, b).strftime("%A")
    day = day.upper()
    return day[0:3]

안 쓴 코드
와 이거 두고두고 기억해야겠다.
왜 fri부터인지 사실 아직 이해가 되지 않는다.

def getDayName(a,b):
    months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    days = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU']
    return days[(sum(months[:a-1])+b-1)%7]

폰켓몬

def solution(nums):
    ans = 0
    max_len = len(nums)//2 
    nums = list(set(nums)) #중복제거
    
    for i in nums:
        if ans < max_len:
            ans += 1
    
    return ans

숏코딩
와...............

def solution(ls):
    return min(len(ls)/2, len(set(ls)))

크기가 작은 부분 문자열

부분 문자열 어떻게 만들지..생각했는데,
자세히 보니까 크기비교만 하면 되는 문제라서
굳이 append해서 복잡하게 셀 필요가 없었다.
range()범위 조절이 관건, 슬라이싱 할 때 꼭 기억하자.
이렇게 하면 부분 문자열도 만들어서 출력할 수 있겠네....

def solution(t, p):
    answer = 0

    for i in range(len(t) - len(p) + 1):
        if int(p) >= int(t[i:i+len(p)]):
            answer += 1

    return answer

콜라 문제

틀린 코드
채점 개같이 실패...
찬찬히 뜯어보니 이 코드는 b=1일때만 성립한다;

def solution(a, b, n):
    answer = 0
    
    while n >= a:
        lst = [c*a  for c in range(1,n) if c*a <= n] #교환이 가능한 최대 수
        n = n - max(lst) + int(max(lst)/a) 
        answer += int(max(lst)/a) 

    return answer

테스트 케이스 12번에서 시간초과가 뜬다ㅠㅠ
아무래도 12번이 엄청 큰 수고 리스트를 만드는데 꽤 걸리나 싶다.
그럼 저 부분을 for랑 if, 리스트를 쓰지않고 max(lst)를 대체해야 한다.

def solution(a, b, n):
    answer = 0
    
    while n >= a:
        lst = [c*a  for c in range(1,n) if c*a <= n] #교환이 가능한 최대 수
        n = n - max(lst) + int(max(lst)//a)*b
        answer += int(max(lst)//a)*b 

    return answer

answer만큼은 다시 받은거니까 무조건 더해지고
교환하고 남은 병의 개수도 더해야한다. (나머지)

def solution(a, b, n):
    answer = 0
    
    while n >= a:
        answer += (n//a)*b
        n = (n//a)*b + (n%a)

    return answer

푸드 파이트 대회

내 코드

def solution(food):
    front = ""
    for idx in range(1,len(food)):
        if food[idx] < 2:
            continue
        else:
            front += str(idx)*(int(food[idx])//2)
    return front+"0"+front[::-1]

for문 안이 더 단순하네...
그렇네....1//2 해봤자 몫이 0이라서 굳이 if문 처리가 필요 없었다ㅠㅠ

def solution(food):
    answer = ''

    for i in range(1,len(food)):
        answer+=str(i)*(food[i]//2)

    return answer+"0"+answer[::-1]
profile
잡다한 공부 기록용

0개의 댓글