250103

lililllilillll·2025년 1월 3일

개발 일지

목록 보기
40/350

✅ 오늘 한 일


  • Random study
  • 백준 1문제 풀기


🎮 Random Study


Getting Goopy 모작

게임 로직은 제외하고 그래픽만 비슷하게 따라해보기

확대해보니 pixelated돼있었다.
Figma로는 구현하기가 어려울듯.
그럼 aseprite?

aseprite에서 한다고 되는게 아니라 적절한 해상도를 찾아야 픽셀이 살아있을듯

그리고 셰이더나 이런게 아니라 그냥 위아래 그어놓은 선 2개만으로 tiled하고 대각선으로 회전시키면 되지 않을까

그건 아닌듯 그러면 aseprite에서도 직선으로 그려짐

aseprite 사용법을 모르니까 간단한 레이어 작업도 버벅인다 강좌를 한 번 보자

aseprite 사용법

https://www.youtube.com/watch?v=7cz3msdSHDE

메뉴 기능

캔버스 사이즈 바꾸기 : Sprite > Sprite Size 또는 Canvas Size

  • Sprite Size : 그림 전체가 크기 조절
  • Canvas Size : 그림 크기는 안 바뀌고 캔버스만 잘림. 파란 선으로 크기 직접 조절 가능. 오른쪽 화살표 패드 누르고 크기 설정하면 잘리는 기준 위치 설정 가능.

원하는 영역만 남기고 자르기 : 영역 선택 > Sprite > Crop
그려진 영역만 남기고 영역 다듬기 : 레이어 선택 > Sprite > Trim

픽셀 단위로 격자 표시 : View > Show > Pixel Grid
원하는 크기로 격자 표시 : View > Show > Grid

  • 기본은 16x16, Edit > Preferences > Grid에서 크기 및 색상 조절. Pixel Grid 설정도 있다.

브러시

브러시 크기 조절 : -/+ 키
브러시 모양 변경 : 좌측 상단 크기 px 표시 왼쪽 아이콘
타블렛 필압 설정 : 크기 px 표시 오른쪽 2번째 아이콘

  • 손떨림 보정 : Stabilizer
    대각선에 겹쳐지는 부분 없애기 : 좌측 상단 Pixel-perfect 토글

Gradient

픽셀아트식 명암 표현 : 좌측 상단 No Dithering > Bayer Matrix 고르기

스포이드

Alt키를 눌러서 사용 가능

Move

그림이 속해있는 레이어 자동 선택 : 좌측 상단 Auto Select Layer 토글

선택

추가 선택 : 선택한 후 Shift 누르고 추가 선택
선택 취소 : 선택한 후 마우스 우클릭 누르고 영역 선택
(Magic Wand에서도 비슷하게 영역 추가 선택 및 취소 가능)

Magic Wand

Contigous 토글 : 인접한 색만 선택할건지 / 레이어 상의 비슷한 색깔들도 다 선택할건지
(Gradient, Paint Bucket에도 같은 토글 존재)

이미지 변형

레이어의 전체 이미지 선택 : Ctrl + T
이 상태에서 늘리거나 줄이거나 회전시키거나 비틀 수 있다

내가 지금 뭐 하고 있는건지 목적 의식을 잃은 것 같아서 일단 여기까지.

Cakewalk 미디 작곡 건드려보기

뭔가... 뭔가 찍히고 있음

재미는 있긴 한데 본격적으로 뭔가 만들려면 qwerty 키보드 말고 신디사이저나 마스터 키보드가 무조건 있어야할 것 같다는 생각밖에 안 듬.

당장은 그거 놓을 자리도 없고 음악이나 효과음은 우선순위가 저 뒤에 있어서 일단 보류. 가끔씩 멜로디 떠오르면 기록 정도는 해둘 수 있을듯.



📖 대마왕의 유니티 URP 셰이더 그래프


Part 01 | 셰이더 (Shader)

셰이더란 무엇인가?

프로그래머식 설명 : "3D 컴퓨터 그래픽에서 최종적으로 화면에 출력하는 픽셀의 색을 정해주는 함수"
아티스트식 설명 : "그래픽 데이터의 음영과 색상을 계산하여 다양한 재질을 표현하는 계산 방법"



⚔️ 백준


14500 테트로미노

def dfs(i,j,cnt):
    global N, M
    if not (0<=i<N and 0<=j<M): return 0
    if chk_board[i][j] == True: return 0
    if cnt == 4: return 0
    chk_board[i][j] = True
    add=0
    add=max(add,dfs(i+1,j,cnt+1))
    add=max(add,dfs(i-1,j,cnt+1))
    add=max(add,dfs(i,j+1,cnt+1))
    add=max(add,dfs(i,j-1,cnt+1))
    chk_board[i][j] = False
    return board[i][j] + add


N,M=map(int,input().split())
board = [list(map(int,input().split())) for _ in range(N)]
chk_board = [[False for _ in range(M)] for _ in range(N)]
res=0
for i in range(N):
    for j in range(M):
        res = max(res,dfs(i,j,0))
print(res)

백트래킹 dfs로 하려고 했는데 ㅗ모양 테트로미노를 검증해주지 못함

해당 사례에 대해서 하드 코딩 하는 거 아니면 이 방법으론 불가능. 특정 방향으로 이미 뻗어나갔다면 다른 방향으로 뻗어나오는 것이 불가능하기 때문.

def dfs(i,j,cnt):
    global N, M
    dfs=[(i,j)]
    res=0
    cnt=0
    layer=[]*4
    layer[0]=board[i][j]
    while(dfs):
        x,y=dfs.pop()
        layer[cnt]=board[x][y]

        cnt+=1

깊이별 layer를 나눠서 dfs를 하는 방식으로 해보려다가 시간이 너무 늦어져서 그냥 답 봄

N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range (N)]

v= [[0] * M for _ in range (N)] # dfs 방문 표시 배열

# 각 행에서 최대값을 찾은 뒤, 그 중 전체 배열의 최댓값을 찾음
mx = max(map(max, arr))

dx = [-1,1,0,0]
dy = [0,0,-1,1]

def dfs(n, temp, lst) :
    global ans

    # 가지치기
    if temp + (4-n) * mx <= ans : # 나머지 블럭이 모두 최댓값이어도 현재 ans 값보다 작다면 dfs 순회 정지
        return

    # 종료 조건
    if n == 4 :
        ans = max(temp, ans)
        return
    
    # 재귀 함수 호출 (자기 위치에서 뻗어나가기, 백트래킹)
    for cx, cy in lst :
        for i in range (4) :
            nx, ny = cx + dx[i], cy + dy[i]
            # 범위, 방문 검사
            if 0 <= nx < N and 0<= ny < M and v[nx][ny] == 0 :
                v[nx][ny] = 1
                dfs(n+1, temp + arr[nx][ny], lst + [(nx, ny)])
                v[nx][ny] = 0 # 방문표시 해제로 백트래킹

ans = 0
for i in range (N) :
    for j in range (M) :
        v[i][j] = 1
        dfs(1, arr[i][j], [(i,j)])

print(ans)

백트래킹으로도 풀 수 있었다.
말도 안되게 비효율적인 코드이긴 한듯. 뻗어나간 모든 점에 대해 매번 상하좌우를 다시 검사해본다.

https://cobokjang.tistory.com/9

그냥 ad-hoc 때리는 방법도 있었다.
다른 코드들도 살펴보니까 이게 정석이긴 한듯.

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

0개의 댓글