주녘공부일지

[프로그래머스 C#] Lv.3 순위 본문

CodingTest/Programmers Lv.3

[프로그래머스 C#] Lv.3 순위

주녘 2024. 2. 7. 18:17

https://school.programmers.co.kr/learn/courses/30/lessons/49191?language=csharp

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

주어진 조건에 따라 순위를 알 수 있는 선수의 수를 구하는 문제

- 주어진 승패유무를 2차원 bool타입 배열에 입력 [이긴 선수, 진 선수]에 대한 정보 입력

- 모든 선수를 순회하며 내가 이긴 선수와 진 선수에 대한 정보를 입력

 -> 내가 A에게 지고 B에게 이겼다면, A는 B를 무조건 이김

- 나를 제외한 모든 선수와의 승패유무를 알면 순위를 알 수 있음

 

주석 참조

    using System;

    public class Solution
    {
        public int solution(int n, int[,] results)
        {
            int answer = 0;

            // [이긴 선수, 진 선수] 의 대한 정보가 있으면 true
            var boolArrays = new bool[n + 1, n + 1];

            // 주어진 기본 정보 세팅
            for (int i = 0; i < results.GetLength(0); i++)
                boolArrays[results[i, 0], results[i, 1]] = true;

            // 이어지는 정보 세팅
            for (int i = 1; i <= n; i++) // 나
            {
                for (int win = 1; win <= n; win++) // 나를 이긴 선수
                {
                    for (int lose = 1; lose <= n; lose++) // 나에게 진 선수
                    {
                        // 나를 이긴 선수와 내가 이긴 선수에 대한 정보가 있다면 두 선수의 승패정보 갱신
                        if (boolArrays[win, i] && boolArrays[i, lose])
                        {
                            boolArrays[win, lose] = true;
                        }
                    }
                }
            }

            for (int i = 1; i <= n; i++)
            {
                int count = 0;
                for (int j = 1; j <= n; j++)
                {
                    // i번째 선수와 j번째 선수 사이의 승패 유무를 알 수 있다면
                    if (boolArrays[i, j] || boolArrays[j, i])
                        count++;
                }

                // 모든 선수와의 승패유무가 존재한다면
                if (count + 1 == n)
                    answer++;
            }

            return answer;
        }
    }