ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
코드카타
코딩테스트 연습 - 두 개 뽑아서 더하기 | 프로그래머스 스쿨
일단 numbers의 유니크한 값만 뽑아야함 -> set(numbers) 쓰면 됨
그 후 numbers를 하나씩 더해서 고유값을 오름차순으로 담으면 되는데
max(numbers)랑 min(numbers) 를 각각 하나씩 더해서 answer에 넣고 마지막에 return set(numbers).sort() 하면 될듯
def solution ( numbers ):
answer = []
max_ = max ( numbers )
min_ = min ( numbers )
for i in range ( len ( numbers )):
answer . append ( max_ + int ( numbers [ i ]))
answer . append ( min_ + int ( numbers [ i ]))
answer = list ( set ( answer ))
if len ( answer ) > 0 and 2 * max_ == int ( answer [ - 1 ]):
answer . remove ( answer [ - 1 ])
if len ( answer ) > 0 and 2 * min_ == 0 :
answer . remove ( answer [ 0 ])
return answer
이게 왜 안되는거야
ss = [ 1 , 0 , 7 , 0 , 7 , 2 , 3 ]
solution ( ss ) ## [1, 2, 3, 7, 8, 9, 10] 이니까 잘못됌 -----> 14랑 0이 안나옴
def solution ( numbers ):
answer = []
max_ = max ( numbers )
min_ = min ( numbers )
for i in range ( len ( numbers )):
answer . append ( max_ + int ( numbers [ i ]))
answer . append ( min_ + int ( numbers [ i ]))
answer = list ( set ( answer ))
if 2 * max_ in answer :
answer . remove ( answer [ - 1 ])
if len ( answer ) > 0 and 2 * min_ == 0 :
answer . remove ( answer [ 0 ])
return answer
이제
일때가 안되네
def solution ( numbers ):
answer = []
for i in range ( len ( numbers )):
for j in range ( i + 1 , len ( numbers )):
answer . append ( numbers [ i ] + numbers [ j ])
return list ( set ( answer ))
ss = [ 2 , 0 , 1 , 7 , 11 , 3 , 0 , 4 , 1 ]
solution ( ss ) ## [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18]
0이 2번 나올수도 있는거 아녀? 맞아 .. 맞는거야
대신 정렬해줘야함
set 쓴다고 자동 정렬되는건 아님
반례
my_set = set ([ 100 , 200 , 300 , 50 , 10 , 20 , 30 ])
my_set ### {10, 20, 30, 50, 100, 200, 300} -> 리스트 형식으로 바꿔줘야함
최종 (다른 사람 풀이와 같음)
def solution ( numbers ):
answer = []
for i in range ( len ( numbers )):
for j in range ( i + 1 , len ( numbers )):
answer . append ( numbers [ i ] + numbers [ j ])
return sorted ( list ( set ( answer )))
다른 사람 풀이 combinations 적용
from itertools import combinations
def solution(numbers):
answer = []
l = list(combinations(numbers, 2))
for i in l:
answer.append(i[0]+i[1])
answer = list(set(answer))
answer.sort()
return answer
from itertools import combinations
ss = [ 2 , 4 , 1 ]
I = list ( combinations ( ss , 2 ))
I # [(2, 4), (2, 1), (4, 1)]
combinations 함수 이해 ㅇㅋ
코딩테스트 연습 - 가장 가까운 같은 글자 | 프로그래머스 스쿨
방금 전 문제랑 비슷하네 2중 for문 써야함 다르면 -1 출력하는건 쉬운데
문자가 같을때 문자간 거리 계산하는게 조금 복잡함
1) 인덱싱 넘버를 추출해서 거리 계산한다
2) 모르겠음
def solution ( s ):
answer = []
for i in range ( len ( s )):
for j in range ( i + 1 , len ( s )):
if s [ i ] == s [ j ]:
answer . append ( j - i )
else :
answer . append ( - 1 )
return answer
ss = "banana"
solution ( ss ) # [-1, -1, -1, -1, -1, -1, 2, -1, 4, -1, 2, -1, -1, 2, -1]
1) 안됨
if 절도 2중으로 써야함 일단 if s[i] in s
아 in은 못쓰는 구나 무조건 1개는 들어가니까 2개 이상으로 나오는 경우만 쓸 수 있음
2)
예를들어 b와 같은 값을 찾기위해 다른 문자 전체를 한번씩 훑어버리는데 [-1,-1,-1.. ] 처럼
그냥 값은 값이 없으면 바로 -1 출력하고 바로 넘어가야함 [-1] 한번만 넣어져야함
break로 탈출해야 겠는데 흠
def solution ( s ):
answer = []
for i in range ( len ( s )):
for j in range ( i + 1 , len ( s )):
if s [ i ] == s [ j ]:
answer . append ( j - i )
break
else :
answer . append ( - 1 )
return answer
ss = "banana"
solution ( ss ) # [-1, -1, -1, -1, -1, -1, 2, -1, 2, -1, 2, -1]
일단 4인 경우는 break 로 없앰
이제 -1 계속 나오는거만 없애주면 됨
즉, else: 부분만 들여쓰기 위치 옮겨주거나 수정하면됨
def solution ( s ):
answer = []
for i in range ( len ( s )):
for j in range ( i + 1 , len ( s )):
if s [ i ] == s [ j ]:
answer . append ( j - i )
break
if s [ i ] != s [ j ]:
answer . append ( - 1 )
return answer
ss = "banana"
solution ( ss ) # [-1, 2, 2, 2, -1]
아 이건 자신보다 뒷칸에 있을 경우를 구하는 식이였네
앞칸에 있는 식을 구해야함 우씨
def solution ( s ):
answer = []
s = s [:: - 1 ]
for i in range ( len ( s )):
for j in range ( i + 1 , len ( s )):
if s [ i ] == s [ j ]:
answer . append ( j - i )
break
if s [ i ] != s [ j ]:
answer . append ( - 1 )
return answer [:: - 1 ] ## [ -1, -1, 2, 2, 2]
# 원하는 정답 [-1,-1,-1,2,2,2]
이렇게 바꾸니까 [-1, -1, -1, 2, 2, 2] 나와야하는데 1개씩 빼먹음 왜지?
일단 if s [ i ] != s [ j ]: 들여쓰기 잘못됨
1) 들여쓰기만 수정
def solution ( s ):
answer = []
s = s [:: - 1 ]
for i in range ( len ( s )):
for j in range ( i + 1 , len ( s )):
if s [ i ] == s [ j ]:
answer . append ( j - i )
break
if s [ i ] != s [ j ]:
answer . append ( - 1 )
return answer [:: - 1 ]
ss = "banana"
solution ( ss )
# 원하는 정답 [-1,-1,-1,2,2,2]
# [-1, -1, -1, 2, -1, 2, -1, 2, -1]
출력값에 -1이 같이 나옴 ..
2) 들여쓰기 수정, break 넣어봄
def solution ( s ):
answer = []
s = s [:: - 1 ]
for i in range ( len ( s )):
for j in range ( i + 1 , len ( s )):
if s [ i ] == s [ j ]:
answer . append ( j - i )
break
if s [ i ] != s [ j ]:
answer . append ( - 1 )
break
return answer [:: - 1 ]
ss = "banana"
solution ( ss ) # [-1, -1, -1, -1, -1]
** enumerate() 를 사용하고 싶었으나 이해도 부족으로 2중 for문을 사용하기로 결정
단, 추후에 enumerate() 다시 공부할 필요 있음
튜터님 헬프
1) 2중 for문을 썼을 때 의 코드
1) 모든 값을 -1로 초기화
answerList라는 초기 리스트를 설정함 len(s) 가 5개 이면 [-1]씩 곱해 [-1,-1,-1,-1,-1] 이 됨
이유: 모든 단어의 첫번째 철자는 -1이 나오므로 겹치는 철자에 대해서만 -1에서 다른 값으로 대체하기 위해
2) s의 각 문자에 대해 반복
3) i보다 작은 인덱스들에 대해 반복
4) s[i]와 s[j]가 같다면 각 인덱싱 만큼 뺀 값을 answerList에 추가
***
Q. 딱히 좋지 않은 코드 ? A. for문이 반복해서 들어가다보니 속도가 느림 -> 효율이 떨어짐 ex) gridsearch
2) 딕셔너리를 사용했을 때의 코드 (내가 원했던 코드)
def solution ( s ):
answer = []
dic = {}
for i in range ( len ( s )):
print ( i )
if s [ i ] in dic :
print ( s [ i ])
answer . append ( i - dic [ s [ i ]])
dic [ s [ i ]] = i
else :
answer . append ( - 1 )
dic [ s [ i ]] = i
return answer
딕셔너리 부터 어렵다
***
1) 의 시간 복잡도가 2) 보다 높아서 나중에 큰 값을 입력했을 때 성능이 급격히 저하됨
마지막에 막힌 이유 - 애초에 코드 설정 자체를 잘못함
3) enumerate() 사용 했을 때
def solution(s): answer = [] dic = {} for i, char in enumerate(s): # enumerate()를 사용하여 인덱스와 문자 추출 if char in dic: &n