알고리즘/프로그래머스

프로그래머스 위클리 챌린지 6주차 (자바)

reumiii 2021. 9. 21. 23:44

🍀 문제

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

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

입출력 예

[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]

 

 

 

코딩테스트 연습 - 6주차 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 6주차

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

programmers.co.kr

 

 

😊 나의 코드

import java.util.*;

class Solution {
	public int[] solution(int[] weights, String[] head2head) {
		int length = weights.length;
		List<Player> list = new ArrayList<Player>();
		for (int i = 0; i < length; i++) {
			Player player = new Player();
			player.setNum(i + 1);
			player.setWeight(weights[i]);

			int win = 0;
			int lose = 0;
			int overWin = 0;
			for (int j = 0; j < length; j++) {
				if (head2head[i].charAt(j) == 'W') {
					win++;
					if (weights[i] < weights[j]) {
						overWin++;
					}
				} else if (head2head[i].charAt(j) == 'L') {
					lose++;
				}
			}

			if ((win + lose) == 0) {
				player.setRate(0);
			} else {
				player.setRate((double) win / (win + lose));
			}
			player.setWinCnt(overWin);
			list.add(player);
		}

		Collections.sort(list, new Comparator<Player>() {
			public int compare(Player o1, Player o2) {
				if (o1.getRate() > o2.getRate()) {
					return -1;
				} else if (o1.getRate() < o2.getRate()) {
					return 1;
				} else if (o1.getWinCnt() > o2.getWinCnt()) {
					return -1;
				} else if (o1.getWinCnt() < o2.getWinCnt()) {
					return 1;
				} else if (o1.getWeight() > o2.getWeight()) {
					return -1;
				} else if (o1.getWeight() < o2.getWeight()) {
					return 1;
				} else if (o1.getNum() > o2.getNum()){
                    return 1;
                }else {
					return -1;
				}
			}
		});

		int[] answer = new int[list.size()];
		for (int i = 0; i < list.size(); i++) {
			answer[i] = list.get(i).getNum();
		}

		return answer;
	}
}

class Player {
	private int num;// 선수 번호
	private double rate;// 승률
	private int winCnt;// 자기보다 무거운 복서를 이긴 횟수
	private int weight;// 몸무게

	public void setNum(int num) {
		this.num = num;
	}

	public void setRate(double rate) {
		this.rate = rate;
	}

	public void setWinCnt(int winCnt) {
		this.winCnt = winCnt;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	public int getNum() {
		return num;
	}

	public double getRate() {
		return rate;
	}

	public int getWinCnt() {
		return winCnt;
	}

	public int getWeight() {
		return weight;
	}
}

ㅎㅎㅎ길다...ㅎㅎㅎ

비교할 조건(승률,무거운 복서를 이긴 횟수,몸무게,번호)이 여러 개여서

객체를 만들어서 정렬하는 방법을 써야겠다고 생각했다.

 

그래서 Player 객체에 비교 조건 데이터들을 저장할 수 있도록 만들었다.

각 선수들의 정보를 player 객체에 저장하고

이 player 객체들을 list에 저장한 후 Comparator을 사용해서 정렬하였다.

 

Comparator 정렬로 compare 메소드를 사용하면 커스텀하여 정렬하기 좋다.

compare(객체1, 객체2) 일때 return형이 양수이면 객체1과 객체2의 순서를 바꿔주고, 음수이면 순서를 바꾸지 않는다.

 

참고 👇

https://cchoimin.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%EC%A0%95%EB%A0%AC-Comparator

 

[JAVA] 객체 정렬 Comparator

* Comparator => 기본정렬기준 외에 다른 여러 기준으로 정렬하고자 할때 사용하는 클래스 단순 리스트를 정렬할때 보통 Collections.sort()를 사용한다 //오름차순 ArrayList list = new ArrayList (); list.add(..

cchoimin.tistory.com

 

 

 


근데 다른 사람들의 코드를 보니 굳이 객체를 만들지 않고 배열로도 여러 조건을 정렬할 수 있었다.

 

참고 👇

https://gre-eny.tistory.com/2

 

[Java] 2차원 배열 정렬 방법 Arrays.Sort(arr, Comparator)

1차원 배열 정렬 방법 오름차순으로 정렬이 된다. import java.util.Arrays; Arrays.sort(arr); 2차원 배열 정렬 방법 2차원 배열을 정렬하기 위해서는 Comparator를 Override하여 정렬 기준을 제시하면 된다. 예..

gre-eny.tistory.com