실패율

2022. 6. 16. 17:02·코딩테스트/프로그래머스
반응형

아래는 문제 링크입니다.

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

아래는 먼저 첫 번째 풀이다.

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int [N];
        double denominator = stages.length;
        Map<Integer, Integer> map = new HashMap<>();
        Map<Integer, Double> result = new HashMap<>();

        for (int i = 1; i <= N +1; i++) {
            map.put(i,0);
        }
        for (int stage : stages) { //스테이지와 실패한 사람들을 넣는다.
            map.put(stage, map.getOrDefault(stage, 0) + 1);
        }

        for (Integer key : map.keySet()) {
            int person = map.get(key); //실패한 사람들
            if(denominator != 0)result.put(key, person / denominator ); //스테이지당 실패율을 넣는다.
            else result.put(key,0D);
            denominator -= person;

        }

        Set<Map.Entry<Integer, Double>> entries = result.entrySet();

        List<Map.Entry<Integer, Double>> list = new ArrayList<>(result.entrySet());
        //list.sort(Map.Entry.comparingByValue());// value에 의한 오름차순


        List<Map.Entry<Integer, Double>> collect = result.entrySet().stream()
                .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
                .collect(Collectors.toList());

        int i = 0;
        for (Map.Entry<Integer, Double> m : collect) {
            if(m.getKey() != N+1){
                answer[i++] = m.getKey();
            }
        }

        return answer;
    }
}

마지막에 정렬을 스트림을 사용해서 했는데,

뭔가 스스로 판단하기에는 코딩테스트는 효율을 중요시 여긴다고 생각해 스트림을 사용하면 안된다고 생각해서 다른 풀이를 생각해보았다.

import java.util.*;

class Solution {
    
  class Stage implements Comparable<Stage> {
        public int id;
        public double failure;

        public Stage(int id, double failure) {
            this.id = id;
            this.failure = failure;
        }

        @Override
        public int compareTo(Stage o) {
            if (failure < o.failure ) {
                return -1;
            }
            if (failure > o.failure ) {
                return 1;
            }
            return 0;
        }
    }
    
    public int[] solution(int N, int[] stages) {
        int[] answer = new int [N];
        double denominator = stages.length;
        Map<Integer, Integer> map = new HashMap<>();
        ArrayList<Stage> result = new ArrayList<>();

        for (int i = 1; i <= N; i++) {
            if(i != N + 1)map.put(i, 0);
        }

        for (int stage : stages) { //스테이지와 실패한 사람들을 넣는다.
            if(stage != N + 1) map.put(stage, map.getOrDefault(stage, 0) + 1);
        }

        for (Integer key : map.keySet()) {
            int person = map.get(key); //실패한 사람들
            if(denominator != 0) result.add(new Stage (key, person / denominator) ); //스테이지당 실패율을 넣는다.
            else result.add(new Stage (key, 0D));
            denominator -= person;
        }

        Collections.sort(result, Collections.reverseOrder());

        for(int i = 0; i < N; i++){
            answer[i] = result.get(i).id;
        }
        return answer;
    }
}

 

다른 사람들의 풀이에 들어가서 정렬에 대한 힌트를 얻었다.

처음에는 모든 스테이지를 클리어한 사람을 고려하지 않아 오류가 발생했었다.

이후 이에 대한 조건을 추가했더니 문제를 해결할 수 있었다.

자바에서 정렬 문제가 나오면 Comparable 인터페이스를 제일 떠올릴 수 있게 노력하자.

반응형
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • 가장 큰 수
  • 더 맵게
  • [1차] 다트 게임
  • 신고 결과 받기
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    자바
    AWS
    인덱스
    운영체제
    spring boot
    spring
    innodb
    데이터베이스
    도커
    리눅스
    JPA
    스프링
    AOP
    코딩 #개발자 #노마드북클럽 #노개북
    container
    docker
    SQL
    객체지향
    프록시
    트랜잭션
    Java
    스프링 부트
    mysql
    ORM
    spring mvc
    redis
    컨테이너
    토비의 스프링
    객체
    test
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
실패율
상단으로

티스토리툴바