다희의 코딩 성장일기

[프로그래머스] level1. 위클리 챌린지 6주차_복서 정렬하기 (자바 JAVA) 본문

Algorithm/프로그래머스

[프로그래머스] level1. 위클리 챌린지 6주차_복서 정렬하기 (자바 JAVA)

ilmiodiario 2021. 9. 14. 21:57

[ 문제 ]  [프로그래머스] level1. 위클리 챌린지  6주차_복서 정렬하기 (자바 JAVA)

 

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/85002?language=java 

 

코딩테스트 연습 - 6주차_복서 정렬하기

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

programmers.co.kr


# 접근 방법 및 풀이 

 

  • 문제 제목에 적힌대로 정렬문제다. 
  • boxer라는 클래스를 만들어 정렬에 필요한 변수들을 선언해주었다.
  • num = 번호, cnt = 자신보다 몸무게가 무거운 복서를 이긴 횟수, weight = 몸무게, rate = 승률
  • 처음에 승률 계산할때 붙어본적 없는 선수와의 대결도 총 대결수로 쳐야하나? 헷갈렸는데 그럴 필요없다.
  • 승률 = (이긴횟수) / (총 대결 수 ) * 100 을 해주면 된다.
  • 정렬은 Comparable을 이용해서 정렬해주었고, 오름차순일 경우 내림차순일 경우를 잘 숙지하고 있다면 쉽게 구현할 수 있다.
  • 문제 정렬 조건에 1,2,3은 숫자가 큰 내림차순이고 4만 작은번호가 앞쪽으로 가기 때문에 오름차순으로 정렬해주면 된다.
  • 근데 문제 풀었더니 5번이 틀렸다..? 역시 rate구할때 0 / 0 일 경우 오류나기 때문에 실패뜬다. 
  • double형태의 0/0 하면 NaN 숫자가 아닌 필드값 이 뜨니 조심하자.

# 주의할 점 

 

  • 승률 구할 경우  0 / 0 <- 이 경우 오류남. 테케 5번이 틀리면 이부분 수정할 것!

 

JAVA 코드
import java.util.*;
class Solution {
	static class boxer implements Comparable<boxer> {
		int num, cnt, weight;
		double rate;

		public boxer(int num, double rate, int cnt, int weight) {
			this.num = num;
			this.rate = rate;
			this.cnt = cnt;
			this.weight = weight;
		}

		@Override
		public int compareTo(boxer o) {
			if (Double.compare(o.rate, this.rate) == 0) {
				if (o.cnt == this.cnt) {
					if (o.weight == this.weight)
						return this.weight - o.weight;
					return o.weight - this.weight;
				}
				return o.cnt - this.cnt;
			}
			return Double.compare(o.rate, this.rate);
		}
	}

	public int[] solution(int[] weights, String[] head2head) {
		int[] answer = new int[weights.length];
		List<boxer> list = new ArrayList<>();
		for (int i = 0; i < weights.length; i++) {
			String arr[] = head2head[i].split("");
			double sum = 0;
			double win = 0;
			int cnt = 0;
			for (int j = 0; j < arr.length; j++) {
				if (arr[j].equals("W")) {
					if (weights[j] > weights[i])
						cnt++;
					win++;
				}
				if (arr[j].equals("N"))
					continue;
				sum++;
			}
            double rate = ((sum==0)&&(win==0))? 0 : (win / sum) * 100; // 0/0했을경우
			list.add(new boxer(i, rate, cnt, weights[i]));
		}
		Collections.sort(list);
		for (int i = 0; i < list.size(); i++) {
			answer[i] = list.get(i).num + 1;
		}
		return answer;
	}
}

 

 

 

REVIEW

Comments