C# 숫자 게임 - 정렬 / 프로그래머스 [Lv.3]

출처: 프로그래머스 코딩 테스트 연습
https://school.programmers.co.kr/learn/courses/30/lessons/12987

 

 

나의 코드

public int solution(int[] A, int[] B) 
{
    int answer = 0;
    var listB = B.OrderByDescending(o => o).ToList();
    foreach(int cur in A.OrderByDescending(o => o))
    {
        if(cur >= listB[answer]) continue; // B의 현재 최대값이 이길 수 있을 때 까지 넘김
        ++answer;
    }
    return answer;
}

비기거나 지는 경우 점수가 변하지 않는다 -> 이기는 경우만 생각하면 된다.

출전 순서에 따라서 점수가 변하지 않는다 -> 몇 번 이기는지만 생각하면 된다.

 

문제에 '자신들의 출전 순서를 B팀에게 공개해버렸습니다' 라는 문구가 있지만 풀이에 영향을 주지 않고

A팀이 어떤 숫자를 가지고 있는지만 중요하다.

 

A팀과 B팀을 높은 차순으로 정렬한 다음 하나씩 꺼내면서 B팀이 이길 수 있는 경우에는 승점을 1점 올리면 끝. 

 

다른 사람 코드

public int solution(int[] A, int[] B) 
{
    var enumeratorOfA = A.OrderByDescending(d => d).GetEnumerator();
    var enumeratorOfB = B.OrderByDescending(d => d).GetEnumerator();
    int result = 0;

    if (!enumeratorOfB.MoveNext())
        return result;

    while (enumeratorOfA.MoveNext())
    {
        if ((int)enumeratorOfA.Current < (int)enumeratorOfB.Current)
        {
            enumeratorOfB.MoveNext();
            result++;
        }
    }

    return result;
}

enumerator를 적극 사용한 예시.

enumerator는 MoveNext()를 호출하기 전까지 current 값이 존재하지 않는다. (최초 초기화가 필요!)

선언하자마자 MoveNext() 해주는 습관을 들이자.

자주 사용안하면 까먹기 쉬우니 주의.

댓글

Designed by JB FACTORY