728x90
이번엔 두가지를 골라 분석해봤다.
(문제시 삭제하겠음!!)
문제
https://programmers.co.kr/learn/courses/30/lessons/72410?language=kotlin
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
참고 코드1
https://velog.io/@rkdals3912/Lv.1-%EC%8B%A0%EA%B7%9C-%EC%95%84%EC%9D%B4%EB%94%94-%EC%B6%94%EC%B2%9C
Lv.1 신규 아이디 추천
문제- 신규 아이디 추천 오랜만에 알고리즘 문제를 풀어봤는데 지금까지 Python으로 많이 풀어왔지만 이번엔 코틀린으로 한 번 풀어봤다.생각보다 쉽지 않았고 시간이 많이 걸렸다.람다로 짜는걸
velog.io
해석
원래 코드에서 좀 변경해서, 26개중 22개정도 돌려봤다.
class Solution {
fun solution(new_id: String): String = new_id
// 2단계 알파벳, 숫자, 빼기 밑줄, 마침표를 제외한 모든 문자를 제거
// isLetterOrDigit(), isLetter(), isDigit() 다있음
.filter{it.isLetterOrDigit() || it.toString() == "-" || it.toString() == "_" || it.toString() == "."}
.map{it.toLowerCase()} //.toString()} toString()해봤자 List임
// .flatMap{it.toList()} // 1대 다 매핑이 가능, 근데 map까지 수행하고 이미 List 타입이라 필요없어보임
// let, with, run, apply, also 비슷비슷한게 많음..
// joinToString(구분자, 시작, 종료) 형식으로 사용, 배열 데이터를 string으로 바꿀 때 사용
.let{it.joinToString("")}
// \\. 은 마침표를 의미, {2,}는 2개 이상을 의미
.let{it.replace("\\.{2,}".toRegex(), ".")}
// 4단계 마침표가 처음이나 끝에 위치해 있다면, 제거
.removePrefix(".").removeSuffix(".")
.let{ // 5단계 비었으면 "a"를 리턴 아니면 원래 it을 리턴
if(it.isEmpty())
"a"
else it // 이게 없어도 되지 않을까 했는데 아니었다.
}
.let{
if(it.length >= 16) // 6단계, 원래 removePrefix도 적혀있었지만, 앞에서 제거해서 필요없다고 판단.
// .toString()이 두개 들어있었는데 없어도 되는거같아 지웠더니 된다.
it.removeRange(15, it.length).removeSuffix(".")
else it
}
.let{
if(it.length <= 2){ // 7단계
when(it.length){
// 원래 문자열(여기서는 한글자)을 3번 반복
// 원래 "${it.get(0)}${it.last()}${it.last()}" 라고 적혀있었음, get(0)를 하면 0위치의 값을 리턴하는것같다.
1->"$it$it$it" // it만 쓸거 아니면 중괄호 필수
// it.last()를 하면 마지막 위치의 값을 리턴하는것같다.
else->"$it${it.last()}"
}
} else it
}
// .javaClass.name // 데이터 타입 확인하려고 사용했었다.
}
728x90
참고 코드2
https://cheonjoosung.github.io/blog/pg-newID
Joo's IT
백준 17822번 원판 돌리기 Java/자바 - 2019 삼성 SW 역량테스트 기출문제 알고리즘 백준
cheonjoosung.github.io
해석
원래 코드에서 좀 변경해서, 26개중 22개정도 돌려봤다.
class Solution {
fun solution(new_id: String): String {
var answer: String = new_id
// 1단계 대문자 to 소문자
answer = answer.toLowerCase() // 대입을 해줘야한다. string은 immutable해서?
val reg2 = Regex("[a-z0-9-_.]") // 2단계 regex 소문자, 숫자, 빼기, 마침표만 골라냄
var temp = StringBuilder() // 속도가 string보다 빠르다, single thread 환경, 그 다음은 StringBuffer임, multi thread 환경
/*
for(i in answer.indices){ // indices는 index의 값을 가져온다 0, 1, ...
// https://codechacha.com/ko/kotlin-how-to-use-regex/
// regex.containsMatchIn(str): 부분적으로 일치하면 true를 리턴
// regex.matches(str): 모두 일치하면 true를 리턴
if(reg2.containsMatchIn(answer[i].toString())){
temp.append(answer[i])
}
}
answer = temp.toString()
*/
// 위 사이트에서 검색을 하고 보니 아래와 같은 방법도 가능할것같아 테스트 해봤다. 굳
val matchResults: Sequence<MatchResult> = reg2.findAll(answer)
answer = matchResults.map{it.value}.joinToString("")
val reg3 = Regex("[.]{2,}") // 3단계 regex .이 두개 이상
answer = answer.replace(reg3, ".")
// 4단계 처음과 끝 .제거
// 비어있지 않고 첫번째 문자가 .이면
if(answer.isNotEmpty() && answer.first() == '.') answer = answer.removeRange(0, 1)
// 비어있지 않고 마지막 문자가 .이면
if(answer.isNotEmpty() && answer.last() == '.') answer = answer.removeRange(answer.length-1, answer.length)
// 5단계
if(answer.isEmpty()) answer = "a"
// 6단계
if(answer.length >= 16) {
answer = answer.substring(0, 15) // 0~14만 잘라서 넣음
if(answer.last() == '.') // 마지막 문자가 .이면 제거
answer = answer.removeRange(answer.length-1, answer.length)
}
// 7단계
while(answer.length <= 2){
// 여러가지 방법 존재, 난 마지막것이 좋다.
// answer = answer.plus(answer[answer.length-1])
// answer += answer[answer.length-1]
answer += answer.last()
}
return answer
}
}728x90
'note > language-kotlin' 카테고리의 다른 글
| [programmers] Lv.1 로또의 최고 순위와 최저 순위(Kotlin 공부용) (0) | 2022.05.08 |
|---|---|
| [programmers] Lv.1 신고 결과 받기(Kotlin 공부용) (0) | 2022.05.08 |
댓글