sggnology
하늘속에서IT
sggnology
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • Algorithm (31)
      • Programmers (27)
      • Baekjoon (4)
    • WIKI (4)
      • VirtualBox (1)
      • Power Toys (1)
    • NodeJS (4)
      • nvm (1)
      • React (1)
      • Vue (1)
    • Dev Language (3)
      • Java (2)
      • Kotlin (1)
    • Spring Boot (17)
      • Gradle (1)
      • JPA (3)
    • DB (4)
      • MariaDB (3)
      • Redis (0)
    • Android (6)
      • Debug (3)
    • Nginx (3)
      • Debug (1)
    • Intellij (0)
    • Network (1)
    • Git (2)
      • GitHub (2)
    • Chrome Extension (0)
    • ETC (5)
      • Monitoring (2)
    • Linux (1)
      • WSL (1)
    • Visual Studio (1)
    • Side Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘
  • 레벨3
  • kotlin
  • mariadb
  • 오블완
  • 레벨2
  • java
  • DB
  • 고득점KIT
  • 백준
  • 프로그래머스
  • 안드로이드 스튜디오
  • Android Studio
  • JPA
  • 연습문제
  • nginx
  • spring boot
  • docker
  • 고득점 Kit
  • 티스토리챌린지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sggnology

하늘속에서IT

Algorithm/Programmers

프로그래머스 :: 연습문제 :: 혼자 놀기의 달인

2022. 12. 12. 00:17
728x90

풀이

class 혼자놀기의달인 {
    fun solution(cards: IntArray): Int {
        var answer = 0

        /**
         * Parameters
         * - visited : cards 중 방문 기록용
         * - numberOfCasesForNumberGroups : cards 중에서 `그룹`이 될 수 있는 경우의 수
         * */
        val visited = BooleanArray(cards.size){false}
        val numberOfCasesForNumberGroups = mutableListOf<MutableList<Int>>()

        /**
         * 설명
         * - cards 중에서 방문하지 않은 index 추출
         * -- 만약 모두 방문했다면(==-1) 모든 경우의 수를 확인했음으로 iteration 종료
         * - 경우의 수 세팅(groupOfCards)
         * - 내부 iteration 에서 검색될 index 세팅(searchIndex)
         *
         * - 문제에서 박스는 1 부터 이름을 부여함으로 index 에 -1 처리함(nextTargetIndex)
         * -- 만약 방문했다면, 해당 경우의 수 가 방문할 박스를 모두 방문한 것 임으로 내부 iteration 탈출
         * - 검색한 박스의 내용이 다음 검색될 index 이다.
         * */
        while(true){

            val closestAtFrontIndex = findIndexClosestAtFront(visited)

            if(closestAtFrontIndex == -1){
                break
            }

            val groupOfCards = mutableListOf<Int>()

            var searchIndex = closestAtFrontIndex

            while(true){

                val nextTargetIndex = getNextTargetIndex(searchIndex)
                val nextTarget = cards[nextTargetIndex]

                if(visited[nextTargetIndex]){
                    break
                }

                visited[nextTargetIndex] = true
                groupOfCards.add(nextTarget)

                searchIndex = nextTarget
            }

            numberOfCasesForNumberGroups.add(groupOfCards)
        }

        if(isFinishedFromFirstShot(numberOfCasesForNumberGroups)){
            return 0
        }

        answer = calculateMaxScore(numberOfCasesForNumberGroups)

        return answer
    }

    /**
     * 설명
     * - 상자는 1부터 시작함으로 index 로 변환하는 과정이 필요하다.
     * */
    private fun getNextTargetIndex(target: Int): Int{
        return target - 1
    }

    /**
     * 설명
     * - 전부를 검색하기 위해 visited 의 `0`번째 index 부터 검사하여 제일 `0`에 가까운 방문하지 않은 index 를 반환
     * - 전부 방문했다면 `-1`을 반환
     * */
    private fun findIndexClosestAtFront(visited: BooleanArray): Int{
        for((index, visitedStatus) in visited.withIndex()){
            if(!visitedStatus){
                return index + 1
            }
        }

        return -1
    }

    /**
     * 설명
     * - 문제 조건중에서 처음검색에서 cards 전부를 탐색했다면 `0`이 정답이다.
     * */
    private fun isFinishedFromFirstShot(result: MutableList<MutableList<Int>>): Boolean{
        return result.size == 1
    }

    /**
     * 설명
     * - 선별된 그룹들중 제일 큰 두개의 곱셈이 정답
     * */
    private fun calculateMaxScore(result: MutableList<MutableList<Int>>): Int{
        val reverseSortedNumberOfCasesForNumberGroups = getReversedEachListSize(result)

        return reverseSortedNumberOfCasesForNumberGroups[0] * reverseSortedNumberOfCasesForNumberGroups[1]
    }

    private fun getReversedEachListSize(list: MutableList<MutableList<Int>>): List<Int>{
        return list.map { it.size }.sortedDescending()
    }
}

출처

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


풀이(github)

 

GitHub - sggnology/programmers-algorithm: 프로그래머스 알고리즘 코드 정리입니다.

프로그래머스 알고리즘 코드 정리입니다. Contribute to sggnology/programmers-algorithm development by creating an account on GitHub.

github.com

 

728x90

'Algorithm > Programmers' 카테고리의 다른 글

프로그래머스 :: 연습문제 :: 뒤에 있는 큰 수 찾기  (0) 2023.02.16
프로그래머스 :: 연습문제 :: 테이블 해시 함수  (0) 2022.12.25
프로그래머스 :: 연습문제 :: 점찍기  (0) 2022.12.05
프로그래머스 :: 연습문제 :: 귤고르기  (0) 2022.11.25
프로그래머스 :: 연습문제 :: 연속 부분 수열 합의 개수  (0) 2022.11.18
    'Algorithm/Programmers' 카테고리의 다른 글
    • 프로그래머스 :: 연습문제 :: 뒤에 있는 큰 수 찾기
    • 프로그래머스 :: 연습문제 :: 테이블 해시 함수
    • 프로그래머스 :: 연습문제 :: 점찍기
    • 프로그래머스 :: 연습문제 :: 귤고르기
    sggnology
    sggnology
    하늘은 파란색이니까 내 삶도 파란색이길 ㅎㅎ

    티스토리툴바