배열을 정렬하였으므로, citation[i]의 오른쪽은 모두 citation[i]보다 같거나 큽니다.
즉, 값이 citation[i] 이상인 배열의 개 수의 합은 length-i 입니다.
따라서, h번 이상 인용된 논문의 개 수가 h개 이상이여야 한다는 조건은 다음과 같이 구현됩니다. 이때, h번에 해당 하는 값은 length -i 이므로 해당 값을 return 합니다 .
다른 방식으로 문제를 풀 때 어려웠던 점은 [0,1,5,6,7,9] 라는 배열이 주어졌을 때, 배열 내에서만 조건을 충족하는 값을 찾아 많이 헤맸었습니다. 이 경우, 4가 나와야한다는 것을 인지하시고 풀면 도움이 많이 될 것 같습니다.
풀이코드:
def solution(citations):
citations.sort()
length = len(citations)
for i in range(length):
if citations[i] >= length-i and citations[i] >= i:
return length-i
return 0
각 노드들의 관계가 배열로 주어졌을 때, 노드들이 이어져 있는 네트워크의 개 수를 세는 문제입니다.
dfs를 이용하여 노드 간의 연결 관계를 탐색하고, visited를 이용하여 서로 다른 네트워크의 개 수를 셀 수 있도록 구현하였습니다.
풀이코드:
def dfs(n,computers,now,visited):
for i in range(n):
if i == now:
continue
if computers[now][i] == 1 and not visited[i]:
visited[i] = True
dfs(n,computers,i,visited)
return 1
def solution(n, computers):
answer = 0
visited = [False] * n
for i in range(n):
if not visited[i]:
answer += dfs(n,computers,i,visited)
return answer
마지막으로, 가고자하는 위치의 값이 1(초기 값)이거나 현재 가는 경로가 더 가깝다면 갱신 될 수 있도록 하였습니다.
풀이코드:
from collections import deque
def solution(maps):
q = [(0,0)]
direction = [(0,1),(0,-1),(1,0),(-1,0)]
while q:
x,y = q.pop(0)
for i,j in direction:
nx = x + i
ny = y + j
if nx < 0 or nx >= len(maps) or ny < 0 or ny >= len(maps[0]) :
continue
if maps[nx][ny] == 1 or maps[x][y]+1 < maps[nx][ny]:
maps[nx][ny] = maps[x][y]+1
q.append((nx,ny))
return -1 if maps[len(maps)-1][len(maps[0])-1] == 1 else maps[len(maps)-1][len(maps[0])-1]
저는 문제를 이렇게 풀었지만, 문제를 풀고 난 후 Counter 객체는 빼기 연산이 가능하다는 것을 알 수 있었는데 ctra -ctrc 연산을 통해 Counter 객체에 남은 이름을 찾는 방법을 통해 더 깔끔하게 풀 수 있을 것 같습니다.
풀이코드:
from collections import Counter
def solution(participant, completion):
ctrc = Counter(completion)
ctra = Counter(participant)
return ''.join([a for a in list(set(participant)) if ctra[a] != ctrc[a] ])