✏20240227 화요일
- 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만 썼더니 다른 함수를 더 못쓰게 되는 것 같다...