본문 바로가기

Eric112

[Java] Anagram 판별하기 Anagram이란 Anagram이란 문자의 종류, 빈도가 같은 두 문자열을 의미합니다. 예를 들면 아래와 같은 문자열은 Anagram입니다. abcd acdb ttmt mttt bobobo obobob 두 문자열이 Anagram인지 판별하기 위해서 저는 다음과 같은 알고리즘을 사용할 것입니다. 1. 문자열을 문자 배열로 변환한다. 2. 문자 배열을 정렬한다. 3. 정렬된 문자 배열이 같은지 비교한다. 문자열을 정렬한 후 비교해서 같다면 문자의 종류, 빈도가 같으니 Anagram이라 할 수 있습니다. 코드 import java.util.Arrays; public class Anagram { public static boolean isAnagram(String str1, String str2) { // 1... 2020. 2. 4.
[Java] 스택 두 개로 큐 구현하기 Stack 두 개로 Queue 구현방법 스택 두 개를 준비한다. Stack 1 : add() 할 때만 사용할 것입니다. (추가할 때만 사용) Stack 2 : peek(), poll() 을 할 때 사용할 것입니다. (읽는 연산이 필요할 때 사용) 2. add 1번 스택에 원소를 넣는다. 3. poll 1. 1번 스택에 있는 원소들을 모드 2번 스택으로 옮긴다. 이 때 원소들의 순서가 바뀐다. (큐의 순서와 동일하게 됨) 2. 2번 스택에서 pop시킨다. 만약 2번 스택이 비어있지 않다면 1번 과정을 생략한다. 2번 스택이 비어있지 않은 상태로 1번 과정을 진행하면 원소들의 순서가 뒤죽박죽으로 섞일 수 있다. 4. size 두 스택에 있는 원소들의 합을 반환합니다. 코드 import java.util.St.. 2020. 2. 4.
[Java] 프로그래머스 카카오 프렌즈 컬러링북 문제 설명 카카오 프렌즈 컬러링북 출판사의 편집자인 어피치는 네오에게 컬러링북에 들어갈 원화를 그려달라고 부탁하여 여러 장의 그림을 받았다. 여러 장의 그림을 난이도 순으로 컬러링북에 넣고 싶었던 어피치는 영역이 많으면 색칠하기가 까다로워 어려워진다는 사실을 발견하고 그림의 난이도를 영역의 수로 정의하였다. (영역이란 상하좌우로 연결된 같은 색상의 공간을 의미한다.) 그림에 몇 개의 영역이 있는지와 가장 큰 영역의 넓이는 얼마인지 계산하는 프로그램을 작성해보자. 위의 그림은 총 12개 영역으로 이루어져 있으며, 가장 넓은 영역은 어피치의 얼굴면으로 넓이는 120이다. 입력 형식 입력은 그림의 크기를 나타내는 m과 n, 그리고 그림을 나타내는 m × n 크기의 2차원 배열 picture로 주어진다. 제한조.. 2020. 1. 29.
[Spring] Spring session을 Redis에 저장했을 때 어떻게 저장될까? 개요 Spring에서 Global session전략을 사용할 때 일반적으로 redis를 사용합니다. Spring redis session을 적용한 이후 실제로 redis에 접속하여 값을 조회할 일은 거의 없습니다. 그렇기 때문에 세션 정보가 redis에 어떤 자료구조로 어떻게 저장되는지 한번 확인해보겠습니다. 간단하게 세션에 값을 저장하는 예제를 만들어 보겠습니다. STS에서 Spring boot starter를 사용하여 간편하게 만들 수 있습니다. Spring code 해당 프로젝트의 코드는 github에서 모두 확인하실 수 있습니다. https://github.com/yyy9942/spring-redis-session-exam yyy9942/spring-redis-session-exam Contrib.. 2020. 1. 3.
[이슈 #10] 푸시 메세지를 비동기로 처리하여 성능 개선하기 개요 DelFood에 드디어 푸시 메세지 전송 기능이 추가되었습니다. Firebase Cloud Messaging(이하 FCM)을 기반으로 앱, 웹으로 사용자에게 푸시 메세지 전송 기능을 제작하였습니다. 여러 사용자에게 순차적으로 푸시 메세지를 전송할 수도 있고, 한 명의 사용자에게 푸시 메세지를 전송할 수도 있습니다. 원한다면 하나의 topic을 따르는 사용자들에게도 일괄적으로 전송할 수 있습니다. 당장 구현을 할 때는 몰랐지만 구현을 다 마치고 곰곰히 코드를 보며 생각해 보니 의문점이 떠올랐습니다. '푸시메세지를 보낼 사용자가 엄청 많아지면 어떻게 되는거지?' 라는 생각이 들었습니다. 변경 전 로직 한 사용자에게 푸시 메세지를 전송하는 로직은 다음과 같습니다. 1. 사용자가 가지고 있는 토큰들을 조회.. 2019. 12. 31.
[이슈 #9] Mybatis <collection> 태그 N+1 문제 없이 사용하기 개요 DelFood 주문 기능에 있는 '가격 계산' 로직에서 N+1 쿼리 문제가 발생하는 것을 확인하였습니다. 주문 전 가격을 계산하는 기능이었는데 for문을 돌며 select query를 날리고, 또 mybatis의 collection 태그를 잘못 사용하여 꽤 느린 로직이었습니다. 변경 전 요청과 결과 값 [ { "menuId": "1", "count": "1", "options": [ { "optionId": "1" }, { "optionId": "9" } ] }, { "menuId": "4", "count": "2", "options": [ { "optionId": "4" } ] } ] { "menus": [ { "id": 1, "name": "바사칸치킨", "price": 3000, "option.. 2019. 12. 18.
[이슈 #8] 1:N:M 관계 INSERT 시 N + M번의 쿼리 발생을 리팩토링하기 개요 DelFood의 주문 로직을 작성하던 도중 발생하는 1 : N : M의 쿼리 이슈를 해결해 보려고 합니다. 주문 진행 로직 고객이 메뉴를 선택합니다. 해당 메뉴에 대한 옵션을 선택합니다. 여러 메뉴를 선택한 고객이 주문을 진행합니다 이 과정에서 주문 - 주문 메뉴 - 주문 메뉴 옵션은 1 : N : M의 관계를 가집니다. 이 관계를 다중 for문을 돌며 쿼리를 호출하게 된다면 많은 DB요청이 발생하게 됩니다. 처음 만든 다중 for문을 단 3번의 insert문을 호출하는 것으로 변경해보겠습니다. 개선 방향 1. 데이터베이스 스키마상 문제가 있는 테이블을 수정할 것입니다. 관계가 있는 테이블 입력 시 (주문메뉴 - 주문메뉴 옵션) 해당 부모 데이터의 PK가 필요합니다. 하지만 변경 전 DB 테이블은 .. 2019. 12. 18.
[cocos2d-x] 드래곤 슈팅 게임 2 개요 C++로 게임개발을 해보고 싶어 만든 슈팅 게임입니다. 저번에 만들어 본 드래곤 슈팅게임1이 생각보다 마음에 안드는 부분이 많아 업데이트를 진행하였습니다. 더이상의 업데이트는 진행하지 않을 예정입니다. 업데이트 개발기간 6시간 개발환경 Visual Studio, C++, Cocos2d-x 패치노트 1. 배경음악 및 효과음이 추가되었습니다. (저작권이 없는 CX Music) 2. 일정 확률로 엘리트 UFO가 출몰합니다. (HP 5) 3. 가끔씩 아이템이 출몰합니다! 획득시 5초간 공격이 강화됩니다. 4. 드래곤과 UFO에게 HP가 생겼습니다. 이제 한대 맞는다고 게임이 끝나지 않습니다. 5. 점수 시스템을 적용하였습니다. 최고 점수를 갱신해보세요. 6. UFO가 터지거나, 플레이어가 피격당할 때 파티.. 2019. 12. 5.
[이슈 #7] 서버 부하를 줄이기 위한 캐싱 적용 부하 증가 고려 저번 이슈에서 주소 데이터 조회 속도를 인덱스를 적용하여 개선하였습니다. 하지만 주소 조회를 계속해서 진행할수록 DB성능이 점점 떨어지는 것이 느껴졌고 이를 개선하기 위하여 주소 캐시를 적용하기로 하였습니다. 인덱스 적용 포스팅 https://deveric.tistory.com/68 [이슈 #6] 주소 데이터의 빠른 조회를 위해 인덱스 설정하기 얼마 전 주소데이터를 DB에서 관리하도록 변경하였는데, 데이터가 100,000,00건정도 되어서 검색이 정말 느렸습니다. 인덱스를 걸지 않은 상태로 조회를 하면 검색에만 10초가 넘게 걸리는 무시무시한 상황이었습.. deveric.tistory.com 캐싱 전략별 특징 Local Cache와 Global Cache중 어떤 전략을 사용할지 생각해보았.. 2019. 11. 21.