[Coding Test] (2) 이전 문제 다시 풀어보기

2025. 2. 13. 14:36·개발/모바일
반응형

블로그는 비영리로 운영되고 있습니다.

차후 저작권 문제가 발생할 시, 해당 글은 삭제하도록 하겠습니다.


 

class ExampleUnitTest {
    fun solution(N: Int, stages: IntArray): IntArray {
        // 결과를 담을 리스트 생성
        val result = ArrayList<Int>()

        // 각 스테이지별 실패율을 저장할 맵 생성
        val failMap = mutableMapOf<Int, Double>()

        // 각 스테이지별로 실패율 계산
        // 1부터 N(마지막 스테이지)까지 반복
        for (i in 1..N) {
            // 스테이지에 도달한 사람 수
            var tryCount = 0

            // 스테이지를 클리어 못한 사람 수
            var failCount = 0

            // stages 배열을 돌면서 도전자 수와 실패자 수 계산
            for (j in stages) {
                if (j >= i) {    // i스테이지에 도달했으면
                    tryCount++
                }
                if (j == i) {    // i스테이지를 클리어하지 못했으면
                    failCount++
                }
            }

            // 실패율 계산해서 맵에 저장
            if (tryCount == 0) {
                failMap[i] = 0.0
            } else {
                failMap[i] = failCount.toDouble() / tryCount
            }
        }

        // 실패율 높은 순으로 스테이지 번호 정렬
        while (failMap.isNotEmpty()) {
            var maxRate = -1.0
            var maxStage = 0

            // 현재 남은 스테이지 중 가장 실패율 높은 스테이지 찾기
            for ((stage, rate) in failMap) {
                if (rate > maxRate) {
                    maxRate = rate
                    maxStage = stage
                } else if (rate == maxRate && stage < maxStage) {
                    // 실패율이 같다면 작은 번호가 우선
                    maxStage = stage
                }
            }

            // 찾은 스테이지를 결과에 추가하고 맵에서 제거
            result.add(maxStage)
            failMap.remove(maxStage)
        }

        return result.toIntArray()
    }

    @Test
    fun main() {
        // 테스트
        val n1 = 5
        val stages1 = intArrayOf(2, 1, 2, 6, 2, 4, 3, 3)

        // 3, 4, 2, 1, 5
        println("결과1: ${solution(n1, stages1).contentToString()}")

        val n2 = 4
        val stages2 = intArrayOf(4, 4, 4, 4, 4)

        // 4, 1, 2, 3
        println("결과2: ${solution(n2, stages2).contentToString()}")
    }
}
결과1: [3, 4, 2, 1, 5]
결과2: [4, 1, 2, 3]

 

위에는 저번 코딩테스트에서 풀었던 문제입니다. 딱 기본적인 조건문, 반복문만 사용해서 풀었습니다.

먼저 문제를 풀기위해서 반드시 필요한 값을 알아보겠습니다.

  • 전체 스테이지 갯수
  • 사용자들이 현재 도전 중인 스테이지 배열
  • 스테이지에 도달한 플에이어 수 (도전자 수)
  • 스테이지를 클리어하지 못한 플레이어 수 (실패자 수)
  • 실패율: 실패자 수 / 도전자 수

 

1. HashMap 사용

class ExampleUnitTest {
    fun newSolution(N: Int, stages: IntArray): IntArray {
        // 스테이지별 실패자 수
        val stageFailCount: IntArray = IntArray(N + 2) { 0 }
        for(failStage in stages) {
            stageFailCount[failStage]++
        }

        // 총 도전자 수
        var challengers = stages.size

        // 스테이지별 도전자 수
        val stageChallengerMap: HashMap<Int, Int> = hashMapOf()
        for(challengerStage in 1..N) {
            challengers -= stageFailCount[challengerStage]
            stageChallengerMap[challengerStage] = challengers
        }

        // 각 스테이지별 실패율 계산
        // 실패자 수 / 도전자 수
        val stageRateMap: HashMap<Int, Double> = hashMapOf()
        for(stageKey in stageChallengerMap.keys) {
            stageRateMap[stageKey] = stageFailCount[stageKey].toDouble() / stageChallengerMap[stageKey]!!.toDouble()
        }

        // 실패율이 높은 순서대로 정렬
        val sortRateMap = stageRateMap.toList().sortedByDescending { (stage, rate) -> rate }.toMap()

        return sortRateMap.keys.toIntArray()
    }

    @Test
    fun main() {
        // 테스트
        val n1 = 5
        val stages1 = intArrayOf(2, 1, 2, 6, 2, 4, 3, 3)

        // 3, 4, 2, 1, 5
        println("결과1: ${newSolution(n1, stages1).contentToString()}")

        val n2 = 4
        val stages2 = intArrayOf(4, 4, 4, 4, 4)

        // 4, 1, 2, 3
        println("결과2: ${newSolution(n2, stages2).contentToString()}")
    }
}

 

HashMap을 사용해서 풀어봤습니다. 막상 풀고보니, 도전자 수와 실패자 수를 따로 변수에 담을 필요가 없을 것 같아서 아래처럼 변경했습니다.

 

2. 실패율 계산 통합

fun newSolution2(N: Int, stages: IntArray): IntArray {
        // 스테이지별 실패자 수
        val stageFailCount: IntArray = IntArray(N + 2) { 0 }
        for(failStage in stages) {
            stageFailCount[failStage]++
        }

        // 총 도전자 수
        var challengers = stages.size

        // 스테이지별 실패율
        val stageRateMap: HashMap<Int, Double> = hashMapOf()
        for(stage in 1..N) {
            challengers -= stageFailCount[stage]
            stageRateMap[stage] = stageFailCount[stage].toDouble() / challengers.toDouble()
        }

        return stageRateMap
            .toList()
            .sortedByDescending { it.second }
            .toMap()
            .keys
            .toIntArray()
    }

 

 

3. ArrayList<Pair> 사용

fun newSolution3(N: Int, stages: IntArray): IntArray {
        // 스테이지별 실패자 수
        val stageFailCount: IntArray = IntArray(N + 2) { 0 }
        for(failStage in stages) {
            stageFailCount[failStage]++
        }

        // 총 도전자 수
        var challengers = stages.size

        // 스테이지별 실패율
        val stageRatePair: ArrayList<Pair<Int, Double>> = ArrayList()
        for(stage in 1..N) {
            challengers -= stageFailCount[stage]
            stageRatePair.add(Pair(stage, stageFailCount[stage].toDouble() / challengers.toDouble()))
        }

        return stageRatePair
            .sortedByDescending { it.second }
            .map { it.first }
            .toIntArray()
    }

 


이번 포스트는 여기서 마치겠습니다!

다음 포스트에서 프로그래머스 Lv.1을 다시 도전해보겠습니다~!

반응형
저작자표시 비영리 변경금지 (새창열림)

'개발 > 모바일' 카테고리의 다른 글

[Coding Test] (6) 프로그래머스 스킬체크 Lv.1  (0) 2025.02.17
[Coding Test] (5) 프로그래머스 스킬체크 Lv.1  (0) 2025.02.17
[Coding Test] (4) 프로그래머스 스킬체크 Lv.1  (0) 2025.02.17
[Coding Test] (3) 프로그래머스 스킬체크 Lv.1  (0) 2025.02.17
[Kotlin] 문법 - 반복문 & 배열 & 해시 & 정렬  (0) 2025.02.13
[Coding Test] (1) 프로그래머스 스킬체크 Lv.1  (0) 2025.02.12
[Kotlin] Flutter로 비교하는 Kotlin & Compose 지식  (0) 2025.02.11
[Kotlin Project] 초성마켓 - 프로젝트 전체적인 구조  (0) 2025.02.11
'개발/모바일' 카테고리의 다른 글
  • [Coding Test] (4) 프로그래머스 스킬체크 Lv.1
  • [Coding Test] (3) 프로그래머스 스킬체크 Lv.1
  • [Kotlin] 문법 - 반복문 & 배열 & 해시 & 정렬
  • [Coding Test] (1) 프로그래머스 스킬체크 Lv.1
권퓨터
권퓨터
만드는 걸 좋아하는 개발자의 기록. 코드든 글이든, 일단 만들어 봅니다.
  • 권퓨터
    권퓨터: Kwonputer
    권퓨터
  • 티스토리 홈 관리자
  • 전체
    오늘
    어제
    • 분류 전체보기 (559)
      • 개발 (56)
        • 프로젝트 (5)
        • 모바일 (44)
        • 프론트엔드 (0)
        • 백엔드 (2)
        • 인프라 (0)
        • AI · 머신러닝 (4)
      • IT · 테크 (10)
        • 기술 트렌드 (3)
        • 도구 · 생산성 (1)
        • 제품 리뷰 · 추천 (0)
        • 마케팅 · 수익화 (6)
      • 자기계발 (7)
        • 공부법 · 언어 (0)
        • 취업 · 커리어 (7)
      • 아카이브 (486)
        • 일기 (480)
        • 취미 (6)
  • 블로그 메뉴

    • 홈
  • 링크

    • 블로그 이전
  • 공지사항

    • 서브 블로그 => https://kwonputer.com/
  • 인기 글

  • 태그

    AWS CDK
    Single Table Design
    flutter 개발자
    OpenAI GPT
    dynamodb
    TypeScript
    injectable
    next.js
    내러티브 게임
    flutter
    Clean Architecture
    AI블로그
    https://github.com/kwongeneral/kortfolio.git
    콘텐츠자동화
    ai 게임 개발
    flutter 면접 질문
    파이썬
    https://www.kwonputer.shop/
    다국어 블로그
    클린 아키텍처
    서버리스 아키텍처
    python 기초
    Prompt Engineering
    상태관리
    블로그수익화
    aws lambda
    riverpod
    FACEBOOK광고
    kotlin
    python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
권퓨터
[Coding Test] (2) 이전 문제 다시 풀어보기
상단으로

티스토리툴바