Skip to content

Instantly share code, notes, and snippets.

@mununki
Created April 19, 2022 14:59
Show Gist options
  • Save mununki/1e1f4551740e509b7bd970669f419934 to your computer and use it in GitHub Desktop.
Save mununki/1e1f4551740e509b7bd970669f419934 to your computer and use it in GitHub Desktop.
프로그래머스 5 - 좋은 부분 문자열
// 좋은 부분 문자열
// 좋은 부분 문자열이란 어떤 문자열 s의 부분 문자열이면서 같은 알파벳이 두 번 이상 나타나지 않는 문자열을 말합니다.
// 예를들어 주어진 문자열이 "abac" 일 때, 부분 문자열 "a", "ab", "bac"등은 원래 문자열 "abac" 의 부분 문자열이면서
// 문자열 내에 같은 알파벳이 두 번 이상 나타나지 않으므로 좋은 부분 문자열입니다. 그러나 "aba", "abac"는 문자열 내에
// 같은 알파벳 'a'가 두 번 이상 나타나므로 좋은 부분 문자열이 아닙니다. 문자열 s가 주어질 때 좋은 부분 문자열의 개수를
// return 하도록 solution 함수를 완성해주세요.
// "abac" => "a", "b", "c", "ab", "ba", "ac", "bac"
// "abcd" => "a", "b", "c", "d", "ab", "bc", "cd", "abc", "bcd", "abcd"
// 1 ~ String.length 각각의 길이만큼의 윈도우로 부분 문자열을 만든다.
// Set에 집어넣어 중복을 막는다.
// 각 item 별로 중복 문자가 있는 지를 체크해서 filter 한다.
// 중복 문자 존재 여부는, 한 문자씩 split 해서 Set에 집어넣은 후 개수를 비교한다. -> 다르면 중복 문자 존재
open Belt
let solution = s => {
let length = s->Js.String2.length
let from = Array.makeBy(length, x => x)
let to_ = Array.makeBy(length, x => x + 1)
// from | to
// 0 | 1
// 1 | 2
// 2 | 3
// 3 | 4
// 0 | 2
// 1 | 4
// 2 | 4
// 3 | 5
from
->Array.map(from => to_->Array.map(to_ => s->Js.String2.slice(~from, ~to_)))
->Array.concatMany
->Set.String.fromArray
->Set.String.keep(sub => {
// if 문자열의 길이 != 문자 Set의 길이 then 중복 문자가 있다.
let length = sub->Js.String2.length
let lengthOfUnique = sub->Js.String2.split("")->Set.String.fromArray->Set.String.size
length == lengthOfUnique && length != 0 // 빈 문자열 제거
})
->Set.String.size
}
let solution: string => int
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment