프로그래머스 코딩테스트 실전 대비 모의고사 2차

yoongyum·2022년 8월 19일
0

코딩테스트 🧩

목록 보기
46/47
post-thumbnail

문제푸는 것도 중요하지만 실전 테스트를 보는게 중요하다고 생각합니다.
시험 보러 가기

2차 문제집

공개일 - 2022.07.27. 14:00
종료일 - 2022.08.23. 23:59

제한시간 180분



선 후기

1차 문제집과는 다르게 2차 문제집은 총 3문제였습니다.

3문제 모두 풀었고, 문제 난이도는 1차에 비해서 많이 쉬웠습니다.



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번 문제

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번 문제

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차 문제집도 풀게되면 포스팅하도록 하겠슴다..

0개의 댓글