알고리즘/프로그래머스

[프로그래머스 131130] 혼자 놀기의 달인 C#

겜도리도리 2023. 11. 7. 18:18
반응형

문제

프로그래머스 131130 혼자 놀기의 달인 C#

 

프로그래머스

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

programmers.co.kr

풀이

문제 설명이 너무 장황하게 되어 있어서... 처음에 독해가 힘들었는데

그냥 간단히 말하면 카드에 적혀있는 숫자를 인덱스로 생각해서 루프를 돌고,

루프 중 제일 긴 것과 그 다음으로 긴 것의 곱만 구하면 되는 문제이다.

루프를 돌 때 어디를 출발지점으로 지정하느냐가 중요할 거 같았는데

생각해보니 카드 숫자는 중복이 없으므로 무조건 순회하는 루프를 만들게 된다.

(즉, 루프의 어디서든 시작해도 길이가 항상 똑같음)

그래서 방문 체크를 하는 리스트 visited를 초기화할 필요는 없었고

이미 방문했다면 시작 지점만 다른 같은 루프가 생성되므로 탐색할 필요가 없었다.

소스 코드

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
35
36
37
38
39
40
41
using System;
using System.Linq;
using System.Collections.Generic;
 
public class Solution
{
    public int solution(int[] cards)
    {
        List<bool> visited = new List<bool>(new bool[cards.Length]);       
        List<int> results = new List<int>();
        
        foreach (var card in cards)
        {
            if (visited[card - 1])
                continue;
            
            int cur = card - 1;
            int cnt = 1;
            visited[cur] = true;
            
            while(true)
            {
                int next = cards[cur] - 1;
                if (visited[next])
                    break;
                
                visited[next] = true;
                cnt++;
                cur = next;
            }
            
            results.Add(cnt);
        }
        
        if (results.Count <= 1)
            return 0;
        
        results = results.OrderByDescending(i => i).ToList();
        return results[0* results[1];
    }
}
cs
반응형