[Kotlin/프로그래머스] 24년 2월 5주차 코드카타정리

지혜·2024년 2월 27일

Code_Kata

목록 보기
15/16

✏20240227 화요일

📖조건에 맞게 수열 변환하기 2

  • while 반복문 안에서 for문을 통해 조건에 맞춰서 arr을 바꾼다. 이때, arr이 바뀌면 count에 +1을 더해서 변화되었음을 알려준다.
  • if문을 통해 count가 0인지 아닌 것으로 arr의 원소값이 이전과 똑같은지 아닌지를 판별하고, 0(똑같다)이면 반복문을 빠져나오고, 0이 아니면 answer에 +1을 해준후 계속 반복한다.
class Solution {//나의 풀이
    fun solution(arr: IntArray): Int {
        var answer: Int = 0
        while(true){
            var count = 0
            for(i in arr.indices){
                if(arr[i]>=50 && arr[i]%2==0) {
                    arr[i] = arr[i]/2 
                    count++
                } else if(arr[i]<50 && arr[i]%2!=0) {
                    arr[i] = arr[i]*2 +1 
                    count++
                }
            }
            if(count == 0) break;
            answer++
        }
        return answer
    }
}
  • count 말고 flag로 true false를 통해 코드를 작성한 다른 사람의 풀이가 있었는데, flag를 사용하는게 더 자연스럽고 연산적으로도 좋지 않았을까 하는 생각이 든다.
  • 처음에는 while문을 한바퀴 돌기 이전의 arr 값을 저장했다가 한바퀴 돈 후 의 arr값과 비교해서 같은지 아닌지를 판별해야 하나? 라고 생각했는데, 그러면 작성해줘야할 사전변수들이 많아질 것 같아서 값이 바뀌는 곳 자체의 변화를 체크하는 방법을 사용했는데, 덜 복잡하고 좋은 것 같다.

✏20240229 목요일

📖이진수 더하기

  • bin1.toInt(2) + bin2.toInt(2)에 대해서 이진수로 표현하기 위해 Integer.toBinaryString()을 사용한다.
class Solution {//나의 풀이
    fun solution(bin1: String, bin2: String): String 
    = Integer.toBinaryString(bin1.toInt(2) + bin2.toInt(2))
}
  • toInt()보다 parseInt()를 사용한 풀이가 꽤 보였는데, parseInt()가 속도에서 좀 더 빠르다고 한다.
  • (bin1.toInt(2) + bin2.toInt(2)).toString(2) : 처음에 (bin1.toInt(2) + bin2.toInt(2))이렇게 만 적었다가 오류 때문에 문제가 안풀려서 검색했던건데 뒤에 toString(2)를 붙여주면 되었던거였다니.. 새롭게 알아간다.

📖소인수분해

  • n을 계속 나눠주면서 소인수를 찾아야하기 때문에 변수 num을 선언해서 n을 담아준다.
  • while반복문을 통해 소인수 분해를 진행한다. 이때, 2부터 나눠서 소인수 분해를 하기 때문에 i를 2부터 시작한다.
  • while 안에서 num이 i로 딱 나누어 떨어진다면 num을 i로 나누고 answer에 i를 담는다. 만약 떨어지지 않는다면 i에 +1씩 하여 다음 나누어 떨어지는 숫자를 찾는다.
  • num이 1이 될 때까지 반복한 후, 담겨진 answer를 문제에서 요구한대로 중복된 값 없이 하나의 값 들만 남기기 위해 distinct()를 사용하고 리스트로 변환된 값을 다시 toIntArray()를 통해 타입을 맞춰준다.
class Solution {//나의 풀이
    fun solution(n: Int): IntArray {
        var answer: IntArray = intArrayOf()
        var num = n
        var i = 2
        while(num>1) {
            if(num % i == 0){
                num /= i
                answer += i
            } else i++
        }
        return answer.distinct().toIntArray()
    }
}
  • 맨 처음에 answer를 Set으로 바꿀까도 생각했는데, distinct가 생각이나서 그냥 answer에 distinct를 붙여줬더니 반환 타입이 리스트라고 타입 미스매치를 만났다..ㅎ 이제와서 Set으로 바꾸기도 뭐하고 그냥 toIntArray로 바로 타입을 맞춰주었다.

✏20240301 금요일

📖문자 개수 세기

  • answer에 대문자26개+소문자26개 를 합친 52개 크기 만큼의 intArray를 초기화 시킨 후
  • for문을 통해 my_string을 돌면서 아스키코드를 활용하여 대문자의 범위 안에 있다면 answer에서 대문자 A가 인덱스 0번 부터 시작하기 때문에 -65(A[65]-65=0)로 해당 인덱스를 찾아서 +1을 해주고, 소문자라면 소문자 a가 인덱스가 26부터 시작하기 때문에 -71(a[97]-71=26)을 해주어 해당 인덱스를 찾아서 +1해준다.
class Solution {//나의 풀이
    fun solution(my_string: String): IntArray {
        var answer: IntArray = IntArray(52)
        
        for (i in my_string.indices) {
        when {
            my_string[i] in 'A'..'Z' -> answer[my_string[i].toInt() - 65]++
            my_string[i] in 'a'..'z' -> answer[my_string[i].toInt() - 71]++
        }
    }
        return answer
    }
}
  • 다른 사람의 풀이를 보니까 forEach를 사용해서 보다 간단하게 풀어낸 사람들이 많았다. it을 사용하니까 확실히 코드 가독성이 훨씬 증가한 것을 느낄 수 있었다.
  • 마음이 급해도 이제는 for보다 forEach나 map 같은 확장함수를 먼저 사용하도록 해야겠다.... 맨날 초조하다는 핑계로 for만 썼더니 다른 함수를 더 못쓰게 되는 것 같다...
profile
파이팅!

0개의 댓글