[ハッカーランキング]Journey to the Moon


質問リンク


https://www.hackerrank.com/challenges/journey-to-the-moon/problem

Problem


The member states of the UN are planning to send people to the moon. They want them to be from different countries. You will be given a list of pairs of astronaut ID's. Each pair is made of astronauts from the same country. Determine how many pairs of astronauts from different countries they can choose from.
国連加盟国は月に人を派遣する計画だ.彼らは彼らが異なる国から来ることを望んでいる.宇宙飛行士IDのリストがあります.どのペアも同じ国からの宇宙飛行士で構成されています.他の国の何組かの宇宙飛行士を選ぶことができることを決めてください.
問題はパパゴ翻訳です.

Example


n = 4
astronaut = [1, 2], [2, 3]
4人の宇宙飛行士がいて、番号は0、1、2、3です.[0]このような国、[1,2,3]はこのような国です.
[0,1],[0,2],[0,3]と同じ組み合わせで宇宙に入ることができます.

エラーの回答



私のように問題を解く人がいないことを望んでいます.

import math
import os
import random
import re
import sys
from itertools import combinations

def journeyToMoon(n, astronaut):
	# 같은 국가가 없는 경우 -1
    k = dict()
    for _ in range(0, n):
        k[_] = -1

    # 같은 국가가 있는 지 확인
    # 다음 작업을 하였을 때 나오는 결과물
    # k = {0: -1, 1: 0, 2: 0, 3: 0}
    for i, a in enumerate(astronaut):
        if k[a[0]] == -1 and k[a[1]] != -1:
            k[a[0]] = k[a[1]]
        elif k[a[0]] != -1 and k[a[1]] == -1:
            k[a[1]] = k[a[0]]
        elif k[a[0]] == -1 and k[a[1]] == -1:
            k[a[0]], k[a[1]] = i, i
        # 각각이 같은 국가가 있는데, 각각의 수가 다른 경우
        # 더 작은 수로 국가를 통일하기 위해서 하는 작업
        else:
            little_min = 0
            _min = 0
            if k[a[0]] > k[a[1]]:
                little_min = k[a[0]]
                _min = k[a[1]]
            else:
                little_min = k[a[1]]
                _min = k[a[0]]
   
            for i in range(n):
                if k[i] == little_min:
                    k[i] = _min
     
    # 다음 작업을 하였을 때 나오는 결과물
    # nation:  {-1: [0], 0: [1, 2, 3]}
    nation = dict()
    for _ in k:
        if not k[_] in nation:
            nation[k[_]] = list()
        nation[k[_]].append(_)
	
    # 국가번호만 추출(combinations 모듈을 사용하기 위해서 하는 작업)
    # 다음 작업을 하였을 때 나오는 결과물
    # nation_num:  [-1, 0]
    nation_num = list()    
    for n in nation:
        nation_num.append(n)

    # 국가간 나올 수 있는 조합 구하기
    # 다음 작업을 하였을 때 나오는 결과물
    # nation_combination:  [(-1, 0)]
    nation_combination = list(combinations(nation_num, 2))
   
   
    # 정답 구하기
    answer = 0
    
    for _ in nation_combination:
        answer += len(nation[_[0]]) * len(nation[_[1]])
	
    # nation[-1]에 속해있는 astronaut는 같은 국가가 아니기 때문에 각 astronaut을 다른 국가로 보고 nation[-1]의 조합을 구한다.
    if -1 in nation:
        answer += len(list(combinations(nation[-1], 2)))
        
    return answer
10個のhackosを使用して2つのtestcaseを調べた.
testcase 8を調べると、10000人の宇宙飛行士がいることがわかり、答えは正しいに違いない.
でも间违っているのは、あまり効率的に编んでいないかららしい.
今度頭がもっとはっきりしたら、その時になったらリラックスしなければなりません.