[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/
  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바