내일배움캠프 20일차 TIL : 유니티 입문 팀 프로젝트 5일차, 제네릭 특강, 알고리즘 시작

woollim·2024년 10월 21일
0

내일배움캠프TIL

목록 보기
19/36
post-thumbnail

■ 학습 개요

오늘 계획

  • 유니티 입문 팀프로젝트 -> 발표자료 준비
  • 첼린지 꾸준 실습(2주차 첫번째)
  • 제네릭 특강
  • 매일 알고리즘 문제1일차 풀이(C++)

학습 회고

  • 오늘은 꾸준실습 Q1은 풀 수 있었다.
  • 제네릭 특강은 복습이 필요하다.
  • 오랜만에 C++로 문제를 풀려하니 어렵다. 앞으로도 꾸준히 풀어야겠다.


■ 제네릭 특강

(주말에 추가)



■ 꾸준실습 2주차 1일차

○ 구현 기능

  • Q1. Input Rebinding
    • 구현사항 0 : (완료)Input System을 import 하고, Input Action Challenge를 구성하세요.
    • 구현사항 1 : (완료)InputRebinder 클래스의 actionAsset에서 Space 액션을 찾고 활성화합니다.
    • 구현사항 2 : (완료)InputRebinder 클래스의 RebindSpaceToEscape 메소드를 ContextMenu 어트리뷰트를 활용해서 인스펙터창에서 우클릭으로 실행할 수 있도록 합니다.
    • 구현사항 3 : (완료)InputRebinder 클래스의 RebindSpaceToEscape 함수는 기존 Spacebar 키를 입력하던 액션을 Escape키를 입력했을 때 발생하도록 합니다. 이와 관련된 레퍼런스 문서를 읽고, 완성하시오.


○ 코드

public class InputRebinder : MonoBehaviour
{
    public InputActionAsset actionAsset;
    private InputAction spaceAction;
    private InputAction escapeAction;

    void Start()
    {
        // [구현사항 1] actionAsset에서 Space 액션을 찾고 활성화합니다.
        spaceAction = actionAsset.FindAction("Space");

        // Space 액션 활성화
        spaceAction.Enable();
    }

    // [구현사항 2] ContextMenu 어트리뷰트를 활용해서 인스펙터창에서 적용할 수 있도록 함

    void OnEnable()
    {
        // Esc 키에 대한 액션 생성
        escapeAction = new InputAction(binding: "<Keyboard>/escape");

        // Esc 키 입력 이벤트 등록
        escapeAction.performed += OnEscapePressed;

        // 액션 활성화
        escapeAction.Enable();
    }

    private void OnEscapePressed(InputAction.CallbackContext context)
    {
        // Esc 키 눌렀을 때 실행
        RebindSpaceToEscape();
    }

    public void RebindSpaceToEscape()
    {
    // [구현사항 3] InputRebinder 클래스의 RebindSpaceToEscape 함수는 기존 Spacebar 키를 입력하던 액션을 Escape키를 입력했을 때 발생하도록 합니다.
        if (spaceAction == null)
            return;
        actionAsset.FindAction("Space").ApplyBindingOverride("<Keyboard>/escape");

        Debug.Log("Done!");
    }

    void OnDestroy()
    {
        // 액션을 비활성화합니다.
        spaceAction?.Disable();
        escapeAction?.Disable();
    }
}


■ 매일 알고리즘 문제1일차

원하는 문자열 찾기(하)

  • 문제링크
  • 내 풀이
    • find, transform 활용하여 두 문자열을 모두 소문자로 만들고 find로 문자열 포함 여부 확인
    • s1.find(s2)
      -s1 안에 s2가 있으면 부분 문자열 시작 index반환
      -없으면 'string::npos' 상수 반환
    • transform(첫 번째 입력 반복자, 마지막 입력 반복자, 첫 번째 출력 반복자, 변환 함수);
      -첫 번째 입력 반복자 : 변환을 시작할 범위의 첫 번째 요소를 가리키는 반복자. (예: lowerStr.begin())
      -마지막 입력 반복자 : 변환을 끝낼 범위의 마지막 요소 다음을 가리키는 반복자. (예: lowerStr.end())
      -첫 번째 출력 반복자 : 결과를 저장할 시작 위치. (예: lowerStr.begin())
      -변환 함수 : 각 요소에 적용할 변환 함수. 여기서는 ::tolower처럼 문자를 소문자로 변환하는 함수가 사용될 수 있음
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string toLowerCase(const string& str) {
    string lowerStr = str;
    transform(lowerStr.begin(), lowerStr.end(), lowerStr.begin(), ::tolower);
    return lowerStr;
}

int solution(string myString, string pat) {
    int answer = 0;

    if (myString.length() >= pat.length())
    {
        if (toLowerCase(myString).find(toLowerCase(pat)) != string::npos)
            answer = 1;
    }
    return answer;
}

  • 다른사람 풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(string myString, string pat) {
    transform(myString.begin(),myString.end(),myString.begin(),::toupper);
    transform(pat.begin(),pat.end(),pat.begin(),::toupper);

    return myString.find(pat) != string::npos;
}

크기가 작은 부분문자열(중)

  • 문제링크
  • 내풀이
    • 처음엔 stoi를 사용했으나 변환 할 수 없을정도로 큰 수가 들어올때 예외처리를 하기 때문에 오류가 생김
    • stoll : long long 타입으로 변환해 더 큰 범위의 숫자를 처리할 수 있음
#include <string>
#include <vector>

using namespace std;

int solution(string t, string p) {
    int answer = 0;
    long long pInt = stoll(p);
    for (int i = 0; i < t.length() - p.length() + 1; i++)
    {
        string temp1 = t.substr(i, p.length());
        if (stoll(temp1) <= pInt)
            answer++;

    }
    return answer;
}

문자열 나누기(상)

  • 문제링크
  • 내풀이
    • substr 활용
    • substr(size_t pos) : 문자열의 pos 위치부터 끝까지의 하위 문자열을 반환
    • substr(size_t pos, size_t len) : 문자열의 pos 위치부터 len 길이만큼의 하위 문자열을 반환
#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;

    while (s.length() >= 2)
    {
        int same = 0;
        int diff = 0;

        for (int i = 0; i < s.length(); i++)
        {
            if (s[0] == s[i])
                same++;
            else
                diff++;

            if (same == diff)
            {// 일치하면 문자열 분리
                s = s.substr(i + 1, s.length() - (same + diff));
                answer++;
                break;
            }
        }
        if (same != diff)
        {// 포문 이후에도 일치하지 않는다면 전체가 하나다
            answer++;
            break;
        }
    }

    if (s.length() == 1)
    {
        answer++;
    }

    return answer;
}

  • 다른사람 풀이
    • while 문 없이 for문 하나로 문장 비교를 끝냄
#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    int xCount = 1;
    int yCount = 0;
    char x = s[0];

    for (int i = 1; i < s.size(); i++) {
    // xCount = 1 로 시작하되 i도 1로 시작
        if (s[i] == x) {
            xCount++;
        } else {
            yCount++;
        }

        if (xCount == yCount) {
        // 일치하면 0으로 초기화, 그대로 다음 문자로 시작 문자 변경
            xCount = 0;
            yCount = 0;
            answer++;
            x = s[i + 1];
        }
    }

    if (xCount > 0) answer++; // 포문을 다 돌고나서도 0이 아니라면 아직 마지막 문장이 있는 것

    return answer;
}

0개의 댓글