문제 및 레퍼런스
https://school.programmers.co.kr/learn/courses/30/lessons/42862
https://namhandong.tistory.com/152
https://iambeginnerdeveloper.tistory.com/107
정답 코드
def solution(n, lost, reserve):
answer = 0 #1번
new_reserve = set(reserve)-set(lost) #2번
new_lost = set(lost)-set(reserve)
for i in new_reserve: #2번
if i-1 in new_lost:
new_lost.remove(i-1) #3번
elif i+1 in new_lost:
new_lost.remove(i+1)
answer = n - len(new_lost) #1번
return answer
배운 점
0. 변수 설정
- 문풀 전: 내가 정한 규칙에 따라 입력값을 항상 재설정
- 문제점: 레퍼런스를 보게 될 경우, 변수 달라 항상 고생. 또한 대문자로 변수 썼으므로 고속으로 코딩하기에 불편
- 결론: 프로그래머스처럼 입력값 변수가 정해져 있는 경우 그냥 그거 쓰자
1. 리턴 값 초기화의 중요성
- 문풀 전: 리턴 값을 초기화 하지 않고, 바로 answer = n - len(new_lost) 식으로 값 할당
- 문제점: 코드를 맞게 작성하였는데도, 심지어 정답 코드들과 초기화 부분을 제외하고 코드가 동일한데도 계속 일부 3-5개 케이스를 통과하지 못함
- 원인: 이전에 문풀 했을 때 할당되었던 answer이 누적될 수 있음
- 결론: 항상 리턴 값은 초기화하고 시작하는 것을 습관화하자
2. 배열 or 집합 값의 직접 탐색
- 직접 탐색
- 문풀 전: 항상 for i in range(len(lost)) 식으로 탐색하고 싶은 배열의 길이의 범위를 지정하여 탐색
- 문제점: lost[i] 식으로 한 번 더 그 값을 지정해주어야 하는 번거로움 발생. 또한 이번 문제처럼 lost 도 탐색해야 하는 경우 무조건 이중 for문 사용하여 배열 값에 접근해야함
- 결론: 배열 값에 바로 접근하자. for i in lost
- 문풀 전: 항상 for i in range(len(lost)) 식으로 탐색하고 싶은 배열의 길이의 범위를 지정하여 탐색
- 집합 값 탐색
- 문풀 전: 집합을 생성하고 집합을 탐색하는 것을 몰랐음
- 문제점: 이번 문제처럼 공통 원소를 제거하는 set(lost) - set(reserve) 같은 코드를 사용할 수 없음
- 결론: 배열, 집합 양자 왔다 갔다 하자
- 배열을 집합으로 만들기: set(lost) ( 결과: {2, 4} )
- 차집합 (= 공통 원소 제거): set(lost) - set(reserve)
- 집합도 len(lost), lost.remove(i) 처럼 배열에서 사용하는 메서드 사용 가능
- 문풀 전: 집합을 생성하고 집합을 탐색하는 것을 몰랐음
3. remove() 메서드
- 문풀 전: 배열에서 원소 제거할 때 무조건 pop() 메서드 사용
- 문제점: 메서드 특성 상 스택큐 문제에서 뒤의 원소부터 제거한다는 느낌이 강함 (실제 특정 값만 제거할 수 있는데도). 따라서 부담스러움
- 결론
- remove() 메서드를 사용하자.
- 다만 배열 or 집합 순회하면서 remove() 메서드를 사용할 경우, 순회하는 대상이 달라져 원하는 결과가 나오지 않을 가능성 있음
-> lost[:] 식으로 리스트의 전체를 슬라이싱하는 기법 사용하자. 이를 통해 리스트의 모든 요소를 복사하여 새로운 리스트를 생성하고, 이를 순회하면서 각 요소에 접근 가능
'Algorithm & SQL > Python' 카테고리의 다른 글
[완전탐색] 프로그래머스 카펫 | 파이썬 | 규칙 수식 세우기, 정수에서도 반복문 돌리기 (0) | 2024.01.24 |
---|---|
[Greedy] replace(old, new) 함수의 사용 (1) | 2023.12.06 |
[Greedy] 반복되는 로직은 배열에 넣고 순회 (1) | 2023.12.05 |
[Greedy] 테스트 케이스 수가 주어지지 않은 경우: 에러 처리 (1) | 2023.11.28 |
[Greedy] 큰 수 -> 작은 수로 탐색하며 몫만 필요할 때 (0) | 2023.11.28 |