아자아자 화이팅이닷 !

230802 프로그래머스 문제풀기 본문

TIL

230802 프로그래머스 문제풀기

유초23 2023. 8. 2. 23:56
728x90

* 수열과 구간 쿼리 1 문제에서

s,e를 어떻게 선언을 해야할지 고민하다가 코드를 짰는데 동작을 안해서 GPT에게 물어봤다 ㅜ

 

for query in queries:
        s,e = query

를 해주고

 

for i in range(s,e+1):
            arr[i] += 1

을 해주면 쉽게 해결되는 문제였다.

 

근데

 for l,r in queries:
        for i in range(l,r+1): arr[i]+=1

그냥 이렇게 해줘도 풀리는 문제여따 ..


* 가까운 수 문제에서는

 

처음에 빈 배열을 하나주고, array를 sort시키는 작업이 필요하다 !

 

그리고

for i in array:
        box.append(abs(i-n))
    answer = [array[box.index(min(box))]]

array와 box는 둘다 오름차순이니까 index 순서가 같다는 점을 이용해 코드를 짜면 된다 !

 

그리고

if len(answer) > 1:
        return min(answer)

가장 가까운 수 중에는 더 작은값을 가져오라고 했으니까 min을 써주면 된다 !

 

나에겐 어려웠던 문제 ,,


* 이차원 배열 대각선 순회하기 문제에서

나는 for문을 

for i in range(len(board)):
        for j in range(len(board[i])):

이렇게 돌려서 풀었는데,

 

return sum(board[i][j] for i in range(len(board)) for j in range(len(board[0])) if i + j <= k)

이렇게 이중으로 컴프리헨션이 가능하다는걸 알았다 !

 

그리고 count =0 / count += board[i][j]는 sum(board[i][j])로 사용할 수 있다는 거 !


* 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기 문제에서

나는 처음에

def solution(myString,pat):
    answer = ''
    for i in myString:
        answer += i
        if answer.endswith(pat):
            if i == answer[-1]:
                answer += i
            return answer

이렇게 해서 답을 찾으려고 했었는데 실패했다 ㅋ ㅠ

 

그래서 검색을 해봤는데

내가 잊고 있던 함수를 사용하면 아주 쉽게 풀리는 문제였다.

 

오른쪽부터 쪼개주는 rsplit 메서드를 이용하면 되는 문제였다.

rsplit(separator, maxsplit)
separator -> 선택. 구분자. (기본값: 공백)
maxsplit -> 선택. 쪼갤 지점 최대 개수.

>> rsplit(pat,1) -> 오른쪽부터 pat를 기준으로 1번만 쪼갠다.

 

그래서

return myString.rsplit(pat,1)[0] + pat

이렇게 해주면 된다 !

 

def solution(myString, pat):
    return myString[:len(myString) - myString[::-1].index(pat[::-1])]

이런 신박한 답도 있었다 !


* 숨어있는 숫자의 덧셈(2) 문제에서

 

나는

def solution(my_string):
    answer = ''
    for i in range(len(my_string)):
        if my_string[i].isdigit():
            answer += my_string[i]
    print(answer)

이렇게까지 밖에 생각해내지 못했는데, (이 코드는 동작안한다 ㅠ)

 

반대로 생각하면 풀리는 문제여따 ㅠ

	if i.isalpha():
    		my_string = my_string.replace(i," ")
my_string = my_string.split()

 

내가 생각한 방식으로 문제를 푸신 분이 계셔서 그 답을 가져와봤다 !

def solution(my_string):
    s = ''.join(i if i.isdigit() else ' ' for i in my_string)
    return sum(int(i) for i in s.split())

이렇게 간단하게 풀 수 있는 문제여따 ㅠ


* 수열과 구간 쿼리 3 문제에서는

 

arr[i],arr[j] = arr[j],arr[i]

이것만 알면 간단하게 풀 수 있다 !


* 진료순서 정하기 문제에서는

 

내림차순의 index를 가져오는게 포인트이기 때문에 내림차순을 하는 방법을 아는것이 중요하다 !

 

sorted(emergency,reverse = True)

이걸하고 이 index를 가져와서 풀면 해결할 수 있다 !

 

나는

def solution(emergency):
    answer = []
    emergency1 = sorted(emergency,reverse = True)
    for i in emergency:
        answer.append(emergency1.index(i)+1)
    return answer

이렇게 했는데,

 

def solution(emergency):
    return [sorted(emergency, reverse=True).index(e) + 1 for e in emergency]

이렇게 하면 더 간단하게 코드를 짤 수 있었다 !


* 빈 배열에 추가, 삭제하기 문제에서는

 

arr[i]값을 어떻게 곱해줄 것인지가 중요한데,

이때는 배열에 append를 해주는것이 아니라 extend를 해줘야한다.

 

append와 extend의 차이는

 

<GPT의 설명>

append와 extend는 둘 다 리스트에 요소를 추가하는 메서드입니다. 하지만 그 동작 방식에 차이가 있습니다.

  1. append: append 메서드는 리스트에 요소를 하나씩 추가합니다. 즉, 인자로 넘긴 요소를 리스트의 끝에 추가합니다.
my_list = [1, 2, 3]
my_list.append(4)
print(my_list)  # 출력: [1, 2, 3, 4]

 

  2. extend: extend 메서드는 리스트에 다른 리스트의 요소들을 추가합니다. 즉, 인자로 넘긴 리스트의 각 요소를 리스트의 끝에 하나씩 추가합니다.

my_list = [1, 2, 3]
my_list.extend([4, 5, 6])
print(my_list)  # 출력: [1, 2, 3, 4, 5, 6]

 

요약하면, append는 단일 요소를 추가하고, extend는 다른 리스트의 요소들을 추가하는 것입니다.

 

그렇다고 한다 ! (*^▽^*)

 

그래서

answer.extend([arr[i]] * arr[i] * 2)

이렇게 extend를 사용해서 코드를 짜야하고, arr[i]도 값 자체를 살려야하기 때문에 배열에 넣어준다.

 

그리고 else일때는

answer = answer[:-arr[i]]

이렇게 해주면 된다 !


오늘도 넘나 고생해똬 ..!

내일도 열심히 풀어보자고 ~!~

728x90