01/25 본캠프 #23

guno park·2024년 1월 25일
0

본캠프

목록 보기
23/77

---알고리즘 풀이---

이진 변환 반복하기

풀이

  1. 먼저 손 대기 전 s의 길이를 저장한다.
  2. s에서 '0'을 다 제거한다. 손 대기 전 길이와 비교해 차이만큼 zeroCnt에 저장한다.
  3. 남은 문자열의 길이를 저장하고, 2진법으로 했을 때의 자릿수를 구한다.(Log2사용)
  4. 2진법 자릿수의 길이만큼 반복해 각 자리의 숫자들을 저장한 후, 만들어진 문자열을 s로 반환하여 s가 '1'이 될 때까지 반복한다.

트러블 슈팅

닷넷 버전이 낮음

int numlen = (int)MathF.Log2(num);

닷넷 버전이 낮아서 MathF.Log2를 사용할 수가 없다. 그래서 while문으로 다시 만들었다.


using System;

public class Solution {
    public int[] solution(string s) {
      int[] answer = new int[2];
        int zeroCnt = 0;
        int ConCnt = 0;
        while(s!="1")
        {
            string news = s;
            if(s.Contains('0'))
                news = s.Replace("0","");
            zeroCnt += s.Length - news.Length;
            int num = news.Length;
            int numlen = 0;
            while (num != 0)
            {
                num = num / 2;
                numlen++;
            }
            char[] binary = new char[numlen+1];
            for (int i = 0; i <= numlen; i++)
            {
                int temp = (int)(num / MathF.Pow(2, numlen - i));
                binary[i] = (char)(temp+48);
                num -= (int)MathF.Pow(2, numlen - i);
            }
            s=string.Concat(binary);
            ConCnt++;
        }

        answer[0] = ConCnt;
        answer[1] = zeroCnt;
        return answer;
    }
} 시간초과

이번엔 시간초과가 떴다. 왜 그런가 봤더니 num이 이진법으로 변환할 때 나누어지고 있어서 문자로 변환할 때 이상한 값이 들어가서 while이 끝나지 않았던 것이다.
그래서 이번엔 나누기용 변수를 하나 더 선언하고 진행했다.

            int num = news.Length;
            int ToDivide = num;
            int numlen = 0;
            while (ToDivide != 0)
            {
                ToDivide /= 2;
                numlen++;
            }
            char[] binary = new char[numlen];
            for (int i = 0; i < numlen; i++)
            {
                int temp = (int)(num / MathF.Pow(2, numlen - i-1));
                binary[i] = (char)(temp+48);
                num = num-(int)MathF.Pow(2, numlen - i-1);
            }
            s=string.Concat(binary);
            ConCnt++;

이번 코드의 문제점은, 2진법으로 변환 했을 때 Temp가 0이 나올때는 num에서 빼지 않는데, 그 예외처리를 안하고 진행했다. 이 부분까지 예외처리를 하면 말끔해진다.

최종

using System;

public class Solution {
    public int[] solution(string s) {
         int[] answer = new int[2];
        int zeroCnt = 0;
        int ConCnt = 0;
        while(s!="1")
        {
            string news = s;
            if(s.Contains('0'))
                news = s.Replace("0","");
            zeroCnt += s.Length - news.Length;
            int num = news.Length;
            int ToDivide = num;
            int numlen = 0;
            while (ToDivide != 0)
            {
                ToDivide /= 2;
                numlen++;
            }
            char[] binary = new char[numlen];
            for (int i = 0; i < numlen; i++)
            {
                int temp = (int)(num / MathF.Pow(2, numlen - i-1));
                if (temp ==1)
                    num = num-(int)MathF.Pow(2, numlen - i-1);
                binary[i] = (char)(temp+48);
                
            }
            s=string.Concat(binary);
            ConCnt++;
        }

        answer[0] = ConCnt;
        answer[1] = zeroCnt;
        return answer;
    }
}

---델리게이트 특강---

  • 하나의 동작에 여러가지 상황이 부여 될 수가 있다.
    함수에 변수를 여러개 적용할 수 있게 해주는 게 Delegate

    기본 구조
    delegate 반환형 델리게이트이름(매개변수);

기본적으로는 함수와 구성이 유사. 앞에 delegate만 붙여주면됨.
제거할 때는 -=변수명 해서 제거하면 됨.

그냥 사용해도 될 것 같지만 굳이 귀찮은 일을 한다면 이유는 한 가지 - 확장성 때문

팝업 실제로 만들어보기 - 주말에 영상 한번 더보자.

버튼에는 온클릭이라는 속성이있는데 뒤에 .AddListener라고 넣으면 함수를 매개변수로 넣어서 연결할수있음.
버튼을 눌렀을 때 연결된 함수가 실행됨

오늘 정리

오늘은 뭐가 안풀린다. 만드는 것도 뜻대로 안되고, 튕겼더니 파일 꼬여서 다 다시 해야된다.
안될 때는 일단 손 떼고 새로운 마음으로 시작하자.

0개의 댓글