오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 31일차(코드카타와 레이어 비트연산 )

2023. 12. 11. 09:45스파르타코딩클럽 게임개발

반응형

코드카타

문제 설명

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.  
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

제한사항

-   arr은 자연수를 담은 배열입니다.
-   정수 i, j에 대해 i ≠ j 이면 arr\[i\] ≠ arr\[j\] 입니다.
-   divisor는 자연수입니다.
-   array는 길이 1 이상인 배열입니다.

입출력 예


arrdivisorreturn입출력 예 설명

입출력 예#1  
arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 \[5, 10\]을 리턴합니다.

입출력 예#2  
arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 \[1, 2, 3, 36\]을 리턴합니다.

입출력 예#3  
3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 \[-1\]을 리턴합니다.

뭐 그렇댄다.

그러니까 배열을 하나씩 확인해 보면서 divisor에 나누어 떨어지는지 확인하면 된다는 뜻.

답은 간단하다

새로운 배열을 생성해서 거기에 일치하는 것만 넣고 오름차순만 적용시키면 되는것.

근데 난 배열을 만들기 귀찮으니 리스트를 사용하겠다.

  public int[] 나누어떨어지는값(int[] arr, int divisor)  
  {  
      List<int> list = new List<int>();  
      for (int i = 0; i < arr.Length; i++)  
      {  
          if (arr[i] % divisor == 0)  
          {  
              list.Add(arr[i]);  
          }  
      }  
      list.Sort();  
      if (list.Count == 0) { return new int[] { -1 }; }  
      return list.ToArray();  
  }

깔꼼.

두번째 문제

문제 설명

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

---

제한사항

-   absolutes의 길이는 1 이상 1,000 이하입니다.
    -   absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
-   signs의 길이는 absolutes의 길이와 같습니다.
    -   signs\[i\] 가 참이면 absolutes\[i\] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

---


입출력 예 설명

**입출력 예 #1**

-   signs가 \[true,false,true\] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.
-   따라서 세 수의 합인 9를 return 해야 합니다.

**입출력 예 #2**

-   signs가 \[false,false,true\] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.
-   따라서 세 수의 합인 0을 return 해야 합니다.

이 문제도 딱 봐도 쉬워 보인다.

그저 불값에 따라 부호만 바꾸면 되는것이니까.

그리고 기본적으로 전부 절대값으로 준다고 하지 않나?

그럼 그냥 불값이 false면 -1을 곱해주면 된다.

말만 어렵게 내고 말이야;; 졸라 국어문제인줄 ㅋㅋ

 public int 음양더하기(int[] absolutes, bool[] signs)  
 {  
     int x = 0;  
     for (int i = 0; i < absolutes.Length; i++)  
     {  
         if (!signs[i])  
         {  
             absolutes[i] *= -1;  
         }  
         x += absolutes[i];  
     }  

     return x;  
 }

오늘의 코드카타는 여기서 마무~리!

 

강의로 넘어가보자 

 

이번엔 강의 듣다가 좀 궁금한 것이 생겼다.

// 레벨 충돌 레이어와 충돌 시 프로젝타일 파괴 
if (levelCollisionLayer.value == (levelCollisionLayer.value | (1 << collision.gameObject.layer))) 
{
    DestroyProjectile(collision.ClosestPoint(transform.position) - \_direction \* .2f, FxOnDestroy); 
}

 

or 연산이란? 비트 연산자인데 이 방법은 c를 처음 배울때 처음 보았다.

 

강의에서 기초적인 설명이 부족한것같다. 일단 레이어에서 뭐 레벨 3이 밀려졌다 뭐라고 하시는데 

 

초보자인 저에게는 뭔소린지 도통 안들어오다가 제 추측대로 이해해보았다.

 

레이어의 모습

레이어가 이렇게 잡혀있을때 모든것이 체크가 되어있다면 현재의 비트는 

111011111 이런식이라는 말이다. 뭐 그것까진 알겠다 근데 .. 이해가 안되는군

 

정말 이해가 잘 안되서 챗gpt에게 물어보았다.

그제서야 이해가 갔다. 하 그렇군

 

레이어의 값이 3이라면 1<<3 이니까 1에서 3번 비트를 움직이면 1000 즉 현재 레이어가 111011111 이라고 했을때

or 연산을 하면 

11101111 

00001000

11101111

 이렇게 변화가 없어서 같은 값이 되니 조건이 참이 되는것. 흠.. 그렇군 이해 되었다.

 

나는 레이어 자체의 값이 11011뭐 이런식이면 어떡하지 싶었는데 그럴일이 없단다. 

 

Unity에서 레이어는 0부터 31까지의 정수로 표현됩니다. 여기서 '1 << collision.gameObject.layer'는 1을 collision.gameObject.layer만큼 왼쪽으로 비트 이동시키는 것입니다.

 

듣고보니 이렇게 친절하게 설명해주었구나.. 지피티야 넌 천사야 흑흑 

 

 

반응형