![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRgHR6%2FbtrVt2I6bhA%2FlH6hViCyW8KMNrt73opiA1%2Fimg.png)
문제 이해 단계 숫자로 이루어진 문자열이 주어지고, 그중에서 없애야 할 문자의 수 k가 주어진다. k개를 지워서 문자열 중 가장 큰 숫자를 만드는 것이다. 여기서 중요한 점은 무조건 k개를 다 써야 한다는 것이다. 문제 접근 단계 상식적으로 한번 접근해 보자. 어떤 문자열(숫자배열)일수록 크다고 할 수 있을까? 당연히 기본적으로 다른 숫자들보다 자릿수가 많으면 비교할 필요도 없이 더 큰 숫자일 것이다. 예를 들어 두 자릿수의 최솟값 (10)은, 한 자릿수의 최댓값(9)보다 무조건 큰 것처럼 말이다. 그럼 비교하는 두 숫자의 자릿수가 같다면? 가장 높은 10의 자리(숫자 배열의 첫 인덱스)가 높은 숫자가 큰 것이다. 예를 들어, "399"와 "400"을 비교하면, 가장 높은 자릿수인 '3'과 '4'만 보고..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRFYYy%2FbtstpEgSAh2%2Fb1ELk1t6dGsoRU5cxj3FPK%2Fimg.png)
목표 오브젝트에 스크립트를 넣어 인스펙터 뷰를 커스터마이징 직렬화(Serialization) - 해당 필드를 유니티가 인식할 수 있는 상태로 만드는 것 - 유니티가 처리할 수 있는 형태로 만드는 것- Inspect를 조작하기 위해선 직렬화는 필수적인 과정 -> 유니티가 직렬화할 수 있는 오브젝트를 만들어야 한다. CustomEditor와 Editor 우선 커스터마이징 할 스크립트[CustomScript]를 작성한다. public class CustomScript : MonoBehaviour { public GameObject otherObject; public string myName; public int myHp; } 커스터마이징 에디터 스크립트[CustomEditorTest]를 CustomScript..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FICVba%2FbtstqtspqCn%2F6MwAj3ktSPIW4MBIqHbeRK%2Fimg.png)
Event OnGUI()를 호출하는 주체(OnGUI 보다 Low-Level) - 사용자와의 입력과 상호작용 - 트리거들을 공통적으로 처리하는 예약된 함수들이 정의되어 있다 - 효율성을 위해 OnGUI() 내부 코드와 현재 Event의 관계 여부에 따라 무시할 수 있음 1. 현재 이벤트가 드로잉이 아닌데, 드로잉 관련 코드를 만나면 그 코드를 무시 2. MouseClick 이벤트로 OnGUI()가 호출되면 해당 흐름에서는 Drawing 수행 코드 무시 Event 종류 Event.current: 현재 OnGUI()를 호출하게 된 Event Layout Event: Repaint 전 GUI들의 배치 값 관련 수집 이벤트 유니티 상단에 MyTool/OpenTool을 눌러 생성된 창 위에 마우스를 올리고 클릭, ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fclwaif%2FbtstpGeroZ1%2F0pjavHwYazRaackFCrKYDK%2Fimg.png)
GUI Content '무엇을 그릴까?'에 대한 클래스 아래와 같이 GUIContent를 생성하여 사용한다. private void OnGUI() { var myContent = new GUIContent(); //GUIContent 생성 myContent.text = "textText"; myContent.image = EditorGUIUtility.FindTexture("AvatarController.Layer"); EditorGUILayout.LabelField(myContent); // myContent Label 생성 myContent.tooltip = "this is ToolTip"; // 마우스 위에 대면 나오는 거 GUILayout.Button(myContent); } myContent에 ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUTHtJ%2FbtrVhUjDmMz%2FTZUEVGxhQ5KNFewaSA4wK0%2Fimg.png)
GUI 레이아웃 시스템을 이해함으로써, Layout을 좀 더 세밀하게 다룰 수 있다. 예를 들어, EditorGUILayout.Label() 함수를 사용하여 여러 Label을 GUI로 만들면 세로로 Label들이 배치될 것이다. 하지만 LayoutSystem을 이해하고 지금부터 배우는 새로운 함수를 사용하면 좀 더 복잡한 배치가 가능해진다. 가로/세로 배치 // Layout을 가로로 배치한다. EditorGUILayout.BeginHorizontal(); { .. 원하는 GUI 배치 내용물 입력 } EditorGUILayout.EndHorizontal(); // Layout을 세로로 배치한다. EditorGUILayout.BeginVertical(); { .. 원하는 GUI 배치 내용물 입력 } Edit..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxceQg%2FbtssHh7CDLT%2F7Jnf9vCwok360t9yq77G5K%2Fimg.png)
EditorGUILayout 함수 using UnityEngine; using UnityEditor; public class TestEditorWindow : EditorWindow { int intValue; float floatValue; Color colorValue; Gradient gradientValue = new Gradient(); Rect rectValue; Vector3 vector3Value; Vector3Int vectorInt3Value; UnityEngine.Object objectValue; string passwordValue; string tagValue; UnityEngine.ParticleSystemCollisionType enumValue; private void On..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvS3kI%2FbtstlkJOD2k%2FtCfgDwNa6XdTEEelIPj5Ik%2Fimg.png)
스크립트 기본 준비 기본적으로 GUI를 사용하기 위해서는 2가지 사전 준비가 필요하다. 1. 스크립트에 UnityEditor를 사용함을 명시한다. 2. 해당 클래스의 부모를 EditWindow로 지정한다. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; // UnityEditor 사용 public class TestEditorWindow : EditorWindow // EditorWindow를 부모로 지정 { } 유니티 Scene에 새로운 스크립트 TestEditorWindow를 만들어 위와 같이 수정한다. 새로운 윈도우 만들기 GUI를 만드려면 그 GUI를 그리기 위한 도화지(..
개요 대칭키 암호를 이용하는 하나의 인증체계 장점 : 공개키 기반구조(PKI)가 요구되지 않는다. LAN과 같은 소규모 네트워크에서 사용할 수 있도록 설계 인증 및 비밀성과 무결성이 요구되는 세션키를 생성하기 위해 이용 원칙적으로 어떤 대칭암호든 커버로스로 이용 가능 → 하지만, 오늘날에는 커버로스 대신 DES가 쓰임 대칭키를 기반을 하지만 N명에 사용자에 대해 오직 N개의 키만 필요 기존 대칭키 기반 인증체계에서는 N명의 사용자가 있으면 N(N-1)2 * N^2 의 키 필요 → 대칭키 기반 인증에서는 이용자와 키의 개수는 정비례 관계가 아님 커버로스는 가능한 이유? 제3의 신뢰성 있는 기관(TTP)에 의존하기 때문 커버로스 TTP는 시스템 보안의 핵심 구성요소 → 반드시 보호 필요 → 보안상 관건 키분..