요새 가장 긴 증가하는 부분수열에 자신감에 생겼는데,
https://www.acmicpc.net/problem/2532
2532번: 먹이사슬
1부터 N까지 번호가 붙여져 있는 N마리 서로 다른 동물이 있다. 모든 동물은 동일한 하나의 수평선 상에서 연속된 구간 내에서 활동한다. 이 구간을 그 동물의 활동영역이라 한다. 동물의 활동영
www.acmicpc.net
해당 문제한테 두들겨 맞고, 자신감이 바로 꺾였습니다.
분명, 이 문제 카카오 공채 시험 문제였던걸로 생각나고, 풀어 봤던거 같은데, 왤케 틀렸을까요.
다행히 아이디어는 떠올랐습니다.
시작점을 기준으로 정렬(오름차순)하고, 끝점으로 기준하여 다시 정렬(내림차순) 후, 끝점 기준으로 가장 긴 감소하는 부분 수열, 혹은 뒤집어서 가장 긴 증가하는 부분 수열 만들기 (단 !!! 중복 허용)
이렇게 하면 풀립니다.
def BS(s, e, v):
global LB
if s > e:
return
m = (s + e) // 2
if LIS[m] <= v:
BS(m + 1, e, v)
else:
LB = m
BS(s, m - 1, v)
N = int(input())
A = []
for _ in range(N):
id, s, e = map(int, input().split())
A.append([s, e])
A = sorted(A, key = lambda x: (x[0], -x[1]))[::-1]
LIS = []
LB = 0
for idx in range(len(A)):
v = A[idx][1]
if idx > 0 and A[idx][0] == A[idx - 1][0] and A[idx][1] == A[idx - 1][1]:
continue
if idx == 0 or LIS[-1] <= v:
LIS.append(v)
else:
BS(0, len(LIS) - 1, v)
LIS[LB] = v
print(len(LIS))
평소에 가장 긴 증가하는 부분 수열에서
시작점, 끝점이 같으면 비교를 생략하고, => 반복문에서 이전 것이 현재 것과 같으면, 그 현재는 로직 out
중복을 허용하게 만들어주면 됩니다. => Binary Search의 조건에서 (<를 <=)으로 교체 (여기서 고생 좀 했어용...)
(다른 블로그들 뭔 설명을 장황하게 했던데, 다 도움 안됐음, 내가 짱임)
오늘 글의 핵심 !!!
http://www.dovelet.com
www.dovelet.com
위의 사이트는 문제가 틀리면, 어떤 예제에서 틀렸는지 보여줍니다 !!!
문제가 다 있는건 아닌거 같더라고요. 그래도 정보 올림피아드 문제는 좀 있는거 같습니다. 현재까지도 운영하고 있는 사이트 같고요.
사랑합니다. 개발자님
진짜 왜 맞 틀 ? 에 중독된 분들은 위에 사이트에서 본인의 문제를 제출해보세요.
문제는 잘 못이 없습니다.
잘 못 된건 당신의 코드니까요 !!!
이상 2532 - 먹이사슬 / 알고리즘 꿀 팁 !! 였습니다. ^_^
이제 알고리즘 잠시 놓고, Angular 공부를 해야겠다...
'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글
7579 - 공장 (0) | 2021.10.09 |
---|---|
1517, 10090 - Inversion Counting (역순 갯수) / 최근 드는 생각 (2) | 2021.10.03 |
18111 - 마인크래프트, python에서의 elif와 else 속도 차이 (4) | 2021.09.26 |
2550 - 전구 (7) | 2021.09.12 |
12865 - 평범한 배낭 (8) | 2021.09.05 |