Post

Unity 1차 미니 프로젝트 - 4

해당 내용의 전부는 학원에서 배우는 것이기 때문에 공개가 어렵습니다.

해당 내용의 자세한 강의가 필요하신 분들은 이곳에서 확인하시면 됩니다.

2023-11-02 TIL

알고리즘과 애니메이션 오류에 대한 포스팅을 하겠습니다.

알고리즘 문제

오늘의 알고리즘 문제 : 자릿수 더하기

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.

1
2
3
4
5
6
7
8
using System;

public class Solution {
    public int solution(int n) {
        int answer = 0;
        return answer;
    }
}

해결

처음에는 어떻게 해야하나 고민을 많이 했습니다.
하지만 번뜩 10으로 나머지연산을 하게되면 1의자리수를 구할수 있었고 후 10으로 나누게 되면 1의 자리수가 밀린다는 걸 생각하게 되었습니다.

즉 n이 123일시 n % 10을 하면 3이 나오고 n/10을 하면 12가 나옵니다.
그 후 해당 n % 10값을 하나의 변수에 계속 더해주면 정답이 나옵니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
using System;

public class Solution {
    public int solution(int n) {
    int answer = 0;
    while (n>0)
    {
        answer += n % 10;
        n = n / 10;
    }
        return answer;
    }
}

이렇게 하면 각 자리수를 구할수 있었습니다.

Desktop View

그 후 다른 방법들이 무엇이 있나 확인하던 차 흥미로운 함수가 있어 소개해드립니다.

1
2
3
4
5
6
7
8
using System.Linq;

public class Solution {
    public int solution(int n) {
        int answer = n.ToString().AsEnumerable().Sum((c) => c ^ 48);
        return answer;
    }
}

이것은 제공되는 함수로만 사용하여 구현한 코드입니다.

  1. n.ToString() : int n의 값을 문자열로 반환해줍니다.
  2. .AsEnumerable() : 문자열을 IEnumerable<char>로 변환하여 각 문자마다의 대한 작업을 수행해줍니다.
  3. IEnumerable<char> : 문자열string을 하나씩 나눠 문자char의 집합으로 만들어줍니다.
  4. .Sum((c) => c ^ 48) : 2번에서 문자로 나눈 각 값을 아스키 코드를 이용해 비트 연산XOR으로 값을 구해 더해줍니다.

예) c가 5일때 ‘5’ (ASCII 53) ^ ‘0’ (ASCII 48) = 5

int answer = n.ToString().AsEnumerable().Sum((c) => c ^ 48);은 n값을 문자열화 한후 문자집합으로 바꿔 해당 값을 비트 연산으로 int값을 만들고 그 값을 다 더해 answer변수에 넣어줍니다.

애니메이션 문제

카드들이 생성될시 애니메이션과 같이 생성이 되도록 애니메이션을 만들었습니다.

Desktop View

해당 이미지처럼 애니메이션을 만들고 애니메이션을 프리팹에 적용시켜보았습니다.

Desktop View

하지만 돌아오는건 한곳에 쌓인 카드들… 무슨일인가 확인을 해볼 필요가 있었습니다.

해결

이리저리 시행착오를 겪은 후에 원인을 알수 있었습니다. 그것은 애니메이션을 만들 때 해당 프리팹 자체의 포지션을 변경을 해서 일어난 버그였습니다.

해당 상황을 바꾸기 위해서는 해당 프리팹 자식으로 있는 오브젝트의 포지션을 변경해보았습니다.

Desktop View

그랬더니 되었습니다.
이유는 해당 프리팹이 만들어질시 구현 로직의 규칙에 따라 각자의 위치가 정해지는데 그때 애니메이션을 참견을 하면 해당 오브젝트의 포시션 Y값을 바꿔버리기 때문에 일어난 일이였습니다.
결국에는 해당 프리팹이 아닌 해당 프리팹의 자식의 오브젝트를 애니메이션 시키는 것이 더욱더 안정성이 높은 것을 알게 되었습니다.

Desktop View

오늘의 정리

애니메이션을 만들 때는 해당 프리팹이 아닌 프리팹의 자식을 활용하여 만든다.
메서드와 함수 변수들이 분류에 따라 있지 않고 추가할때마다 위치를 정하고 두지를 않아서 많이 불편했다.
그래서 추가 변수 메서드 생성시 비슷한 기능을 하는 것들은 서로 모으고 하는게 좋았을 거 같다.
또한 변수나 메서드 생성시 주석을 달아주고 무슨 기능을 하는지 간략한 설명을 같이 넣었다.
그랬더니 보기에 편하고 무슨 기능을 하는건지 알수 있어서 버그 픽스나 코드 추가에 좋았다.
앞으로는 메서드와 변수 관리를 철저히 하고 주석을 다는 습관을 더욱더 확실하게 해야할거 같다.

Desktop View

This post is licensed under CC BY 4.0 by the author.