240920 TIL - 어딜 가든 가챠가 문제다(?)

LIHA·2024년 9월 20일
0

내일배움캠프

목록 보기
55/117
post-thumbnail

뼈대잡기

내가 지금 해야하는것 - 내가 만든 가챠함수 웅상님꺼처럼 돌아가는지 보기

  1. 일단 가챠함수의 정상구동을 보고
  2. 정상구동 되거든 이걸 프로덕트 구매와 연결해줘야 한다
  3. 연결 과정에서는 productId를 받아와야 할것 같고
  4. 이 productId로 gacha테이블을 검색했을 때 gachaQuantity가 있는지 찾아서
  5. 있으면 그 횟수를 잡아와 가챠 횟수로 써줘야 할 것 같다

-> 이거 전부다 웅상님이 전에 하셨던거고 웅상님 - 수빈님이 상의하셔서 '순수 가챠로직' 부분만 함수로 따로 빼기로 했다
-> 웅상님이 리뷰 해주셨는진 잘 모르겠으나 이거 코드 다 올려주셨기 때문에 웅상님 로직대로 가는게 맞을것 같다


알고리즘

했어 안했어?를 보는 데에는 BitMap을 쓰는게 가장 정확하다

비트맵에 대한 검색결과가 나오질 않는다. 비트맵 그리기 밖에 안 나오는데...? createImageBitmap()?

내 코드는 왜 동작하지 않을까? 숫자 문자열과 영단어 쉽지 않군!

코딩이 어려워 고민하는 건 나 뿐만이 아닌가보다. 프로도 너도 힘들구나?

도움받은 프로그래머스 질문(스포주의)
1. 정규식에 따옴표를 붙여서 그렇다
문자열이지 않을까? 라는 생각에 따옴표를 붙였더니 내 정규식 패턴은 죽어도 작동하지 않았다.
하다가 도저히 모르겠고 몸도 아파 아무 생각이 나지 않아서 질문하기 쪽을 찾아봤는데 의외의 소득이 있었다.

  • 나는 이렇게 썼는데, 이게 아니었다
function applyRegExp(s) {
    let filteredS = '';
    
    const engNum = ['/zero/ig', '/one/ig', '/two/ig', '/three/ig', '/four/ig', '/five/ig', '/six/ig', '/seven/ig', '/eight/ig', '/nine/ig']
    
    for (let i = 0; i < engNum.length; i++) {
        filteredS = (s.replace(engNum[i], i))
    }
    console.log('filteredS: ', filteredS)
    return filteredS;
}

2. for문 안에 s = filteredS 를 붙였어야 했다
마치 재귀함수 비슷한 느낌으로. 이게 생각보다 중요한데, 패턴을 찾아 바꾼 글자를 다음 for문의 베이스로 쓰지 않으면 기껏 바꿔놓고는 적용시키지 않고 갖다버리는게 되었다.
-> replace든 replaceAll이든 크게 상관 없는듯 하다. 참고 블로그를 봤더니 JS도 ES2021에 replaceAll이 생겼다고 한다. (원래는 없었다)

  • 그래서 나온 정답코드
function applyRegExp(s) {
    let filteredS = '';
    
    const engNum = [/zero/ig, /one/ig, /two/ig, /three/ig, /four/ig, /five/ig, /six/ig, /seven/ig, /eight/ig, /nine/ig]
    
    for (let i = 0; i < engNum.length; i++) {
        filteredS = (s.replaceAll(engNum[i], i))
        s = filteredS;
    }
    return filteredS;
}

function solution(s) {
    let answer = parseInt(applyRegExp(s))
    
    return answer;
}

팀 프로젝트

중복선수에 대한 제안? (9/19)

중복선수가 너무 많으면 안될 것 같다. 중복선수가 10장 정도 뽑히면 더는 안나오게 하는 로직은 어떨까? 라는 제안을 주셨다.

gachaTry라는 인자가 뭔지 몰라 질문을 드렸다 -> 이 함수 실행할 때 이거 필요할테니까 이거 들고가! 라는 느낌

수빈님 설명:
상점 상품 구매 -> productId를 params로 받는다. gachaDB에 있는 gachaQuantity를 검색해서 그 productId를 잡아가게 하는 방식으로..
가챠 타겟과 횟수를 함수의 파라미터로 받을 듯

중복 캐릭터 핸들링은 인벤토리를 제한하는 것으로

가챠에서 동일 캐릭터를 10장까지만 뽑는 것은 어떤지에 대한 얘기가 있었는데, 이건 인벤토리 칸수를 제한하는 방식으로 가기로 했다.

구매내역이 왜 안보이지? - await를 안 걸어줬다!

입력한 숫자에 따라 원이 그려지는 게 있었다

웹종 숫자맞추기에 입력한 숫자대로 원 크기 표시되는 것이 있었는데, 이걸로 공 표시해보면 어떨까?

JWT의 맹점 - 액세스 토큰이 만료되기 전까지는 중복 로그인이 유효하다

조금 빡세게 검사하는 게임서버 같은 경우는 중복로그인 체크부터 해서 기존 로그인을 끊어버린다.
중복 로그인을 끊어버리고 그 토큰 자체를 블랙리스트에 넣고 새 액세스토큰을 주는 방법도 있는데, 그건 너무 짜쳐서(...)

잔액이 안 맞아요 - 창민 튜터님의 구원

  • 튜터님이 말씀하신 건 실시간 동기식으로 할 수 있는 게임이 아니다 -> 내가 온라인이고 상대가 온라인이어야 할 수 있는 게 아니다!

  • cash가 const네? 안 바뀌는거 아니야? 이거 let으로 바꿔줘야 한다

  • 어카운트의 cash를 SELECT 하는게 아니라, purchase_history에 있는 모든 cash 컬럼을 sum해서 잔액을 보여주길 원했던 것

  • 튜터님이 보시기엔 트랜잭션 -> 잔액차감쿼리1, 잔액차감쿼리2 이렇게 보이는 것 같다.

  • cash 한개만 있어야 하고 지출시 마이너스, 충전 시 플러스로 넣어줘야 한다.
    -> unsigned가 아니면 부호 기입이 되어야 한다. 다만 이 이력에 accountId는 있어야 할것.
    -> 유저에게는 캐시라는게 없고, 머니 테이블에 캐시라는게 있는 것이다.
    -> 그래서 충전 시 +, 구매 시 -로 해서 그 sum이 있길 바라는 것.

  • 저 가챠테이블은 필요없다? -> 갯수 입력해서 하는 가챠면 나쁘진 않은데...
    -> findProduct를 할때 가챠 정보까지 다 나오는게 좋다. select 걸어서 gachaQuantity를 가져올 수 있으면 제대로 가챠할 수 있지 않나?

SELECT a.price, b.gachaQuantity 
FROM product as a LEFT JOIN gacha as b
ON a.gacha_id = b.gacha_id
  • 가챠를 이렇게 할수밖에 없을까? 100연뽑에 사람 여러명 몰리면 금방 DB에 행 걸릴 것.
profile
갑자기 왜 춤춰?

0개의 댓글