자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
입출력 예
n | return |
---|---|
12345 | [5,4,3,2,1] |
using System;
public class Solution
{
public long[] solution(long n)
{
long k = (long)(Math.Log10(n) + 1);
long[] answer = new long[k];
long i = 0;
long j = 0;
while (n != 0)
{
j = n % 10;
answer[i] = j;
i++;
n = n / 10;
}
return answer;
}
}
배열에 값을 저장하는 것까지는 어려움이 없었으나, 배열의 크기를 정하는 것에서 막막해졌다. 코드카타 정답 확인 테스트가 아주 다양한 값으로 진행하는 것으로 판단이 되어서 임의로 배열의 크기를 정할 수도 없는 노릇이고. . . 결국 서칭을 통해 Math.Log10(n)
메서드를 알게 되었고 잘적용하여 문제를 해결할 수 있었다.
세션 시작 부분에 강사님이 오늘 설명할 내용들이 추상적이라서 설명하기가 조금 난해해 보이셨고, 각자 비유를 통해 이해해야 한다는 느낌이 들었다. 부족하지만 그간 배운 C# 문법들을 떠올리며 현재의 내가 이해하고 있는 객체지향 프로그래밍에 대해 써보려 한다.
예를 들어 플레이어와 몬스터를 구현하고자 한다면 공통된 부분이 레벨, 체력, 공격력 등의 status가 될 수 있겠다. 플레이어, 몬스터 클래스를 생성하여 각자 값을 줘도 구현에는 문제가 없지만 인터페이스로 한 번에 묶어서 규정하여 상속시켜 중복된 작업을 피하고 오류 방지, 수정의 용이함이 좋아지게 하는 것 이것을 객체지향이라고 생각한다.
플레이어와 몬스터는 각각 특징이 있다. 플레이어의 경우 아이템의 장착, 소지 금액, 레벨업 등이 몬스터와 다르고 몬스터는 다양한 종류, 몬스터의 생성 등이 특징이다. 이러한 부분들을 클래스에서 설정한다.
부모 클래스에서 상속 받으면 자녀 클래스에선 부모 클래스의 모든 값들을 사용할 수 있다. 마찬가지로 코드의 재사용을 위함이다. 자유롭게 변수와 메서드를 정의하여 부모 클래스에서 받은 값들을 재사용할 수 있다.
아직 명확하게 이해가 되는 것은 아니지만 그간의 공부와 프로젝트의 경험으로 어렴풋이 가닥이 잡히는 것 같긴 하다. 전체적인 골자는 '코드의 반복을 줄이고, 이미 작성된 코드를 이어 받아서 새로운 코드로 재사용한다.' 이것이 현재의 내가 객체지향에 대해 이해한 내용이다.
수강 중 강사님과 다르게 작동하지 않는 스크립트가 있어 서칭을 통해 해결함
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
// 스크립트 생성 때 뭔가 잘못 건드렸는지 클래스 명이 달랐고 이를 수정하여 해결함
// public class NewBehaviourScript : TopDownCharacterController 문제의 코드
public class PlayerInputController : TopDownCharacterController // 수정 코드
{
private Camera _camera;
private void Awake()
{
_camera = Camera.main;
}
public void OnMove(InputValue value)
{
// Debug.Log("OnMove" + value.ToString());
Vector2 moveInput = value.Get<Vector2>().normalized;
CallMoveEvent(moveInput);
}
public void OnLook(InputValue value)
{
// Debug.Log("OnLook" + value.ToString());
Vector2 newAim = value.Get<Vector2>();
Vector2 worldPos = _camera.ScreenToWorldPoint(newAim);
newAim = (worldPos - (Vector2)transform.position).normalized;
if (newAim.magnitude >= 0.9f)
{
CallLookEvent(newAim);
}
}
public void OnFire(InputValue value)
{
// Debug.Log("OnFire" + value.ToString());
IsAttacking = value.isPressed;
}
}
객체지향 프로그래밍에 대해 따로 세션까지 준비해 주시는 걸 보면 앞으로의 C#, Unity 사용자가 되려면 꼭 숙지하고 가야하는 것 같다는 생각이 든다. 여러가지 글이나 영상 강의를 보며 계속해서 공부해야겠다는 생각이 들었다.
Unity 강의에서 느낀 점은 작동 방식의 이해도가 떨어지지만 작동하는 방법을 배우는 느낌이다. 튜터님의 말씀으로는 이런 류의 Engine을 사용하기 시작하는 타이밍에 자주 생기는 이슈라고 하셨고 따로 Documentation을 활용하는 방법을 강의한다고 하셨다.
그리고 기계 설계를 배울 때 봤던 벡터나 삼각함수를 이용하는 것을 보고는 힘들었던 때가 떠올랐지만. . . 그때 그래도 공부를 해둔 탓인지 이해하기 어렵진 않았다. 하지만 역시나 수학 공부를 시작해야겠다는 생각이 굳어졌다. 책부터 사야지. . .