본문 바로가기
with my rubber duck/codingTest

[프로그래머스] 실패율 풀어보기^^~!

by stilinski 2022. 6. 9.
728x90

어떻게든 푼 version

푼 로직

1. 스테이지 길이(N)만큼 반복문 돌리기

2. 돌리면서 스테이지 번호가 stages배열에 사용가자 머물고 있는 스테이지가 몇 개인지 체크

3. 반복문이 돌아갈수록 스테이지 번호가 담긴 리스트의 길이를 줄여서 실패율 측정

4. 스테이지번호와 실패율을 어레이 리스트에 저장

5. 실패율에 따라 내림차순으로 정렬

6. 정렬된 리스트에서 인덱스 번호만 뽑아서 answer배열로 리턴

 

	static class Solution {

		static int i = 0;

		public Solution() {
			// TODO Auto-generated constructor stub
		}

		public static int[] solution(int N, int[] stages) {
		
			// 스테이지의 길이N만큼 반복문 돌리기
			
			ArrayList<Integer> leftstages = (ArrayList<Integer>) Arrays.stream(stages).boxed()
					.collect(Collectors.toList());
			int cnt=0;
			ArrayList<Double[]> failrate = new ArrayList<>();
			for (i = 1; i <= N; i++) {
				for (int j = 0; j < leftstages.size(); j++) {
					if (i == leftstages.get(j)) {
						cnt++;
					}
				}
				// 1번 실패율 = 1개수/stages.length
				// 2번 실패율 = 2개수/stages.length-1개수
				Double[] arr = {Double.valueOf(i), Double.valueOf(cnt) / Double.valueOf(leftstages.size())};
				failrate.add(arr);
				leftstages.removeIf(e -> e == i);
				cnt = 0;
			
			}
			
			
			Collections.sort(failrate, ((o1, o2) -> Double.compare(o2[1], o1[1])));
			
			int[] answer = new int[failrate.size()];
			
			for(int i = 0;i<failrate.size();i++) {
				answer[i]=(int)failrate.get(i)[0].intValue();
				
				
			}
			
			return answer;
		}
       }

 

젠좡

알고 보니 그 실패율이 0일 때 0을 입력하는 로직 안 씀

근데 어차피 저 코드 자체도 너무 복작시럽고 별론것같아서(특히 캐스팅을 계속 하는 부분...) 다른 사람 꺼 약간 참조함

맨처음엔 hashmap으로 했는데 음 잘 안됐음.

 

[프로그래머스] 실패율 (JAVA/자바) - 2019 카카오 기출

프로그래머스>코딩테스트 연습>2019 KAKAO BLIND RECRUITMENT>실패율 - https://programmers.co.kr/learn/courses/30/lessons/42889실패율이 큰 stage 순서대로 출력하는 문제이다.실패율 = 스테이지

velog.io


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

import java.util.stream.Collectors;

public class test {
	
	static class FailRate{
		int indexnum;
		double rate;
		
		public FailRate() {
			// TODO Auto-generated constructor stub
		}
		
		public FailRate(int indexnum, double rate) {
			super();
			this.indexnum = indexnum;
			this.rate = rate;
		}
		
	}
	
	static class Solution {

		static int i = 0;

		public Solution() {
			// TODO Auto-generated constructor stub
		}

		public static int[] solution(int N, int[] stages) {
		
			ArrayList<Integer> leftstages = (ArrayList<Integer>) Arrays.stream(stages).boxed()
					.collect(Collectors.toList());
			
			// 스테이지마다 머무르는 사용자 수 체크를 위한
			int cnt=0;
			// 스테이지의 길이N만큼 반복문 돌리기
			ArrayList<FailRate> failrate = new ArrayList<>();
			for (i = 1; i <= N; i++) {
				for (int j = 0; j < leftstages.size(); j++) {
					if (i == leftstages.get(j)) {
						//해당 스테이지의 번호가 stages 배열에 있으면 1씩 증가
						cnt++;
					}
				}
				if(cnt==0) {
					//stages배열에 해당 스테이지에 머무르고있는 사용자가 없을때 실패율 0입력
					failrate.add(new FailRate(i,0));
				}else {
					failrate.add(new FailRate(i,(double)cnt/leftstages.size()));
					cnt = 0;
				}
				// 1번 실패율 = 1개수/stages.length
				// 2번 실패율 = 2개수/stages.length-1개수
				//한번 돌떄마다 해당 값의 리스트 1씩 삭제
				leftstages.removeIf(e -> e == i);
			
			}
			
			//failrate들을 실패율기준 내림차순으로 정렬
			Collections.sort(failrate, ((o1, o2) -> Double.compare(o2.rate, o1.rate)));
			
			int[] answer = new int[failrate.size()];
			
			//정렬된 failrate에서 인덱스 번호(스테이지 번호)만 뽑아서 answer로리턴
			for(int k = 0;k<failrate.size();k++) {
				answer[k]=failrate.get(k).indexnum;
						
			}
			
			return answer;
		}
	}

	public static void main(String[] args) {

		int[] stages = { 2, 1, 2, 6, 2, 4, 3, 3 };
		int N = 5;
		
		int[] rate = Solution.solution(N, stages);
		
		Arrays.stream(rate).forEach(System.out::println);
		

		
	}

}

큰 로직은 같다

쓰고보니 많이 다른 건 없군..

사실 귀찮아..ㅇㅅㅇ...ㅋ이것만 2일째라고

근데 클래스를 쓸 생각을 전혀 못했다.. 정말 전혀..ㅋㅋㅋㅋ

정말 깔끔하다

한수 배웠다

굿굿!~ 인터넷 세상 증말 좋군

728x90

댓글