241129

lililllilillll·2024년 11월 29일

개발 일지

목록 보기
5/350

✅ 오늘 한 일


  • 백준 1문제 풀기
  • 'C# 교과서' 읽기
  • 모바일 출시 준비


🎮 Frog on Lotus


해야할 것

  • 모바일 입력 대응
    • 터치 해도 클릭되도록
      뒤로 가기 누르면 게임 일시정지되고 진짜 나갈거냐고 물음
  • 메인 메뉴 만들기
  • 로컬 멀티 추가 (전체 스코어는 협동인데 개별 스코어는 경쟁)
  • 랭킹 시스템 다듬기

모바일 디버거 설정

https://blog.naver.com/whatsuppapa/222301648109

모바일 디버그 환경 세팅
했는데 안됨

https://www.youtube.com/watch?v=L6CkG2sgupA

유튜브 찾아봤더니

이거 깔려있는지 보라고 함. 안 깔려있음.
깔고 다시 해봄. 안됨.
껏다 다시 킴. 안됨.

안드로이드 스튜디오 삭제했다가 다시 깔아봤는데, 역시 안됨.
근데 로그를 보니 뭔가 찍힘.

gpt한테 주니까 adb 뭐시기가 잘못됐다고 함.

분명 adb 뭔가가 권한 요청했고 거절 눌렀던 기억이 있는데 그것 때문이었나봄.

방화벽 찾아가서 권한 풀어줌. 안되길래 유니티랑 unity remote 둘 다 껐다 다시 킴.

됨.



⚔️ 백준


30460 스위치

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

def sum_three(sb,i):
    return sb[i]+sb[i+1]+sb[i+2]

def left_num(idx,i):
    left = 0
    for j in range(0,i):
        left += score_board[idx+j]
    return left

def max_val(sb,idx,val):
    global N

    if(idx+3 >= N):
        for i in range(idx,N):
            val += sb[i]
        return val

    # i는 이번 인덱스에서 2배를 시킬 세계선의 기준
    for i in range(2):
        if(idx+i < N-2):
            if sum_three(sb,idx+i) > 0:
                val = max(val,max_val(sb,idx+i+3,val) + 2*sum_three(sb,idx+i) + left_num(idx,i))
                print('max_val 후보 : ',val)
            else:
                val = max(val,max_val(sb,idx+i+3,val) + sum_three(sb,idx+i) + left_num(idx,i))
    
    return val

N=int(input())
score_board=list(map(int,input().split()))
print(max_val(score_board,0,0))

val = max(val,max_val(sb,idx+i+3,val) + 2*sum_three(sb,idx+i) + left_num(idx,i)) 여기서 max_val에 val을 또 넣은게 이상해지는 요인이었다.

val을 교체해버렸는데 거기에 또 넣으면 어떡함?

모든 선택지들의 값들을 비교하는게 원래 목적이었는데,
이건 선택지들의 값들을 전부 최종 결과에 더해가고 있었다.

def max_val(sb,idx):
    global N
    val = 0

    if(idx+3 >= N):
        for i in range(idx,N):
            val += sb[i]
        return val
    
    val_to_add = -float('inf')

    # i는 이번 인덱스에서 2배를 시킬 세계선의 기준
    for i in range(2):
        if(idx+i < N-2):
            if sum_three(sb,idx+i) > 0:
                val_to_add = max(val_to_add,max_val(sb,idx+i+3) + 2*sum_three(sb,idx+i) + left_num(idx,i))
                print('세계선 후보 : ',val_to_add)
            else:
                val_to_add = max(val_to_add,max_val(sb,idx+i+3) + sum_three(sb,idx+i) + left_num(idx,i))
    
    val += val_to_add
    return val

고치긴 했는데 한 가지 놓친 것이 있었다.
1 2 3 4가 있을 때, 1 2 3을 2배 한다고 해서 4를 2배 못하는 건 아님.

-2 0 1이어도 -2랑 0을 무시하고 1만 2배 해주면 최대가 됨.

나는 3개씩 2배에만 꽂혀서 이런 경우의 수를 생각 못 함.

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

def sum_three(sb,i):
    if(i+3 >= N):
        temp = 0
        for j in range(i,N):
            temp += sb[j]
        return temp
    else:
        return sb[i]+sb[i+1]+sb[i+2]

def left_num(idx,i):
    left = 0
    for j in range(0,i):
        left += score_board[idx+j]
    return left

def max_val(sb,idx):
    global N
    if (idx >= N): return 0

    val = 0
    val_to_add = -float('inf')    

    # i는 이번 인덱스에서 2배를 시킬 세계선의 기준
    for i in range(3):
        if(idx+i < N-2):
            if sum_three(sb,idx+i) > 0:
                val_to_add = max(val_to_add,max_val(sb,idx+i+3) + 2*sum_three(sb,idx+i) + left_num(idx,i))
                print('세계선 후보 : ',val_to_add)
            else:
                val_to_add = max(val_to_add,max_val(sb,idx+i+3) + sum_three(sb,idx+i) + left_num(idx,i))
    
    val += val_to_add
    return val

N=int(input())
score_board=list(map(int,input().split()))
print(max_val(score_board,0))

산으로 가고 있는 건지 물로 가고 있는 건지 모르겠지만
일단 오늘은 여기까지



📖 C# 교과서


18 배열 사용하기

18.1 컬렉션

컬렉션(collection) : 이름 하나로 데이터 여러 개를 담을 수 있는 그릇. C#에서 컬렉션은 array, list, dictionary 등이 있다.

18.2 배열

문자열에 직접 인덱서 사용하기

> "ABC"[0]
'A'

문자열 자체에 직접 인덱서 기호를 사용해서 문자를 뽑아낼 수도 있다.

> "ABC".GetType()
[System.String]
> "ABC[0].GetType()
[System.Char]

뽑아내면 Char 형식이 된다

18.3 배열 선언하기

> int[] numbers = new int[3];

18.4 1차원 배열

int[] intArray = new int[3] {1,2,3};

선언, 생성, 초기화를 동시에

int[] intArray = {1,2,3};

선언과 동시에 초기화할 때는 new와 배열형까지 생략 가능.

18.5 다차원 배열

int[] oneArray; // 1차원 배열 선언
int[,] twoArray; // 2차원 배열 선언
int[,,] threeArray; // 3차원 배열 선언

배열 선언할 땐 콤마를 기준으로 차원 구분

oneArray = new int[2] {1,2};
twoArray = new int[2,2] {{1,2},{3,4}};

차수별 배열 초기화 형태

배열 관련 Rank, Length 속성과 GetLength() 메서드 사용하기

arr.Rank // 3차원 배열이면 3
arr.Length // 배열 길이 반환
arr.GetLength(1) // 행의 개수
arr.GetLength(2) // 열의 개수

18.6 가변 배열

// [2][] 형태로 두 번째를 비워 두면 동적으로 자료 n개로 초기화 가능
int[][] zagArray = new int[2][];

19 함수 사용하기

함수의 목적은 코드 재사용이다.
Main() 메서드는 C#의 시작 지점을 나타내는 특수한 목적의 함수로 볼 수 있다.
C#에서는 함수를 부를 때 함수(function)보다는 메서드(method)로 표현한다.

19.2 함수 정의하고 사용하기

class FunctionDemo
{
  static void Show()
  {
      Console.WriteLine("Hello World");
  }
  
  static void Main()
  {
  	Show();
  }
}

19.3 매개변수와 반환 값

C#에서는 클래스 하나에 매개변수의 형식과 개수를 달리하여 이름이 동일한 함수를 여러 개 만들 수 있다.
이를 함수 중복 또는 함수 오버로드(overload)라 한다.

19.7 XML 문서 주석을 사용하여 함수 설명 작성하기

비주얼 스튜디오로 프로그램을 만들 때 특정 함수 사용법과 같은 설명을 표시하려면
/// <summary> ~ /// </summary> 형태로 주석 작성. 이게 XML 문서 주석이라는 거.
이렇게 써놓으면 해당 함수에 마우스를 올리거나 코드를 작성할 때 관련 설명을 볼 수 있다.

class SwitchExpression
{

    /// <summary>
    /// 두 수를 더하여 그 결괏값을 반환시켜 주는 함수
    /// </summary>
    /// <param name="a">첫 번째 매개변수</param>
    /// <param name="b">두 번째 매개변수</param>
    /// <returns>a + b 결과</returns>
    static int AddNumbers(int a, int b)
    {
        return a + b;
    }

    static void Main()
    {
        int a = 1;
        int b = 2;
        int c = AddNumbers(a, b);
        Console.WriteLine($"{a}+{b} = {c}");
    }
}

오 신기
근데 요즘 세상은 IDE가 좋아져서 별로 안 쓰지 않을까

19.8 기본 매개변수 (default parameter)

static void Log(string message, byte level = 1)

메서드 선언할 때 매개변수 선언 동시에 초기화하면
메서드 호출할 때 따로 지정하지 않아도 기본값 자동 설정
이를 default parameter 또는 optional argument라고 함.

19.9 명명된 매개변수 (named parameter)

static void Main()
{
	Sum(10, 20);
    Sum(first: 10, second: 20);
    Sum(second: 20, first: 10);
}

static void Sum(int first, int second)
{
	Console.WriteLine(fisrt+second);
}

named parameter를 사용하면 함수 호출할 때 필요한 매개변수 이름을 직접 지정할 수 있다.

19.10 함수 오버로드: 다중 정의

class MethodOverloadNumber
{
    static void GetNumber(int number)
    {
        Console.WriteLine($"Int32: {number}");
    }

    static void GetNumber(long number, int test)
    {
        Console.WriteLine($"Int64: {number}");
    }

    static void Main()
    {
        GetNumber(1234);
        GetNumber(1234L,0);
    }
}

매개변수로 넘어온 데이터의 자료형에 따라 해당하는 함수를 자동으로 호출.
매개변수의 개수가 달라도 문제 없이 알맞는 함수를 호출한다.

이것보다 더 간편하게 제네릭 프로그래밍 하는 방법은 없나?

19.12 함수 범위: 전역 변수와 지역 변수

전역 변수, 필드 : 클래스와 같은 레벨에서 선언된 변수
지역 변수 : 함수 레벨에서 선언된 변수

동일한 이름으로 전역 변수와 지역 변수를 같이 선언할 수 있다.
함수 내에서는 지역 변수를 쓰고, 지역 변수가 없으면 전역 변수를 쓴다.

C#에서는 전역 변수가 아닌 필드라는 단어를 주로 사용하며,
전역 변수는 언더스코어(_) 또는 m_ 접두사를 붙이는 경향이 있다.

19.13 화살표 함수: =>

화살표 연산자 (=>) 를 사용하여 메서드 코드를 줄일 수 있다.
이를 화살표 함수(arrow function) 혹은 람다 식(lambda expression)이라고 한다.

class ArrowFunction
{
    static void Main()
    {
        Hi();
        Multiply(3, 5);
    }

    static void Hi() => Console.WriteLine("안녕하세요.");
    static void Multiply(int a, int b) => Console.WriteLine(a * b);
}

19.15 로컬 함수

    static void Main()
    {
        void Display(string text)
        {
            Console.WriteLine(text);
        }

        Display("로컬 함수");
    }

C# 7.0 버전부턴 로컬 함수 기능을 제공한다.
함수 내에서만 사용하는 또 다른 함수를 만드는 것.

    static void Main()
    {
        // 로컬 함수 만들기
        int Add(int a, int b) => a + b;
        decimal Subtract(decimal x, decimal y) => x - y;

        // 로컬 함수 사용하기
        Console.WriteLine($"3+5 = {Add(3, 5)}");
        Console.WriteLine($"34.56 - 12.34 = {Subtract(34.56M, 12.34M)}");
    }

람다식을 로컬 함수로 선언한 예제

19.16 Main 메서드의 명령줄 인수

비주얼 스튜디오로 C# 콘솔 앱 프로그램 프로젝트를 만들면
Main(string[] args) 형태로 Main() 메서드가 생성됨.

args 배열은 명령 프롬프트에서 실행 파일 이름 뒤에 오는 문자열을 배열로 받아 사용할 수 있는 기능을 제공함.
이를 명령줄 인수(command line argument 또는 command line parameter)라고 하는데,
명령줄에서 넘어오는 매개변수를 하나씩 받아 사용할 수 있다.

    static void Main(string[] args)
    {
        foreach (string arg in args)
        {
            Console.WriteLine(arg);
        }
    }

비주얼 스튜디오에서 실행하면 아무 일도 안 일어나지만

Project1\ConsoleApp1\bin\Debug\net8.0>ConsoleApp1.exe "안녕 Hello" World
안녕 Hello
World

cmd로 경로 찾아가서 명령줄 인수 주면 foreach 문이 작동하면서 출력된다.

비주얼 스튜디오에선 직접 cmd에서 명령줄 인수 테스트 안해봐도
옵션으로 바로 설정할 수 있는 기능 제공한다는데 이건 패스. 필요할 때 읽으면 될듯.

profile
너 정말 **핵심**을 찔렀어

0개의 댓글