새벽까지

유니크 - 5533

 

5533번: 유니크

첫째 줄에 참가자의 수 N이 주어진다. (2 ≤ N ≤ 200) 둘째 줄부터 N개 줄에는 각 플레이어가 1번째, 2번째, 3번째 게임에서 쓴 수가 공백으로 구분되어 주어진다.

www.acmicpc.net

분류

사칙연산, 구현, 수학

문제 설명

상근이와 친구들은 MT에 가서 아래 설명과 같이 재미있는 게임을 할 것이다.

각 플레이어는 1이상 100 이하의 정수를 카드에 적어 제출한다. 각 플레이어는 자신과 같은 수를 쓴 사람이 없다면, 자신이 쓴 수와 같은 점수를 얻는다. 만약, 같은 수를 쓴 다른 사람이 있는 경우에는 점수를 얻을 수 없다.

상근이와 친구들은 이 게임을 3번 했다. 각 플레이어가 각각 쓴 수가 주어졌을 때, 3번 게임에서 얻은 총 점수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 참가자의 수 N이 주어진다. (2 ≤ N ≤ 200) 둘째 줄부터 N개 줄에는 각 플레이어가 1번째, 2번째, 3번째 게임에서 쓴 수가 공백으로 구분되어 주어진다.

출력

각 플레이어가 3번의 게임에서 얻은 총 점수를 입력으로 주어진 순서대로 출력한다.


🙋 문제 해석

  • N만큼 사람이 주어진다.
  • 고정된 세 개의 숫자를 고른다.
  • 고정된 숫자가 M이라고 하면 [N][M] 행렬을 입력받는다.
  • [0][M] = [1][M] 라면 점수는 0이다.

하지만 여기선 N의 숫자들을 비교해야하기 때문에 사람별로 구분하게 되면, 복잡해진다. 그렇기 때문에 고정된 숫자들끼리의 리스트들을 넣어서 비교했다.

 

 

예를들어 N=4 라면

참가자 1= [1,2,3]

참가자 2=[5,5,5]

참가자 3=[6,7,8]

참가자 4=[9,9,9]

참가별 점수 = [[1,2,3].[5,5,5],[6,7,8],[9,9,9]]

->

첫번째 게임 = [1,5,6,9]

두번째 게임 = [2,5,7,9]

세번째 게임 = [3,5,8,9]

게임별 점수 = [1,5,6,9],[2,5,7,9],[3,5,8,9]

로 바꾸었다.


🔑 Solution 🔑

N = int(input())
lis = [[],[],[]]
score = [0] * N
for i in range(N):
    T = list(map(int,input().split()))
    lis[0].append(T[0])
    lis[1].append(T[1])
    lis[2].append(T[2])
for i in range(3):
    for j in range(N):
        if lis[i].count(lis[i][j]) > 1 :
            score[j] += 0
        else :
            score[j] += lis[i][j]
for i in score:
    print(i)
    ```

🕐 시간 복잡도

  • N + 3N
  • 4N - > O(N)

for문이 많아 보이지만 상수값들이 많다.


배열 초기화와 이중배열에 감이 안오는 사람이나 구현, 문제해결능력을 키우려는 사람이 여러번 풀면 좋은 문제인거 같다

 

🙇

profile

새벽까지

@GoS

좋아요❤️ 구독👍🏻 감사합니다!