N = int(input())
P = int(input())
# 인덱스 번호 맞추기 위해 한 줄 추가
graph = [[0]*(N+1) for _ in range(N+1)]
done = []
for _ in range(P):
x, y = map(int, input().split())
graph[x][y], graph[y][x] = 1, 1
def dfs(v):
done.append(v)
for k in range(1, N+1): # 1 ~ n번까지
if (k not in done) and (graph[v][k] == 1):
dfs(k)
return (len(done) - 1) # 1번을 제외한 컴퓨터 수
print(dfs(1))
문제 자체는 DFS를 구현한다면 어렵지 않았다. 아직은 DFS를 자유롭게 구현하는게 힘들다...이 문제에서 인접행렬 방식을 이용해 DFS를 구현했다.
N, M = map(int, input().split())
maze = [list(input()) for _ in range(N)] # List[str]
# 방문 경로
done = [[0]*M for _ in range(N)]
# 좌,우,상,하 탐색을 위한 설정
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
# BFS 그래프 탐색
def bfs(x, y):
done[0][0] = 1 # 시작점
queue = [(0, 0)] # 큐 사용
while queue:
now = queue.pop(0)
for i in range(4):
nx = now[0] + dx[i]
ny = now[1] + dy[i]
if (0 <= nx < N) and (0 <= ny < M):
if done[nx][ny] == 0 and maze[nx][ny] == '1':
done[nx][ny] = done[now[0]][now[1]] + 1
queue.append((nx, ny))
return done[-1][-1]
print(bfs(0, 0))
처음 풀어보는 BFS 문제였는데.. 이해하는데 꽤나 어려웠다. 계속 반복적으로 생각하고 익혀야겠다.
N = int(input())
weights = [int(input()) for _ in range(N)]
weights.sort(reverse=True) # 내림차순
for i in range(N):
weights[i] = weights[i] * (i+1)
print(max(weights))
문제 접근 방법
- 로프를 병렬로 연결하면 각 로프에는 w/k만큼의 동일한 중량이 걸린다.
- 즉,가장 작은 무게를 들 수 있는 로프가 들 수 있는 질량 * 병렬연결 로프 개수= 최종 무게
- 가장 무거운 무게를 들 수 있는 로프부터 내림차순으로 정렬한다.
처음에는 너무 어렵게 접근해서 복잡하게 생각했다. 그래서 디큐를 활용해 하나씩 빼고 넣고 하려고 했다가 실패했다. 이렇게 단순하게 풀릴지는... 후..
T = int(input())
A, B, C = 0, 0, 0
while T > 0:
if T >= 300:
A = (T // 300)
T = (T % 300)
if (T >= 60) and (T < 300):
B = (T // 60)
T = (T % 60)
if (T < 60):
C = (T // 10)
if (T % 10) == 0:
print("{} {} {}".format(A, B, C))
break
else:
print(-1)
break
특별히 어려운 조건이 없는 문제였다. 최소한의 버튼 클릭 수를 구하기 위해 입력값을 큰 값으로 최대한 나누면 된다. 입력 값이 단위별로 나눌 수 있는 값인지 판단 후 계산을 하고 몫을 출력해주면 된다. 마지막에 10초로 나눴을 때 나머지가 0이 아니면 -1을 출력한다.
def recruit(num, score):
min_interview = score[0][1] # 첫번째 지원자 면접 등수
cnt = 1 # 첫 번째 지원자는 서류점수가 1등이기에 무조건 뽑힘
for i in range(1, num): # 1번 ~ n-1번
if score[i][1] < min_interview: # 뽑히는 경우
min_interview = score[i][1] # 더 높은 등수로 변경
cnt += 1
return cnt
tests = int(input())
for _ in range(tests):
num = int(input())
score = [list(map(int, input().split())) for _ in range(num)]
score.sort(key=lambda x: x[0]) # 서류 시험 등수 오름차순
print(recruit(num, score))
Python3로 제출하면 시간 초과가 나고, pypy로 제출하니 통과가 됐다. for문을 최대로 줄이려고 해 봤지만 다른 방법을 찾기가 쉽지 않았다.
문제 조건
- 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발.
- 즉, 현재 지원자의 서류 성적보다 더 높은 서류 성적을 가진 사람들보다 면접 성적이 높아야 선발된다.
따라서 우선 성적을 '서류 성적순'으로 정렬시킨다. 그리고 가장 높은 서류 성적을 가진 사람은 면접이 낮더라도 무조건 선발된다. 그래서 첫 번째 지원자의 면접 성적을 min_interview에 담고 그 값을 다음 사람들과 비교해나간다.
더 낮은(즉, 더 좋은 면접 성적) 성적을 가진 사람이 있으면 min_interview에 담는다. 그렇게 되면 특정 지원자의 면접시험 성적과 min_interview만 비교해 특정 지원자의 선발 여부를 결정할 수 있게 된다. 왜냐하면 이미 서류 성적순으로 정렬이 됐기에 지나온 지원자들보다 면접 성적만 낮지 않으면 되기 때문이다.
sugar = int(input())
result = 0
while sugar != 0:
if sugar < 0:
result = -1
break
if (sugar % 5) == 0:
result += (sugar // 5)
sugar = 0
else:
sugar -= 3
result += 1
print(result)
일단 설탕의 무게가 큰 단위인 5로 나눠지면 몫을 result에 담고 설탕 무게를 0으로 만든다. 만약 5로 나눠지지 않는다면 설탕에서 -3을 해주고 result를 1증가시킨다. 그러다 설탕이 0보다 작아지는 경우에는 5, 3으로 나눌 수 없는 값이기 때문에 -1을 출력하고 반복문을 종료한다.