문제푸는 것도 중요하지만 실전 테스트를 보는게 중요하다고 생각합니다.
시험 보러 가기
공개일 - 2022.07.27. 14:00
종료일 - 2022.08.23. 23:59
제한시간 180분
1차 문제집과는 다르게 2차 문제집은 총 3문제였습니다.
3문제 모두 풀었고, 문제 난이도는 1차에 비해서 많이 쉬웠습니다.
1번 문제는 제가 파이썬으로 풀어서 그런지 5분도 안걸렸던 것 같습니다.
문제를 푸는 방법은 여러가지인 것 같은데 저는 DFS로 풀었습니다.
정수 배열 number
에 매개변수가 주어집니다. ex) [-2, 3, 0, 2, -5]
배열 중 3개를 골라서 합이 0인 조합의 갯수를 찾는 문제입니다.
제한사항📌
- 3 ≤
number
의 길이 ≤ 13- -1,000 ≤
number
의 각 원소 ≤ 1,000- 서로 다른 학생의 정수 번호가 같을 수 있습니다.
import itertools
def solution(number):
answer = 0
for trio in list(itertools.combinations(number,3)):
if sum(trio) == 0:
answer += 1
return answer;
파이썬의 combinations
메서드를 사용해서 조합을 구했고, 합이 0이면 카운트를 해줬습니다.
2번은 1번문제보다 시간이 걸렸습니다.
2번 같은 경우는 인덱스 기준으로 스트링을 두개로 잘라서 각각set
을 이용해서 중복을 제거했었지만, 시간 초과가 나와서 해쉬를 사용했습니다.
정수 배열 topping
이 매개변수로 주어집니다. ex) [1, 2, 1, 3, 1, 4, 1, 2]
topping
을 두개로 쪼갰을때 양쪽에 토핑의 종류의 수가 같게 쪼갤 수 있는 수를 구하는 문제입니다.
제한사항📌
- 1 ≤
topping
의 길이 ≤ 1,000,000- 1 ≤
topping
의 원소 ≤ 10,000
from collections import defaultdict
def solution(topping):
answer = 0
ob = defaultdict(bool) #형쪽
yb = defaultdict(int) #동생쪽 (인트형)
## 처음엔 동생이 다 갖고 있다는 설정
for i in topping:
yb[i] += 1
## 동생쪽에서 하나씩 빼면서 형에게 전해준다.
for i in topping:
yb[i] -= 1
## 형쪽에서는 하나라도 받으면 True를 체크한다.
ob[i] = True
## 동생쪽에서 특정 토핑이 0개가 되면, 해당 해쉬를 삭제한다.
if yb[i] == 0:
del yb[i]
## 토핑의 종류수만 비교
if len(ob) == len(yb):
answer +=1
return answer
3번 문제는 BFS 최단거리 문제였습니다.
바로 풀이코드로 가겠습니다.
플로이드 마샬 알고리즘으로도 해봤는데 시간초과납니다. (아는거 써먹어보려고..했느데)
from collections import defaultdict
def solution(n, roads, sources, destination):
answer = []
graph = defaultdict(dict)
## 그래프 생성
for road in roads:
graph[road[0]][road[1]] = 1
graph[road[1]][road[0]] = 1
Q = []
visited = [-1 for _ in range(n+1)]
#도착지 부터 다른 노드의 거리를 구하기 위함
visited[destination] = 0
Q.append([destination, 0])
##BFS
while Q:
cur, dis = Q.pop(0)
for i in graph[cur]:
if visited[i] >= 0:
continue
visited[i] = dis + 1
Q.append([i, dis + 1])
for source in sources:
##도착지부터 source까지의 거리가 visited[]에 담겨있음
answer.append(visited[source])
return anser
다행히도 이번에는 모든 문제를 시간도 남기면서 풀어서 기분이 좋았네요.
3차 문제집도 풀게되면 포스팅하도록 하겠슴다..
✋