쵼쥬
쵼쥬의 개발공부 TIL
쵼쥬
전체 방문자
오늘
어제
  • 분류 전체보기 (276)
    • 코딩테스트 (192)
      • [알고리즘] 알고리즘 정리 (7)
      • [백준] 코딩테스트 연습 (126)
      • [프로그래머스] 코딩테스트 연습 (59)
    • Spring (71)
      • [인프런] 스프링 핵심 원리- 기본편 (9)
      • [인프런] 스프링 MVC 1 (6)
      • [인프런] 스프링 MVC 2 (4)
      • [인프런] 실전! 스프링 부트와 JPA 활용1 (7)
      • [인프런] 실전! 스프링 부트와 JPA 활용2 (5)
      • [인프런] 실전! 스프링 데이터 JPA (7)
      • [인프런] 실전! Querydsl (7)
      • JWT (5)
      • [인프런] Spring Cloud (17)
      • [인프런] Spring Batch (4)
    • Java (6)
      • [Java8] 모던인자바액션 (4)
      • [부스트코스] 웹 백엔드 (2)
      • [패스트캠퍼스] JAVA STREAM (0)
    • CS (6)
      • 디자인 패턴과 프로그래밍 패터다임 (2)
      • 네트워크 (4)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 위클리 챌린지
  • MVC
  • 알고리즘
  • 비트마스킹
  • 자바
  • 구현
  • 백준
  • 스프링
  • 부스트코스
  • 인프런
  • BFS
  • jpa
  • querydsl
  • 코딩테스트
  • 누적합
  • 타임리프
  • 백분
  • spring
  • Spring Data JPA
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쵼쥬

쵼쥬의 개발공부 TIL

코딩테스트/[프로그래머스] 코딩테스트 연습

복서 정렬하기

2021. 9. 6. 20:47

문제 설명

복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.

  1. 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
  2. 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
  3. 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
  4. 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.

제한사항

  • weights의 길이는 2 이상 1,000 이하입니다.
    • weights의 모든 값은 45 이상 150 이하의 정수입니다.
    • weights[i] 는 i+1번 복서의 몸무게(kg)를 의미합니다.
  • head2head의 길이는 weights의 길이와 같습니다.
    • head2head의 모든 문자열은 길이가 weights의 길이와 동일하며, 'N', 'W', 'L'로 이루어진 문자열입니다.
    • head2head[i] 는 i+1번 복서의 전적을 의미하며, head2head[i][j]는 i+1번 복서와 j+1번 복서의 매치 결과를 의미합니다.
      • 'N' (None)은 두 복서가 아직 붙어본 적이 없음을 의미합니다.
      • 'W' (Win)는 i+1번 복서가 j+1번 복서를 이겼음을 의미합니다.
      • 'L' (Lose)는 i+1번 복사가 j+1번 복서에게 졌음을 의미합니다.
    • 임의의 i에 대해서 head2head[i][i] 는 항상 'N'입니다. 자기 자신과 싸울 수는 없기 때문입니다.
    • 임의의 i, j에 대해서 head2head[i][j] = 'W' 이면, head2head[j][i] = 'L'입니다.
    • 임의의 i, j에 대해서 head2head[i][j] = 'L' 이면, head2head[j][i] = 'W'입니다.
    • 임의의 i, j에 대해서 head2head[i][j] = 'N' 이면, head2head[j][i] = 'N'입니다.

입출력 예

weights head2head result
[50,82,75,120] ["NLWL","WNLL","LWNW","WWLN"] [3,4,1,2]
[145,92,86] ["NLW","WNL","LWN"] [2,3,1]
[60,70,60] ["NNN","NNN","NNN"] [2,1,3]

입출력 예 설명

입출력 예 #1

  • 다음은 선수들의 정보를 나타낸 표입니다.

선수 번호vs 1번vs 2번vs 3번vs 4번승률자기보다 무거운 복서를 이긴 횟수몸무게

1번 - 패배 승리 패배 33.33% 1회 50kg
2번 승리 - 패배 패배 33.33% 0회 82kg
3번 패배 승리 - 승리 66.66% 2회 75kg
4번 승리 승리 패배 - 66.66% 0회 120kg
  • 본문에 서술된 우선순위를 따라 [3,4,1,2] 를 return 합니다.

입출력 예 #2

  • 다음은 선수들의 정보를 나타낸 표입니다.

선수 번호vs 1번vs 2번vs 3번승률자기보다 무거운 복서를 이긴 횟수몸무게

1번 - 패배 승리 50% 0회 145kg
2번 승리 - 패배 50% 1회 92kg
3번 패배 승리 - 50% 1회 86kg
  • 본문에 서술된 우선순위를 따라 [2,3,1] 을 return 합니다.

입출력 예 #3

  • 다음은 선수들의 정보를 나타낸 표입니다.

선수 번호vs 1번vs 2번vs 3번승률자기보다 무거운 복서를 이긴 횟수몸무게

1번 - - - 0% (무전적) 0회 60kg
2번 - - - 0% (무전적) 0회 70kg
3번 - - - 0% (무전적) 0회 60kg
  • 본문에 서술된 우선순위를 따라 [2,1,3] 을 return 합니다.

 


문제 풀이 생각

입출력 예제를 보고 복서마다 승률, 자기보다 무거운 복서를 이긴 횟수, 몸무게를 구해서 정렬하는 방법을 이용했다. 일단 배열안에 각 선수마다 필요한 정보를 저장하고 Arrays.sort를 람다식 comparator로 비교해서 정렬해주었다.

 

내 코드

import java.util.Arrays;

class Solution {
    public int[] solution(int[] weights, String[] head2head) {
        int[] answer = new int[weights.length];

        double[][] array = new double[weights.length][4];

        for (int i = 0; i < head2head.length; i++) {
            double winCount = 0;
            int count = 0;
            int total = 0;
            for (int j = 0; j < head2head[i].length(); j++) {
                if (head2head[i].charAt(j) != 'N')
                    total++;
                if (head2head[i].charAt(j) == 'W') {
                    winCount++;
                    if (weights[i] < weights[j]) {
                        count++;
                    }
                }
            }
            array[i][0] = i + 1;
            array[i][1] = (winCount != 0) ? winCount / total * 100000000 : 0;
            System.out.println(array[i][1]);
            array[i][2] = count;
            array[i][3] = weights[i];
        }


        Arrays.sort(array, (o1, o2) -> {
            if (o1[1] == o2[1] && o1[2] == o2[2] && o1[3] == o2[3])
                return (int) (o1[0] - o2[0]);
            else if (o1[1] == o2[1] && o1[2] == o2[2])
                return (int) (o2[3] - o1[3]);
            else if (o1[1] == o2[1])
                return (int) (o2[2] - o1[2]);
            else
                return (int) (o2[1] - o1[1]);
        });

        for (int i = 0; i < answer.length; i++) {
            answer[i] = (int) array[i][0];
        }

        return answer;
    }
}

 

다른 사람 풀이

import java.util.*;
class Solution {
    public int[] solution(int[] weights, String[] head2head) {
        int len = weights.length;
        int[][] rank = new int[len][4];
        for(int i = 0; i < len; i++) {
            int w = weights[i], cnt = 0, win = 0, over = 0;
            for(int j = 0; j < len; j++) {
                char c = head2head[i].charAt(j);
                cnt += c == 'N' ? 0 : 1;
                win += c == 'W' ? 1 : 0;
                over += c == 'W' && weights[i] < weights[j] ? 1 : 0;
            }
            rank[i][0] = i + 1;
            rank[i][1] = (int)((double)win / cnt * 10000000);
            rank[i][2] = over;
            rank[i][3] = weights[i];
        }
        Arrays.sort(rank, (a, b) -> {
            if(a[1] != b[1]) return b[1] - a[1];
            if(a[2] != b[2]) return b[2] - a[2];
            if(a[3] != b[3]) return b[3] - a[3];
            return a[0] - b[0];
        });
        int[] answer = new int[len];
        for(int i = 0; i < len; i++) answer[i] = (int)rank[i][0];
        return answer;
    }
}

 

이 풀이 방법도 내 풀이와 방법은 같은데 좀 더 간결하게 나타낸 코드라서 가져와 보았다. comparator을 정의할 때도 굳이 전부 다 비교하지 않고 하나씩만 비교해서 풀이했다. return으로 나오니까 else도 필요없고 보기 좋게 짠 코드라고 생각된다.

'코딩테스트 > [프로그래머스] 코딩테스트 연습' 카테고리의 다른 글

문자열 압축  (0) 2021.09.07
괄호 변환  (0) 2021.09.07
모음 사전  (0) 2021.09.02
퍼즐 조각 채우기  (0) 2021.08.26
직업군 추천하기  (0) 2021.08.23
    '코딩테스트/[프로그래머스] 코딩테스트 연습' 카테고리의 다른 글
    • 문자열 압축
    • 괄호 변환
    • 모음 사전
    • 퍼즐 조각 채우기
    쵼쥬
    쵼쥬

    티스토리툴바