본 캠프 TIL

2월19일 TIL 코드카타

meoca1257 2025. 2. 18. 20:52

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

코드카타

코딩테스트 연습 - 두 개 뽑아서 더하기 | 프로그래머스 스쿨

일단 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

이제

ss = [1,2,3]

일때가 안되네

 

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