1) 문제

https://school.programmers.co.kr/learn/courses/30/lessons/134240

예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.

입출력 예
food result
[1, 3, 4, 6] "1223330333221"
[1, 7, 1, 2] "111303111"

2) 풀이

레벨 1의 간단한 문제였다.
문제에는 사용하지 못하는 음식에 대한 설명이 있지만 굳이 고려할 필요는 없는 요소였다.
단순히 해당 칼로리(인덱스)의 개수를 2로 나눠 반복해서 answer에 append 시켜주면 해결된다.

3) 코드

string solution(vector<int> food) {
    string answer = "";

    // while 반복문
    // 1부터 증가해서 it이 size-1과 같아지면 '0' 추가하고 감소시작
    // it이 0이 되면 종료
    int it=1;
    bool sign = true;
    while (it > 0) {
        int limit = food.size();
        if (it == limit) {
            answer += "0";
            --it;
            sign = false;
        }
        if (sign) {
            for(int i=0; i<food[it]/2; i++) {
                answer += to_string(it);
            }

            ++it;
        }
        if (!sign) {
            for(int i=0; i<food[it]/2; i++) {
                answer += to_string(it);
            }
            --it;
        }
    }
    return answer;
}

4) 고찰

food vector의 길이가 9였기 때문에 그냥 아무 생각없이 vector를 왕복했는데
생각해보니 0을 기준으로 같은 순서기 때문에 한 번만 돌고
0을 append하고 reverse해서 붙였어도 되었다.

침착맨 방송에 이동진 평론가가 출연해서 하신 멘트가 기억에 남아서 기억하고자 써본다.

 

요즘엔 책 말고 영화나 드라마로 이야기를 표현하는 수단이 미디어로 확장 되는데

영화 감상이 책 읽는 것 만큼 교양과 지혜를 쌓는데 도움이 될까요?

 

라는 질문에 대한 답변으로 이동진 평론가는 이렇게 답했다.

 

영화는 술이고 책은 물이다.

영화는 우리를 뜨겁게 만들고, 책은 우리를 차갑게 만든다.

그리고 이성은 기본적으로 차갑다.

영화는 결코 책을 이길 수 없다.


영화는 감정적으로 시청자를 뜨겁게 만들고 책은 생각이 정리되면서 차갑게 만든다.

교양과 지혜는 이성적인 것으로서 이를 쌓는데 영화는 결코 책을 넘어설 수 없다.

 

그저 내 생각일 뿐이지만 이런 말이지 않았을까

 

영화는 술이고 책은 물이다. 라는 멘트를 들었을 때만 해도

내가 생각했던 것은 '그래 영화는 가끔 재미로 보는 것이고 책은 꾸준하게 봐야지' 였는데

뒤에 따라오는 멘트가 내 뒤통수를 쳤다.

 

단순했던 내 생각을 깨뜨리는 한 방도 있었지만

영화와 책의 차이에 대해 다시 생각해보게 되는 점이 컸다.

 

영화는 보는 사람이 이입해서 감정을 들끓게 되는 것이 있지만

책은 영화보다는 제 3자의 입장에서 보게 되면서 생각이 정리되는 느낌이 있다는 것이 와닿게 되는 표현이었다.

현재 업무 진행 방식을 정리해두려고 한다.

 

1. 프로젝트 할당

Project owner에 의해 각각의 스크럼은 프로젝트를 할당받는다.

할당받는 프로젝트는 여러가지 기준이 있다.(사업자 요구, back log, 스크럼의 competency)

 

2. Feasibility check

사실상 개발보다 더 많은 시간이 들어가는 과정이다.

다양한 팀을 경험해보지는 않았지만 feaibility check는 스크럼마다 분석하는 방식이 다른 것 같다.

 

일단 현재 팀에서의 방식은 feasibility check 과정에서 pre coding까지 진행한다.

pre coding을 하기 위해 front runner는 user story를 정의하고 각각의 US에 인원이 할당된다.

이 과정에서 legacy impact을 확인하고 90% 이상의 코드를 미리 구현한다.

 

그리고 pre coding을 하면서 test scenario를 동시에 정리한다.

엄밀히 말하면 unit test를 통해 디자인 수정을하고 코드 리팩토링을 하는 건 아니지만

TDD(Test Driven Development)의 한 방식이라고 생각한다.

어쨌든 TDD에서 중요한 것은 개발과 테스트가 유기적으로 연결이 되어 코드의 퀄리티를 높이는 것이라고 생각한다.

 

3. Development

워낙 오래된 회사이다 보니 테스트 관련 자동화가 굉장히 잘되어있다.

code checker도 사용하고 있고...

line cover는 특별한 이유가 없는 이상 필수적이다. line cover 때문에 unit test 구현 시 test만을 위한 case가 추가되는 경우가 간혹 있지만.. 이건 개발툴로 인해 어쩔 수 없는 부분이다.

그리고 commit을 push하기 전에 자체적인 node level test를 구현하면서 검증 후에 push해야하고

integration 과정 중에도 jenkins를 이용하여 merge하기 전에 꼭 통과해야하는 test들이 수행된다.

 

 

 

'Diary > for dev' 카테고리의 다른 글

github.io 블로그 만들기  (0) 2022.08.25

github.io repo를 만들어서 블로그 자체를 만드는 것 까지는 검색만으로도 많이 보인다.

하지만 여기서 다수의 블로그에서

gem install jekyll bundler

command를 통해 jekyll을 설치하라는데 애초에 gem 명령어가 먹히지 않는다...찾아보니 아마 Ruby를 설치하지 않아서 생기는 문제 같다.아무튼 따로 jekyll을 설치하고 어느정도 블로그 세팅까지 정리해보고자 한다.

 

1. github.io repository 만들기

 

워낙 간단해서 따로 설명할 부분은 없다.

다만 본인의 user name이랑 꼭 동일해야 한다.

[user_name]/[user_name].github.io

처음에 이걸 모르고 다르게 만들었었다..

 

그럼 이제 본인 github.io url로 접속할 수 있을 것이다.

물론 아무 내용은 없겠지만

 

2. Ruby 설치하기

 

https://velog.io/@dd9s2/Github.io-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Jekyll-%EC%84%A4%EC%B9%98-Windows

 

[Github.io 시작하기] Jekyll 설치 (Windows)

Github.io로 블로그를 옮겨보려고 한다. 가장 먼저, Jekyll을 설치해보자. jekyll을 설치하기 전, Ruby를 설치해야 한다. 나는 Ruby를 처음 사용해보는데, Docs에 따르면 2.7.X 버전을 사용하는 것을 추천한

velog.io

위 블로그를 참조했다.

 

https://rubyinstaller.org/downloads/

여기서 2.7.x 버전의 Ruby with dev kit을 선택해서 설치한다.

마지막에 Run 'ridk install' to set up MSYS2 and developemnt toolchain 꼭 체크할 것

 

그럼 cmd 창이 뜨는데 엔터 누르면 설치를 시작한다.

새로 cmd를 열어서 ruby -v를 입력하면 버전이 나온다.

여기서 문제는 vscode에서 연 터미널에서는 안먹힌다. 뭔가 추가 설정을 해줘야 하는거 같다.

그냥 vscode 재실행하니까 된다.

 

3.

gem install bundler jekyll

입력하면...

경로가 C:\Users\???? 이러면서 에러 발생.. 한글지원이 안된다

 

다행히 참고한 블로그에 문제 해결방법이 있었다.

터미널에서

chcp 65001

입력하고 다시 설치하니까 진행이 된다.

다음부터는 window도 계정명을 영어로 해야겠다.

 

 

4. 본격적으로 jekyll 생성하기

 

4-1.

jekyll new ./ --force

--force 옵션은 없어도 되는데 난 이미 해당 디렉토리에 파일이 있어서 옵션을 줬다.

4-2.

bundle install

4-3. Jekyll 을 로컬서버에 띄우기

bundle exec jekyll serve

로컬 Jekyll 서버 주소

5. 

push하고 다시 github.io 로 접속해보면 아래와 같이 나온다!

 

이제 github.io를 이용해서 TIL 내용들을 올릴 예정이다.

티스토리는 어떻게 활용할지 좀 고민해봐야겠다.

 

6. Jekyll admin 설치하기

Gemfile을 열어 제일 마지막에 

gem 'jekyll-admin', group: :jekyll_plugins

를 입력하고 저장

bundle install

을 실행한다.

그리고 

http://127.0.0.1:4000/admin

를 접속하면 admin 화면이 뜬다.

admin에서 티스토리처럼 포스팅을 할 수 있다.

 

 

 


https://100sang.net/292

 

[GitHub] Jekyll 블로그 테마 설치하기 - Just The Docs

오랫만에 github repo 정리하다가 Jekyll 테마 중 마음에 드는 테마를 발견해서 블로그용으로 세팅을 해보기로 하였습니다. https://jekyllthemes.io/theme/just-the-docs Just The Docs – Responsive documentation Jekyll them

100sang.net

 

공부한 내용을 정리하기 위한 블로그를 만드려고 했는데 jekyll 공부하다가 시간을 더 뺏길 것 같은 느낌..

그래서 테마를 사용하기로 했다.

'Diary > for dev' 카테고리의 다른 글

현재 개발 업무 진행 방법  (0) 2022.09.27

 Window -> 2D -> Tile Palette : 타일을 사용하기 위해 모아둔 프리펩

 

Create New Palette로 pallete를 생성

Sprite에서 지형 sprite를 모두 선택해서 Tile Pallete에 드래그한다.

그리고 Edit을 누르고 화살표 모양을 누르면 타일을 선택할 수 있다.

그리고 그림들을 움직여서 다음처럼 정렬해줬다.

 

정렬된 tile map

이 pallete를 이용해서 brush로 맵을 쉽게 만들수 있다.

 

tile에 사용된 sprite의 sprite editor를 이용해서 Custom Physical Shape에서 물리 모양을 조절할 수 있다.

이 때 타일팔레트에서 삭제하고 물리 모양 편집을 하는 것이 안전하다. 편집된 sprite의 물리모양이 tile pallete에 적용이 안될 수 있기 때문.

 

이번 강의는 타일을 사용해서 맵을 구성하는 방법에 대한 내용이었다.

코딩을 하거나 딱히 어려운 것들은 아니었기 때문에 딱히 추가할 내용은 없을 것 같다.

'Unity' 카테고리의 다른 글

[Unity] 점프 구현하기  (0) 2022.08.08
[Unity] 플레이어 이동 구현하기  (0) 2022.08.06
[Unity] 프로젝트 생성과 github을 이용한 버전 관리  (0) 2022.08.02
Unity의 시작  (0) 2022.08.02

점프 설정하는 방법은 

 

Update 함수에 아래 코드를 추가해 주면 된다.

        //Jump
        if (Input.GetButton("Jump"))
        {
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
        }

그럼 Player Move 스크립트 inpector에서 Jump Power를 설정할 수 있는 칸이 생긴다.

 

이 때 내려오는 속도가 너무 느리다면 Rigidbody 2D에서 Gravity 값을 조절해도 되고

Edit -> Project setting 에서 gravity Y값을 변경해도 된다.

 

애니메이션은 동일하게 만들고 다만 점프는 반복하면 안되기 때문에 loop time 옵션은 체크 해제해준다.

 

RayCast : 오브젝트 검색을 위해 Ray를 쏘는 방식

Debug.DrawRay() : 오브젝트에서 Ray를 쏘는 함수

RayCastHit : Ray에 닿은 오브젝트

RayCastHit의 콜라이더 변수로 검색 확인 가능

 

Layer Mask : 물리 효과를 구분하는 정수

 

레이캐스트 부분 복습 필요..

영상과 좀 다른 부분도 있고 이해안가는 부분도 있다.

 

        //Landing Platform
        if(rigid.velocity.y < 0) // y축 속도가 음수인 경우 = 점프하고 내려오는 순간
        {
            Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0)); //레이를 그린다.
            //현재 포지션에서 LayerMask Platform을 검색한다.
            RaycastHit2D rayHit = Physics2D.Raycast(rigid.position,
                                                    Vector3.down, 1,
                                                    LayerMask.GetMask("Platform"));
            //rayHit에 충돌이 있는 경우
            if (rayHit.collider != null)
            {
                //충돌한 오브젝트와의 거리가 0.5 이하인 경우
                if (rayHit.distance < 0.5f)
                {
                    //Debug.Log(rayHit.collider.name);
                    //isJumping을 false로 setting
                    anim.SetBool("isJumping", false);
                }
            }
        }

 

이동하다가 점프를 한 상태에서 이동키를 떼지 않는 경우 점프 state에서 idle로 넘어가지 않는다.

아직 원인은 모르겠다. 추후 확인해서 업데이트해봐야겠다.

https://www.youtube.com/watch?v=Z4iULRbiSTg&list=PLO-mt5Iu5TeZGR_y6mHmTWyo0RyGgO0N_&index=3&t=51s 

 

위 영상을 보고 따라가는 중이다.

 

Assets 폴더에 Scripts 폴더를 만들어주고

PlayerMove 스크립트 파일을 생성한다.

그 파일을 Player sprite에 드래그 해주면 Inspector에 스크립트 창이 생긴다.

스크립트 이름을 더블클릭해주면 VS에서 소스를 수정할 수 있다.

 

코드를 짜다가 문제가 하나 있었는데

영상에서 보면 Rigidbody2D라던가

GetComponent같은 것들은 이미 유니티에서 구현이 된 클래스나 기능들인 것 같은데

나는 자동완성이 되지 않았다.

그래서 알고봤더니 아래 블로그와 같은 문제였다!

https://blog.naver.com/PostView.nhn?blogId=whatsuppapa&logNo=222326681454&categoryNo=24&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView 

 

유니티, 비주얼스튜디오 자동완성(인텔리센스)가 안될때 해결 방법.

안녕하세요. 주투리아입니다. 어저께 컴퓨터가 먹통이 되면서 윈도우를 초기화했더니 설치되었던 프로그램...

blog.naver.com

영상에서 추가한 이동 로직은 다음과 같다.

최대한 영상에 나오는 설명들을 주석에 추가했다..

일단 C#도 공부를 좀 해야할 필요가 있고 유니티에서 제공하는 기능들도 더 알아봐야할 것 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    //public 변수로 설정하면 Inspector에서 실행 중에도 값 변경 가능
    public float maxSpeed;
    Rigidbody2D rigid;

    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        
    }


    void FixedUpdate()
    {
        //FixedUpdate는 보통 1초에 약 50회 돈다.
        //1초 동안 방향키를 누르고 있으면 AddForce가 50번 입력된다.
        //Move By Key Control
        float h = Input.GetAxisRaw("Horizontal");
        rigid.AddForce(Vector2.right * h, ForceMode2D.Impulse);
        //Vector2의 첫번째 파라미터는 x축 속도, 두번째 파라미터는 y축 속도?
        if (rigid.velocity.x > maxSpeed) // Right Max Speed
            rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);
        else if (rigid.velocity.x < maxSpeed*(-1)) // Left Max Speed
            // 왼쪽은 마이너스 속도기 때문에 맥스 스피드에 -1 곱
            rigid.velocity = new Vector2(maxSpeed*(-1), rigid.velocity.y);
    }
}

 

그리고 Assets 폴더에서 우클릭해서

Create -> 2D -> Physics Material 2D를 생성해서 Friction(마찰력)을 0으로 설정하고

모든 floor를 선택하고 Box Collider 2D에서 Material에 새로 만든 Physics Material을 드래그해서 적용해준다.

그럼 플레이어가 방향키를 한번만 눌러도 미끄러진다. 마찰력이 없기 때문에

이렇게 해주는 이유는 다음 강의에서 경사로를 올라가기 위해서라고 한다.

이 부분은 실제로 이 방법 밖에 없는건지 한번 찾아봐야겠다.

 

다음은 마찰력이 없는 것을 보완하기 위해 공기저항을 추가하는 것이다.

플레이어를 선택하면 Rigidbody 2D에 Linear Drag가 있다. 말그대로 해석하면 선형저항 같은데

이게 2D 게임에서는 공기저항같은 것으로 표현되나 보다.

공기저항이기 때문에 점프하고 공중에서 내려올 때도 천천히 내려오게 만들기 때문에 너무 큰 값을 주면 안된다.

 

Rigidbody 2D에서 Freeze Rotation에서 z축을 체크를 꼭해야 플레이어가 넘어지지 않는다.

처음에 키 입력을 하고 나서 좌우로 막 움직이니 플레이어가 넘어지고 날라가고 그랬는데 이 옵션을 줘야지 그런 현상을 막을 수 있나보다.

 

다음은 애니메이션 적용하기

방향키를 입력받을 때 Run 애니메이션 적용하는 방법이다.

Parameter 탭에서  +를 누르면 타입이 나오는데 이것이 애니메이션 state를 바꿀 때 필요한 변수의 타입이라고 한다.

여기서 변수를 하나 추가해주고 transition을 누르면 inspector에서 Conditions에서 +를 누르면 추가했던 파라미터를 설정할 수 있다.

그리고 아래 코드에서 보면 업데이트 부분에서 anim.setBool함수로 이용하고 있다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    //public 변수로 설정하면 Inspector에서 실행 중에도 값 변경 가능
    public float maxSpeed;
    Rigidbody2D rigid;
    SpriteRenderer spriteRenderer;
    Animator anim;

    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>();
        anim = GetComponent<Animator>();

    }

    //단발적인 키 입력은 Update에서 하는 것이 좋다
    void Update()
    {
        //Stop speed
        if(Input.GetButtonUp("Horizontal"))
        {
            //normalized : 벡터 크기를 1로 만든 상태(단위벡터) GetAxisRaw랑 비슷하다?
            //normalized에 곱해주는 값이 크면 버튼을 떼도 미끄러진다.
            rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.001f, rigid.velocity.y);
        }

        //Direction Sprite
        //flipX는 bool값으로 default는 false
        if (Input.GetButton("Horizontal"))
        {
            spriteRenderer.flipX = Input.GetAxisRaw("Horizontal") == -1;
        }

        //Run animation 적용
        if (Mathf.Abs(rigid.velocity.x) < 0.3)
        {
            anim.SetBool("isRunning", false);
        }
        else
        {
            anim.SetBool("isRunning", true);
        }
    }

    //지속적인 키 입력은 FixedUpdate에서 하는 것
    void FixedUpdate()
    {
        //FixedUpdate는 보통 1초에 약 50회 돈다.
        //1초 동안 방향키를 누르고 있으면 AddForce가 50번 입력된다.
        //Move Speed
        float h = Input.GetAxisRaw("Horizontal");
        rigid.AddForce(Vector2.right * h, ForceMode2D.Impulse);
        //Vector2의 첫번째 파라미터는 x축 속도, 두번째 파라미터는 y축 속도?
        //Max Speed
        if (rigid.velocity.x > maxSpeed) // Right Max Speed
            rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);
        else if (rigid.velocity.x < maxSpeed*(-1)) // Left Max Speed
            // 왼쪽은 마이너스 속도기 때문에 맥스 스피드에 -1 곱
            rigid.velocity = new Vector2(maxSpeed*(-1), rigid.velocity.y);
    }
}

'Unity' 카테고리의 다른 글

[Unity] 타일맵으로 플랫폼 만들기  (0) 2022.08.09
[Unity] 점프 구현하기  (0) 2022.08.08
[Unity] 프로젝트 생성과 github을 이용한 버전 관리  (0) 2022.08.02
Unity의 시작  (0) 2022.08.02

Sprite를 만들기 위한 Asset을 하나의 파일을 나누어서 구성을 할 수 있다고 한다.

Sprite editor 버튼을 누르면 한 파일을 slice 할 수 있다. 이 것을 아틀라스라고 한다.

Sprite editor

이게 중요한 이유는 batch라는 것 때문인데 게임의 그래픽을 그릴 때 메모리와 CPU를 사용한 횟수를 의미한다고 한다.

하나의 아틀라스에서 가져오는 경우 batch가 증가하지 않는다. 다른 말로 각각의 object를 모두 다른 파일에서 가져오면 batch가 많아져 리소스를 많이 잡아먹을 수 있다.

모바일 게임에서는 절대 필수라고 한다.

 

2. 애니메이션

애니메이션을 만들 파일을 드래그 선택해서 그대로 애니메이션을 넣고 싶은 sprite에 넣으면 애니메이션 파일이 생성된다.

그리고 해당 sprite에 자동으로 Animator component가 생긴다.

 

Window -> Animation 을 열면 애니메이션의 프레임을 조정할 수 있다.

그리고 애니메이션 파일의 옵션에서 Loop time을 체크 해제하면 반복하지 않는다.

여기서 Add Property를 이용하여 추가적인 이벤트들을 설정할 수 있는 것 같다.

Window -> Animator를 열면 state machine 같은게 나온다.

여기서 처음에 run animation을 만들었기 때문에 Entry에서 run으로 연결되어 있는데 idle animation을 default로 하고 싶다면 우클릭해서 Set as Layer Default State를 누르면 된다. 아래 캡처에서는 이미 default로 설정되어 있어 비활성화 되어 있다.

그리고 여기서 state를 누르면 Speed를 조정할 수 있다.

+ Recent posts