프로그래머스 Level 2 튜플

2023. 3. 15. 23:55알고리즘/문제

튜플

출처 : 프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

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

programmers.co.kr

이 포스트는 광고 게시가 없는 비상업적, 비영리적 포스트임을 알려드립니다.

 

문제

튜플에 대한 설명이 쭈욱 나옵니다. 위에 예를 들어 설명하는 부분을 가져왔습니다.

이해가 안 되신다면 읽어보시고 아니시라면 밑에 코드 설명으로 내려가시면 됩니다.

 

여기서 튜플은 집합으로 표현하고 있습니다.

그리고 집합 안에서의 원소는 순서가 바뀌어도 상관없습니다.

 

쉽게 말해 튜플은 순서가 정해진 수의 나열인데 문제에서는 튜플에서 뽑을 수 있는 경우를 모두 주고 튜플을 구하라고 합니다. 

 

제가 생각했던 방법은 먼저 입출력 예를 골똘히 보았습니다.

 

 

집합 안에 서는 순서가 변경 가능합니다. 그래서 처음에는 정렬을 이용해야 하나 생각했지만 정렬을 어떻게 해야 할지 감이 오지 않았습니다. 기준이 없었기 때문에요.

 

그래서 다시 보니 2,1,3,4의 튜플 집합에 2는 4번이 나옵니다.

이거만 들어도 바로 아... 하실 것 같습니다.

 

네 2는 4번 1은 3번 3은 2번 4는 1번이 나옵니다.

다시 문제를 보면

 

문제에서는 튜플 집합 "안의" 원소를 무작위로 섞어서 주지만

원소의 개수는 정해져 있습니다.

 

코드 함수형으로 작성

class Solution {
    fun solution(s: String): IntArray = s.replace("[{}]".toRegex(), "")
        .split(",")
        .groupingBy { it }
        .eachCount()
        .entries.sortedByDescending { it.value }
        .map { it.key.toInt() }.toIntArray()
}

이번 코드는 람다를 이용해 함수형으로 작성해 보았습니다.

 

과정은 먼저 input으로 입력받는 아래와 같은 예에서 

{ 과 } 를 모두 아래 코드가 정규식 표현을 이용해 ""로 교체합니다.

s.replace("[{}]".toRegex(), "")

 

그리고 split로 문자열을 ","로 각 원소들을 나눈 리스트로 반환합니다.

.split(",")

 

그다음 각 원소를 그룹으로 묶어서 같은 그룹에 속하는 원소를 개수로 정리합니다.

 

.groupingBy { it }
.eachCount()

 

이제 value를 기준으로 내림차순 정렬합니다.

.entries.sortedByDescending { it.value }

 

마지막으로 앞의 key값을 가진 int형 array로 변형합니다.

.map { it.key.toInt() }.toIntArray()

이 안에 아래와 같이 들어있습니다.

 

선언적 스타일의 함수형 프로그래밍을 통해 답을 구해봤습니다. 

참 깔끔하고 예쁩니다.

이상으로 튜플 문제를 마치겠습니다. 감사합니다.