본문 바로가기

알고리즘/프로그래머스

[프로그래머스]Lv.3 숫자 게임

https://school.programmers.co.kr/learn/courses/30/lessons/12987

 

프로그래머스

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

programmers.co.kr


문제

  • xx 회사의 2xN명의 사원들은 N명씩 두 팀으로 나눠 숫자 게임을 하려고 합니다.
  • 두 개의 팀을 각각 A팀과 B팀이라고 하겠습니다.
  • 숫자 게임의 규칙은 다음과 같습니다.

  • 먼저 모든 사원이 무작위로 자연수를 하나씩 부여받습니다.
  • 각 사원은 딱 한 번씩 경기를 합니다.
  • 각 경기당 A팀에서 한 사원이, B팀에서 한 사원이 나와 서로의 수를 공개합니다.
  • 그때 숫자가 큰 쪽이 승리하게 되고, 승리한 사원이 속한 팀은 승점을 1점 얻게 됩니다.
  • 만약 숫자가 같다면 누구도 승점을 얻지 않습니다.

  • 전체 사원들은 우선 무작위로 자연수를 하나씩 부여받았습니다.
  • 그다음 A팀은 빠르게 출전순서를 정했고 자신들의 출전 순서를 B팀에게 공개해버렸습니다.
  • B팀은 그것을 보고 자신들의 최종 승점을 가장 높이는 방법으로 팀원들의 출전 순서를 정했습니다.
  • 이때의 B팀이 얻는 승점을 구해주세요.
  • A 팀원들이 부여받은 수가 출전 순서대로 나열되어있는 배열 A와 i번째 원소가 B팀의 i번 팀원이 부여받은 수를 의미하는 배열 B가 주어질 때, B 팀원들이 얻을 수 있는 최대 승점을 return 하도록 solution 함수를 완성해주세요.

제한사항

  • A와 B의 길이는 같습니다.
  • A와 B의 길이는 1 이상 100,000 이하입니다.
  • A와 B의 각 원소는 1 이상 1,000,000,000 이하의 자연수입니다.

입출력 예제

설계과정

1. A, B 배열을 오름차순으로 정렬한다.

 

2. A와 B 배열의 각 값들을 뒤에서부터 비교해서 B가 크면 answer 변수에 1을 더하고 B의 인덱스 변수를 1 빼서 다음을 비교한다.

 

3. 결과를 출력한다.

 

다른 사람의 풀이를 참조했다.

compareTo() 를 사용해서 풀어보려고 했으나 예시에 전부 만족하지 않아서 결국은 다른 사람의 풀이를 봤다.


풀이과정

1. A, B 배열을 오름차순으로 정렬한다.

  • 정렬은 기본적으로 Arrays.sort(); 를 사용한다. 다만 이번 문제에서는 N차원 배열을 정렬하기에 그에 맞게 사용한다.

2. i와 j 변수를 통해 A 배열과 B 배열의 인덱스를 설정한다.

  • i : A 배열의 인덱스
  • j : B 배열의 인덱스

3. B 배열의 값이 A 배열의 값보다 크면 결과 변수인 answer를 1 더하고 B 배열 인덱스인 j를 감소시킨다.

 

4. 결과를 출력한다.


답안소스

  • 프로그래머스
import java.util.*;

class Solution {
    public int solution(int[] A, int[] B) {
        int answer = 0;
        int loc = 0;
        
        Arrays.sort(A);
        Arrays.sort(B);
        
        for (int i = A.length - 1, j = B.length - 1; i >= 0; i--) {
            if(A[i] < B[j]) {
                answer++;
                j--;
            }
        }
        
        return answer;
    }
}