크래프톤 정글 TIL : 1003

lazyArtisan·2024년 10월 3일
0

정글 TIL

목록 보기
95/147

📚 Journal


이번주차 발제

컴공이나 공학은 학자들의 추상화된 아이디어를 구체화하는거

트랜스포머 2017 논문 2022 구현
개념 찾아내는 것도 어려운데 구현도 어렵다

근데 면접같이 남한테 설명할 땐 복잡한 디테일 버리고 추상적으로 설명하는게 좋다
그런데 그렇게 하려면 구체적인거 복기하면서 해야됨 그래야 추상화된 지식이 오래 남는다

1주 동안 나만무에 쓸 프레임웤 공부 목표

게임 할 사람들은 게임을 이용한 게시판?

시연보다는 취업하는데 도움이 되는 방향 (근데 발표는 못할수도)
발표하는 팀을 추려서 그 팀만 발표

리더의 1픽은 보장해준다

취업에는 코테가 중요하다
OS 못푼거 해보는 것도 좋긴 한데
알고리즘이 더 중요하다
(정글의 모든 과정 중 제일 중요)

유니티, 언리얼, 고도 등 엔진 쓰지 말고
WebGL 포팅한 web rendering framework으로

Q. WebGL을 관심있게 볼까?
일단 게임 하려면 팀원 전부 게임 쪽으로 가려는 사람이어야
5주 동안 유니티나 언리얼로 재밌고 좋은 결과물 -> 가능성이 작다
재밌는 게임을 만들어야 되는데 엔진 쓰면 기획이 더 중요
결과물이 재미가 떨어지더라도 엔진 안 쓰고 만들었으니까 감안해줄 것이라 생각
왜 도움이 되느냐? 신입 개발자는 프로그래밍 실력이 중요
경험보다는 역량이 중요

그럼에도 불구하고 유니티나 언리얼로 해보고 싶으면 끝나고 팀 짜서 해보는게
나중에 혼자나 두명이서 포폴 만들어보셈

Q. 게임은 기술적 챌린지가 뭐가 있을지?
그런 거 생각하지 말고 완성을 목표로



📝 배운 것들


🏷️ 파이썬 진수 변환 : int(str,rule)

int('0x11',16)
int('011',8)
int('11',10)

1번째 인자에는 숫자 문자열, 2번째 인자에는 진법

🏷️ 파이썬 문자열 찾기 : str.find(word)

str = 'abcabcabc'
index = str.find('b') # index는 1 (2번째 문자)

원하는 문자가 몇 번째에 있는지 찾는 함수



⚔️ 백준


📌 11653 소인수분해

N=int(input())
stack=[]
for i in range(2,N+1):
    while N%i == 0:
        N=N//i
        stack.append(i)
    if N==1:
        break
for s in stack:
    print(s)
if N!=1 and not stack:
    print(N)

N==1일 때 조건 놓쳐서 틀림
N==1이 되면 break하는 조건 넣었더니 최적화함

근데 오히려 N==1 조건 넣은게 더 느림
N==1인지 검사하는 연산을 넣어서 그런건가

def prime(n):
    if n == 2:
        return 2
    d = 2
    while d*d <= n:
        if n%d == 0:
            return d
        d += 1int(X,rule))
    return n

n = int(input())
if n > 1:
    while prime(n) != 1:
        print(prime(n))
        n //= prime(n)

파이썬 중 제일 빠른 코드.

스택에 넣었다가 다시 빼는 과정이 없어서 더 빠른건가?

📌 11720 숫자의 합

import sys
input=sys.stdin.readline
N=int(input())
K=input().strip()
s=0
for n in K:
    s+=int(n)
print(s)

N하고 K하고 두 개를 안 받고 N만 받아서 했다가 왜 안되지? 이러고 있었다
제정신이 아닌가?

📌 8595 히든 넘버

import sys
input=sys.stdin.readline
n=int(input())
word=input()
res=0
temp=''
cnt=0
for i in range(n):
    #정수로변환했더니1에서9사이였다면문자열더하기
    #문자열더하다가자리수7이상이면히든넘버가아님
    #문자열더하다가문자가나오면히든넘버가아님
    if '0'<=word[i]<='9':
        temp+=word[i]
        cnt+=1
        if cnt>=7:
            temp=''
    elif temp:
        res+=int(temp)
        temp=''
        cnt=0
if temp:
    res+=int(temp)
print(res)

'1'<=word[i]<='9'으로 했었다.
'0'을 빼먹었었음.

import sys

input=sys.stdin.readline

n=input()
strr=input()

for i in range(0, 26):
    chrr1=chr(i+65)
    strr=strr.replace(chrr1, ' ')
    chrr2=chr(i+97)
    strr=strr.replace(chrr2, ' ')

print(sum(map(int, strr.split())))

백준 제일 빠른 풀이

chr(i + 65): ASCII 코드 65부터 90까지의 값은 대문자 A부터 Z까지를 나타냅니다. 따라서 i에 65를 더하여 대문자를 생성하고, 문자열에서 그 문자를 모두 공백(' ')으로 대체합니다.

chr(i + 97): 마찬가지로 97부터 122까지는 소문자 a부터 z를 나타내므로, 소문자도 모두 공백으로 대체합니다.

이거 여러번 순회해야돼서 느리지 않음? 왜 이게 제일 빠른 풀이지

Python은 여러 내장 함수들이 C 언어로 구현되어 있어, 예상보다 성능이 우수할 수 있습니다. 특히 replace(), split(), map() 같은 함수들은 모두 C 레벨에서 최적화된 함수들이므로 효율적으로 작동합니다.

📌 Valid Perfect Square (LeetCode)

class Solution(object):
    def isPerfectSquare(self, num):
        """
        :type num: int
        :rtype: bool
        """
        i=1
        while i*i<=num:
            if i*i==num:
               return True 
            i+=1
        return False

무지성으로 일단 통과

import math
class Solution(object):
    def isPerfectSquare(self, num):
        l=0
        r=num
        while l<=r:
            mid=(l+r)//2
            square=mid*mid
            if square==num:
                return True
            elif square<num:
                l=mid+1
            else:
                r=mid-1
        return False
        """
        :type num: int
        :rtype: bool
        """

이게 제일 빠른 풀이라고 함.
아예 이분탐색을 조져버리네
큰 수에서 조건 만족하는 어떤 숫자 탐색 == 이분 탐색
공식처럼 나오면 좋은듯
물론 진짜 코테면 일단 제일 빨리 풀 수 있는걸로 작성한 후에 나중에 바꿔야되겠지만
제일 베스트는 이분 탐색이 노타임으로 나오는거

📌 fraction-to-recurring-decimal (LeetCode)

class Solution:
    def fractionToDecimal(self, numerator: int, denominator: int) -> str:
        n,d=numerator,denominator
        num = str(n/d)
        if num[-1]=='0' and num[-2]=='.': # 정수인데요
            return(str(n//d))
        else: # 정수가 아닌데요
            rep = ''
            i=1
            while num[len(num)-i]!='.': # 소수점까지 찾을건데요
                temp=num[len(num)-i:len(num)] # 맨 끝에서 하나씩 늘린건데요
                if 0<=len(num)-i-1-len(temp): # 비교할 자리가 있는지 확인할건데요
                    pre=num[len(num)-i-len(temp):len(num)-i] # 비교할건데요
                    if pre==temp:
                        rep=temp
                        break
                i+=1
            idx = num.find(rep)
            # print(rep,idx)
            if rep: # 도돌이표 찾았는데요
                answer=''
                for i in range(len(num)):
                    if i == idx:
                        answer+='('+rep+')'
                        break
                    answer+=num[i]
                return answer
            else:
                return num

열심히 머리 굴리며 어떻게든 테케 통과시켰는데

맙소사 그냥 나눗셈 때려버린 결과 이용하면 안됐구나
아예 로직을 전면 재검토해야됨

재검토까진 아니고 str(n/d) 부분을 수동으로 만들어주면 될듯?

일단 오늘은 여기까지

📌 9184 신나는 함수 실행

import sys
input = sys.stdin.readline

def w(a,b,c):
    if a<=0 or b<=0 or c<=0:
        return 1
    elif dp[a][b][c] != None:
        return dp[a][b][c]
    elif a>20 or b>20 or c>20:
        dp[a][b][c] = w(20,20,20)
    elif a<b and b<c:
        dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
    else:
        dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
    return dp[a][b][c]

dp=[[[None for _ in range(51)]for _ in range(51)] for _ in range(51)]
a,b,c=map(int,input().split())
while (a,b,c) != (-1,-1,-1):
    print('w('+str(a)+', '+str(b)+', '+str(c)+') =',w(a,b,c))
    a,b,c=map(int,input().strip().split())

# a,b,c가 0보다 작거나 같으면 1을 return
# a,b,c가 20 초과이면 w(20,20,20) return
# a<b<c이면 w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) return
# 전부 다 아니라면 w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)

전혀 신나지 않았다.

    if a<=0 or b<=0 or c<=0:
        return 1
    elif dp[a][b][c] != None:
        return dp[a][b][c]

a<=0 or b<=0 or c<=0:일땐 dp 값을 오염시키지 않기 위해 dp 안 건드리고 바로 1 return 했어야 했고,
if문의 순서도 맨 앞에 둬야 했다.

질문 게시판 보고 음수 인덱스에 대한 힌트 얻음.
아오 왜 안되나 했네.

0개의 댓글