HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • Baekjoon Online Judge
  • 코딩
  • 백준
  • Database
  • Algospot
  • 개발자
  • 백준C++
  • 프로그래머스
  • 프로그래머스Python
  • 백엔드
  • programmers
  • front-end
  • 데이터베이스
  • back-end
  • 프로그래밍
  • 백준Go
  • 알고스팟
  • 알고스팟Python
  • 백준Python
  • 프로그래머스C++

최근 댓글

인기 글

hELLO
HelloMinchan

처음처럼

[ALGOSPOT] 알고스팟 PICNIC 소풍(Python)
Deprecated

[ALGOSPOT] 알고스팟 PICNIC 소풍(Python)

2020. 5. 12. 00:46

www.algospot.com

[ALGOSPOT] 알고스팟 PICNIC 소풍

(Python)

(글쓴날 : 2020.05.12)

 


* ALGOSPOT, 알고스팟 PICNIC 문제 Python 언어 풀이입니다.

* 소스 코드의 저작권은 글쓴이에게 있습니다.


 

 

알고스팟 PICNIC 소풍


1) 문제

문제 링크 : https://www.algospot.com/judge/problem/read/PICNIC

 

algospot.com :: PICNIC

소풍 문제 정보 문제 안드로메다 유치원 익스프레스반에서는 다음 주에 율동공원으로 소풍을 갑니다. 원석 선생님은 소풍 때 학생들을 두 명씩 짝을 지어 행동하게 하려고 합니다. 그런데 서로 친구가 아닌 학생들끼리 짝을 지어 주면 서로 싸우거나 같이 돌아다니지 않기 때문에, 항상 서로 친구인 학생들끼리만 짝을 지어 줘야 합니다. 각 학생들의 쌍에 대해 이들이 서로 친구인지 여부가 주어질 때, 학생들을 짝지어줄 수 있는 방법의 수를 계산하는 프로그램을 작성하세요

www.algospot.com


2) 풀이 과정

* 시간 복잡도 : O(n!)

 

최대 10명의 학생들이 주어지고, 학생들 사이의 친구 관계가 쌍으로 주어질 때, 모든 학생들을 친구끼리 짝이 되도록 하는 경우의 수를 구하는 문제입니다.

 

저의 경우, DFS를 적용하였으며, Python을 사용했습니다.

먼저, 친구 관계를 표시하는 인접 행렬을 구현한 후, 완전 탐색을 실시하여 친구끼리 짝을 맺었을 때, 남아있는 학생이 없다면 답을 1 증가시키는 식으로 문제를 해결했습니다.

단, 짝이 맞아떨어진 학생들이 순서만 바뀐 채 중복될 경우 답을 여러 번 증가시키게 되므로, 반복 제어 변수를 DFS() 함수의 인자로 넘겨 순열이 아닌 조합을 구했습니다.


3) 코드

 

* Python 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import sys
input = sys.stdin.readline
 
 
def DFS(startI, remainingFriend):
    if not remainingFriend:
        return 1
 
    possibleCase = 0
 
    for i in range(startI, n):
        if not visit[i]:
            for j in range(i + 1, n):
                if not visit[j] and isFriend[i][j]:
                    visit[i] = visit[j] = True
                    possibleCase += DFS(i, remainingFriend - 2)
                    visit[i] = visit[j] = False
    
    return possibleCase
 
 
C = int(input())
 
for _ in range(C):
    n, m = map(int, input().split())
    visit = [False] * n
    isFriend = [[False] * n for _ in range(n)]
    friendsList = list(map(int, input().split()))
 
    for i in range(0, len(friendsList), 2):
        isFriend[friendsList[i]][friendsList[i + 1]] = True
        isFriend[friendsList[i + 1]][friendsList[i]] = True
 
    print(DFS(0, n))

 

저작자표시 비영리 변경금지

'Deprecated' 카테고리의 다른 글

[Baekjoon Online Judge] 백준 16287번 Parcel(Python)  (0) 2020.05.13
[Baekjoon Online Judge] 백준 1644번 소수의 연속합(Python)  (0) 2020.05.13
[programmers] 프로그래머스 불량 사용자(Python)  (0) 2020.05.10
[programmers] 프로그래머스 튜플(C++, Python)  (0) 2020.05.09
[programmers] 프로그래머스 크레인 인형뽑기 게임(C++, Python)  (0) 2020.05.08
    'Deprecated' 카테고리의 다른 글
    • [Baekjoon Online Judge] 백준 16287번 Parcel(Python)
    • [Baekjoon Online Judge] 백준 1644번 소수의 연속합(Python)
    • [programmers] 프로그래머스 불량 사용자(Python)
    • [programmers] 프로그래머스 튜플(C++, Python)
    HelloMinchan
    HelloMinchan
    Though you should not fear failure, You should do your very best to avoid it.

    티스토리툴바