lv.2 풀이 day1
최댓값과 최솟값
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