├── .github ├── auto-assign-setting.yml ├── pull_request_template.md └── workflows │ └── auto-assign-reviewer.yml ├── .gitignore ├── .prettierrc.json ├── Doozuu ├── 230620 │ ├── README.md │ ├── boj1629_곱셈.js │ ├── boj1654_랜선자르기.js │ ├── pro_124나라의숫자.js │ ├── pro_디펜스게임.js │ └── pro_후보키.js ├── 230627 │ ├── README.md │ ├── boj1107_리모컨.js │ ├── boj14499_주사위굴리기.js │ ├── boj14500_테트로미노.js │ ├── pro_듀큐합같게만들기.js │ └── pro_하노이의탑.js ├── 230704 │ ├── README.md │ ├── boj5014_스타트링크.js │ ├── boj9020_골드바흐의추측.js │ ├── pro_공원산책.js │ └── pro_삼각달팽이.js ├── 230711 │ ├── README.md │ ├── boj5525_IOIOI.js │ ├── pro_모음사전.js │ ├── pro_미로탈출.js │ ├── pro_유사칸토어비트열.js │ └── pro_타겟넘버.js ├── 230718 │ ├── README.md │ ├── boj1013_Contact.js │ ├── boj13549_숨바꼭질3.js │ ├── boj1713_후보추천하기.js │ └── pro_거리두기확인하기.js ├── 230725 │ ├── pro_게임맵최단거리.js │ ├── pro_오픈채팅방.js │ └── pro_프로세스.js ├── 230801 │ ├── README.md │ ├── boj16194_카드구매하기2.js │ ├── boj2096_내려가기.js │ ├── pro_2개이하로다른비트.js │ ├── pro_괄호변환.js │ └── pro_방문길이.js ├── 230808 │ ├── README.md │ ├── boj13549_숨바꼭질3.js │ ├── pro_JadenCase문자열만들기.js │ ├── pro_메뉴리뉴얼.js │ ├── pro_의상.js │ └── pro_할인행사.js ├── 230814 │ ├── REAMD.md │ ├── boj2565_전깃줄.js │ ├── pro_더맵게.js │ ├── pro_전화번호목록.js │ ├── pro_주식가격.js │ └── pro_주차요금계산.js ├── 230822 │ ├── README.md │ ├── boj14395_4연산.js │ ├── boj9084_동전.js │ ├── pro_뉴스클러스터링.js │ ├── pro_압축.js │ └── pro_전력망을둘로나누기.js ├── 230919 │ ├── README.md │ ├── boj18427_함께블록쌓기.js │ ├── pro_땅따먹기.js │ ├── pro_리코쳇로봇.js │ ├── pro_멀리뛰기.js │ └── pro_시소짝꿍.js ├── 230926 │ ├── pro_방금그곡.js │ ├── pro_숫자변환하기.js │ ├── pro_스킬트리.js │ └── pro_테이블해시함수.js ├── 231003 │ ├── README.md │ ├── boj14502_연구소.js │ ├── boj2631_줄세우기.js │ ├── pro_우박수열정적분.js │ ├── pro_점찍기.js │ └── pro_혼자놀기의달인.js ├── 231010 │ ├── boj2566_전깃줄.js │ ├── pro_과제진행하기.js │ └── pro_숫자카드나누기.js ├── 231017 │ ├── pro_더맵게.js │ ├── pro_멀쩡한사각형.js │ ├── pro_무인도여행.js │ └── pro_수식최대화.js ├── 231024 │ ├── boj10422_괄호.js │ ├── boj17144_미세먼지안녕!.js │ ├── boj5557_1학년.js │ ├── pro_다리를지나는트럭.js │ └── pro_쿼드압축후개수세기.js ├── 231031 │ ├── boj16935_배열돌리기3.js │ ├── boj2133_타일채우기.js │ ├── pro_배댤.js │ └── pro_줄서는방법.js ├── 231107 │ ├── boj1334_다음팰린드롬수.js │ ├── boj1339_단어수학.js │ ├── boj1652_누울자리를찾아라.js │ └── pro_조이스틱.js ├── 231114 │ ├── boj11399_ATM.js │ ├── boj1783_병든나이트.js │ ├── pro_가장큰수.js │ ├── pro_숫자블록.js │ └── pro_피로도.js ├── 231121 │ ├── boj19539_사과나무.js │ ├── pro_가장큰정사각형찾기.js │ ├── pro_게임맵최단거리.js │ ├── pro_뒤에있는큰수찾기.js │ └── pro_연속부분수열합의개수.js ├── 231127 │ ├── boj4949_균형잡힌세상.js │ ├── pro_K진수에서소수개수구하기.js │ └── pro_호텔대실.js ├── 231205 │ ├── pro_문자열압축.js │ ├── pro_석유시추.js │ ├── pro_신고결과받기.js │ ├── pro_큰수만들기.js │ └── pro_택배배달과수거하기.js ├── 231212 │ ├── pro_성격유형검사.js │ ├── pro_양과늑대.js │ ├── pro_이모티콘할인행사.js │ └── pro_파일명정렬.js └── 231219 │ ├── boj_DFS와BFS.js │ ├── boj_단지번호붙이기.js │ ├── boj_풍선터뜨리기.js │ ├── pro_광물캐기.js │ └── pro_기둥과보설치.js ├── Hyeple ├── 230822 │ ├── LV2_뉴스클러스터링.js │ ├── LV2_압축.js │ ├── LV2_전력망을둘로나누기.js │ ├── README.md │ ├── 골드5_4연산.js │ └── 골드5_동전.js ├── 230829 │ ├── LV2_롤케이크자르기.js │ ├── LV2_택배상자.js │ ├── README.md │ ├── 골드5_평범한배낭.js │ ├── 골드5_풍선맞추기.js │ └── 골드5_회문.js ├── 230905 │ ├── LV2_혼자놀기의달인.js │ ├── README.md │ ├── 골드1_k번째수.js │ ├── 골드4_스도쿠.js │ ├── 골드4_알파벳.js │ └── 골드5_수나누기게임.js ├── 230912 │ ├── 골드5_적록색약.js │ ├── Lv2_파일명정렬.js │ ├── Lv2_행렬테두리회전.js │ ├── README.md │ ├── input.txt │ ├── 골드4_뱀.js │ └── 골드5_숫자고르기.js ├── 230919 │ ├── Lv2_땅따먹기.js │ ├── Lv2_리코쳇로봇.js │ ├── Lv2_멀리뛰기.js │ ├── Lv2_시소짝꿍.js │ ├── README.md │ └── 골드4_함께블록쌓기.js ├── 231017 │ ├── lv2_더맵게.js │ ├── lv2_멀쩡한사각형.js │ ├── lv2_수식최대화.js │ └── 골드5_톱니바퀴.js ├── 231031 │ ├── 백준_16935.js │ ├── 백준_17070.js │ ├── 백준_2133.js │ ├── 프로그래머스_배달.js │ └── 프로그래머스_줄서는방법.js ├── 231107 │ ├── boj_13164.js │ ├── boj_1339.js │ ├── boj_1652.js │ └── pro_42860.js ├── 231114 │ ├── boj_11399.js │ ├── boj_1783.js │ ├── pro_12923.js │ ├── pro_42746.js │ └── pro_87946.js └── 231128 │ ├── boj_4949.js │ ├── pro_155651.js │ └── pro_92335.js ├── JeeeunOh ├── 230221 │ ├── README.md │ ├── boj2841_외계인의기타연주.js │ ├── boj5430_AC.js │ ├── input.txt │ ├── pro_기능개발.js │ └── pro_다리를지나는트럭.js ├── 230228 │ ├── README.md │ ├── boj1911_흙길보수하기.js │ ├── pro_두큐의합같게만들기.js │ └── pro_여행경로.js ├── 230307 │ ├── README.md │ ├── boj5052_전화번호목록.js │ └── pro_게임맵최단거리.js ├── 230314 │ ├── README.md │ ├── boj11058_크리보드.js │ ├── boj2573_빙산.js │ ├── pro_덧칠하기.js │ ├── pro_모음사전.js │ ├── pro_주차요금계산.js │ ├── pro_호텔대실.js │ └── tempCodeRunnerFile.js ├── 230321 │ ├── README.md │ ├── pro_N-Queen.js │ ├── pro_개인정보수집유효기간.js │ ├── pro_미로탈출.js │ └── pro_이중우선순위큐.js ├── 230328 │ ├── README.md │ ├── boj21772_가희의고구마먹방.js │ ├── boj9372_상근이의여행.js │ ├── input.txt │ ├── pro_등대.js │ ├── pro_스킬트리.js │ └── pro_자물쇠와열쇠.js ├── 230404 │ ├── README.md │ ├── boj13022_늑대와올바른단어.js │ ├── boj17505_링고와순열.js │ ├── pro_광물캐기.js │ ├── pro_귤고르기.js │ └── pro_메뉴리뉴얼.js ├── 230411 │ ├── README.md │ ├── boj18428_감시피하기.js │ ├── input.txt │ ├── pro_과제진행하기.js │ ├── pro_성격유형검사.js │ ├── pro_표현가능한이진트리.js │ └── pro_프렌즈블록.js ├── 230418 │ ├── README.md │ ├── boj1937_욕심쟁이판다.js │ ├── input.txt │ ├── pro_등산코스정하기.js │ ├── pro_디펜스게임.js │ ├── pro_양과늑대.js │ └── pro_택배상자.js ├── 230425 │ ├── README.md │ ├── boj14925_목장건설하기.js │ ├── input.txt │ ├── pro_롤케이크자르기.js │ ├── pro_숫자블록.js │ └── pro_오픈채팅방.js ├── 230502 │ ├── README.md │ ├── boj4811_알약.js │ ├── input.txt │ ├── pro_두개이하로다른비트.js │ ├── pro_블록이동하기.js │ ├── pro_이모티콘 할인행사.js │ └── pro_최고의집합.js ├── 230509 │ ├── README.md │ ├── pro_삼각달팽이.js │ ├── pro_순위검색.js │ ├── pro_숫자변환하기.js │ ├── pro_타겟넘버.js │ └── pro_테이블해시함수.js ├── 230523 │ ├── README.md │ ├── boj16234_인구이동.js │ ├── boj20055_컨베이어벨트위의로봇.js │ ├── boj6064_카잉달력.js │ ├── input.txt │ ├── pro_파일명정렬.js │ └── pro_혼자놀기의달인.js ├── 230606 │ ├── README.md │ ├── 무인도여행.js │ ├── 예상대진표.js │ ├── 체육복.js │ ├── 쿼드압축후개수변환.js │ └── 큰수만들기.js ├── 230613 │ ├── README.md │ ├── 가장큰정사각형찾기.js │ ├── 달리기경주.js │ ├── 땅따먹기.js │ ├── 마법의엘레베이터.js │ ├── 방금그곡.js │ └── 점찍기.js ├── 230620 │ ├── 124나라의숫자.js │ ├── README.md │ ├── boj1629_곱셈.js │ ├── boj1654_랜선자르기.js │ ├── input.txt │ ├── 디펜스게임.js │ └── 후보키.js ├── 230627 │ ├── README.md │ ├── boj1107_리모컨.js │ ├── boj14499_주사위굴리기.js │ ├── boj14500_테트로미노.js │ ├── input.txt │ ├── pro_두큐의합같게만들기.js │ └── pro_하노이의탑.js ├── 230703 │ ├── README.md │ ├── boj5014_스타트링크.js │ ├── boj9020_골드바흐의추측.js │ ├── input.txt │ ├── pro_n진수게임.js │ ├── pro_공원산책.js │ └── pro_삼각달팽이.js ├── 230704 │ ├── README.md │ ├── boj5014_스타트링크.js │ ├── boj9020_골드바흐의추측.js │ ├── input.txt │ ├── pro_n진수게임.js │ ├── pro_공원산책.js │ └── pro_삼각달팽이.js ├── 230711 │ ├── README.md │ ├── boj5525_IOIOI.js │ ├── input.txt │ ├── 모음사전.js │ ├── 미로탈출.js │ ├── 유사칸토어비트열.js │ └── 타겟넘버.js ├── 230718 │ └── README.md ├── 230725 │ ├── README.md │ ├── 게임맵최단거리.js │ ├── 순위검색.js │ ├── 오픈채팅방.js │ ├── 이모티콘할인행사.js │ └── 프로세스.js ├── 230801 │ ├── 2개이하로다른비트.js │ ├── README.md │ ├── 내려가기.js │ ├── 방문길이.js │ └── 카드구매하기.js ├── stdin.js └── test.js ├── README.md ├── RookieAND ├── 20230214 │ ├── 42578. 위장 │ │ ├── README.md │ │ └── 위장.js │ └── 42579. 베스트앨범 │ │ ├── README.md │ │ └── 베스트앨범.js ├── 20230221 │ ├── 12909. 올바른 괄호 │ │ ├── README.md │ │ └── 올바른 괄호.js │ ├── 2841. 외계인의 기타 연주 │ │ ├── README.md │ │ └── 외계인의 기타 연주.js │ ├── 42583. 다리를 지나는 트럭 │ │ ├── README.md │ │ └── 다리를 지나는 트럭.js │ ├── 42586. 기능개발 │ │ ├── README.md │ │ └── 기능개발.js │ ├── 42587. 프린터 │ │ ├── README.md │ │ └── 프린터.js │ └── 5430. AC │ │ ├── AC.js │ │ └── README.md ├── 20230228 │ ├── 118667. 두 큐 합 같게 만들기 │ │ ├── README.md │ │ └── 두 큐 합 같게 만들기.js │ ├── 1911. 흙길 보수하기 │ │ ├── README.md │ │ └── 흙길 보수하기.js │ ├── 2251. 물통 │ │ ├── README.md │ │ └── 물통.js │ ├── 42861. 섬 연결하기 │ │ ├── README.md │ │ └── 섬 연결하기.js │ └── 43164. 여행경로 │ │ ├── README.md │ │ └── 여행경로.js ├── 20230307 │ ├── 160585. 혼자서 하는 틱택토 │ │ ├── README.md │ │ └── 혼자서 하는 틱택토.js │ ├── 1844. 게임 맵 최단거리 │ │ ├── README.md │ │ └── 게임 맵 최단거리.js │ ├── 2666. 벽장문의 이동 │ │ └── 벽장문의이동.js │ ├── 4803. 트리 │ │ └── 트리.js │ └── 92342. 양궁대회 │ │ ├── README.md │ │ └── 양궁대회.js ├── 20230314 │ ├── 11058. 크리보드 │ │ └── 크리보드.js │ ├── 155651. 호텔 대실 │ │ ├── README.md │ │ └── 호텔 대실.js │ ├── 161989. 덧칠하기 │ │ ├── README.md │ │ └── 덧칠하기.js │ ├── 2573. 빙산 │ │ └── 빙산.js │ ├── 84512. 모음 사전 │ │ ├── README.md │ │ └── 모음 사전.js │ └── 92341. 주차 요금 계산 │ │ ├── README.md │ │ └── 주차 요금 계산.js ├── 20230321 │ ├── 12952. N-Queen │ │ ├── N-Queen.js │ │ └── README.md │ ├── 150369. 택배 배달과 수거하기 │ │ ├── README.md │ │ └── 택배 배달과 수거하기.js │ ├── 150370. 개인정보 수집 유효기간 │ │ ├── README.md │ │ └── 개인정보 수집 유효기간.js │ ├── 159993. 미로 탈출 │ │ ├── README.md │ │ └── 미로 탈출.js │ └── 42628. 이중우선순위큐 │ │ ├── README.md │ │ └── 이중우선순위큐.js ├── 20230328 │ ├── 133500. 등대 │ │ ├── README.md │ │ └── 등대.js │ ├── 21772. 가희의 고구마 먹방 │ │ ├── README.md │ │ └── 가희의 고구마 먹방.js │ ├── 49993. 스킬트리 │ │ ├── README.md │ │ └── 스킬트리.js │ ├── 60059. 자물쇠와 열쇠 │ │ ├── README.md │ │ └── 자물쇠와 열쇠.js │ └── 9372. 상근이의 여행 │ │ ├── README.md │ │ └── 상근이의 여행.js ├── 20230404 │ ├── 13022. 늑대와 올바른 단어 │ │ ├── README.md │ │ └── 늑대와 올바른 단어.js │ ├── 138476. 귤 고르기 │ │ ├── README.md │ │ └── 귤 고르기.js │ ├── 172927. 광물 캐기 │ │ ├── README.md │ │ └── 광물 캐기.js │ ├── 20921. 그렇고 그런 사이 │ │ ├── README.md │ │ └── 그렇고 그런 사이.js │ └── 72411. 메뉴 리뉴얼 │ │ ├── README.md │ │ └── 메뉴 리뉴얼.js ├── 20230411 │ ├── 118666. 성격 유형 검사하기 │ │ ├── README.md │ │ └── 성격 유형 검사하기.js │ ├── 150367. 표현 가능한 이진트리 │ │ ├── README.md │ │ └── 표현 가능한 이진트리.js │ ├── 17679. [1차] 프렌즈4블록 │ │ ├── README.md │ │ └── [1차] 프렌즈4블록.js │ ├── 176962. 과제 진행하기 │ │ ├── README.md │ │ └── 과제 진행하기.js │ ├── 18428. 감시 피하기 │ │ ├── README.md │ │ └── 감시 피하기.js │ └── 조합 설명.js ├── 20230417 │ ├── 131704. 택배상자 │ │ ├── README.md │ │ └── 택배상자.js │ ├── 142085. 디펜스 게임 │ │ ├── README.md │ │ └── 디펜스 게임.js │ ├── 1937. 욕심쟁이 판다 │ │ ├── README.md │ │ └── 욕심쟁이 판다.js │ └── 92343. 양과 늑대 │ │ ├── README.md │ │ └── 양과 늑대.js ├── 20230425 │ ├── 12923. 숫자 블록 │ │ ├── README.md │ │ └── 숫자 블록.js │ ├── 132265. 롤케이크 자르기 │ │ ├── README.md │ │ └── 롤케이크 자르기.js │ ├── 14925. 목장 건설하기 │ │ ├── README.md │ │ └── 목장 건설하기.js │ ├── 150365. 미로 탈출 명령어 │ │ ├── README.md │ │ └── 미로 탈출 명령어.js │ └── 42888. 오픈채팅방 │ │ ├── README.md │ │ └── 오픈채팅방.js ├── 20230502 │ ├── 12938. 최고의 집합 │ │ ├── README.md │ │ └── 최고의 집합.js │ ├── 150368. 이모티콘 할인행사 │ │ ├── README.md │ │ └── 이모티콘 할인행사.js │ ├── 4811. 알약 │ │ ├── README.md │ │ └── 알약.js │ ├── 60063. 블록 이동하기 │ │ ├── README.md │ │ └── 블록 이동하기.js │ └── 77885. 2개 이하로 다른 비트 │ │ ├── 2개 이하로 다른 비트.js │ │ └── README.md ├── 20230509 │ ├── 147354. 테이블 해시 함수 │ │ ├── README.md │ │ └── 테이블 해시 함수.js │ ├── 154538. 숫자 변환하기 │ │ ├── README.md │ │ └── 숫자 변환하기.js │ ├── 43165. 타겟 넘버 │ │ ├── README.md │ │ └── 타겟 넘버.js │ ├── 68645. 삼각 달팽이 │ │ ├── README.md │ │ └── 삼각 달팽이.js │ └── 72412. 순위 검색 │ │ ├── README.md │ │ └── 순위 검색.js ├── 20230516 │ ├── 12899. 124 나라의 숫자 │ │ ├── 124 나라의 숫자.js │ │ └── README.md │ ├── 12927. 야근 지수 │ │ ├── README.md │ │ └── 야근 지수.js │ ├── 15558. 점프 게임 │ │ ├── README.md │ │ └── 점프 게임.js │ ├── 169198. 당구 연습 │ │ ├── README.md │ │ └── 당구 연습.js │ └── 87390. n^2 배열 자르기 │ │ ├── README.md │ │ ├── n^2 배열 자르기.js │ │ └── n^2 배열 자르기.py ├── 20230918 │ ├── 12913. 땅따먹기 │ │ ├── README.md │ │ └── 땅따먹기.js │ ├── 12914. 멀리 뛰기 │ │ ├── README.md │ │ └── 멀리 뛰기.js │ ├── 152996. 시소 짝꿍 │ │ ├── README.md │ │ └── 시소 짝꿍.js │ ├── 169199. 리코쳇 로봇 │ │ ├── README.md │ │ └── 리코쳇 로봇.js │ └── 18427. 함께 블록 쌓기 │ │ ├── README.md │ │ └── 함께 블록 쌓기.js ├── 20230926 │ ├── 147354. 테이블 해시 함수 │ │ ├── README.md │ │ └── 테이블 해시 함수.js │ ├── 154538. 숫자 변환하기 │ │ ├── README.md │ │ └── 숫자 변환하기.js │ ├── 17683. [3차] 방금그곡 │ │ ├── README.md │ │ └── [3차] 방금그곡.js │ ├── 49993. 스킬트리 │ │ ├── README.md │ │ └── 스킬트리.js │ └── 72412. 순위 검색 │ │ ├── README.md │ │ └── 순위 검색.js ├── 20231004 │ ├── 131130. 혼자 놀기의 달인 │ │ ├── README.md │ │ └── 혼자 놀기의 달인.js │ ├── 134239. 우박수열 정적분 │ │ ├── README.md │ │ └── 우박수열 정적분.js │ ├── 140107. 점 찍기 │ │ ├── README.md │ │ └── 점 찍기.js │ ├── 14502. 연구소 │ │ ├── README.md │ │ └── 연구소.js │ └── 2631. 줄세우기 │ │ ├── README.md │ │ └── 줄세우기.js ├── 20231010 │ ├── 135807. 숫자 카드 나누기 │ │ ├── README.md │ │ └── 숫자 카드 나누기.js │ ├── 15681. 트리와 쿼리 │ │ └── failure.js │ ├── 176962. 과제 진행하기 │ │ ├── README.md │ │ └── 과제 진행하기.js │ ├── 2565. 전깃줄 │ │ ├── README.md │ │ └── 전깃줄.js │ └── 87377. 교점에 별 만들기 │ │ ├── README.md │ │ └── 교점에 별 만들기.js └── 20231107 │ ├── 13164. 행복 유치원 │ ├── README.md │ └── 행복 유치원.js │ ├── 1339. 단어 수학 │ ├── README.md │ └── 단어 수학.js │ ├── 1652. 누울 자리를 찾아라 │ ├── README.md │ └── 누울 자리를 찾아라.js │ └── 42860. 조이스틱 │ ├── README.md │ └── 조이스틱.js ├── alsrb0504 ├── 20230214 │ ├── 42578. 위장 │ │ └── 위장.js │ └── 42579. 베스트앨범 │ │ └── 베스트앨범.js ├── 20230221 │ ├── 13335. 트럭 │ │ └── 트럭.js │ ├── 2841. 외계인의 기타 연주 │ │ └── 외계인의 기타 연주.js │ ├── 42586. 기능개발 │ │ └── 기능개발.js │ ├── 42590. 주식가격 │ │ └── 주식가격.js │ ├── 5430. AC │ │ ├── AC-1.js │ │ └── AC-2.js │ └── 6198. 옥상 정원 꾸미기 │ │ └── 옥상 정원 꾸미기.js ├── 20230228 │ ├── 118667.두 큐 합 같게 만들기 │ │ └── 두 큐 합 같게 만들기.js │ ├── 1504. 특별한 최단 경로 │ │ └── 특별한 최단 경로.js │ ├── 1911.흙길 보수하기 │ │ └── 흙길 보수하기.js │ ├── 2251. 물통 │ │ └── 물통.js │ ├── 42861. 섬 연결하기 │ │ └── 섬 연결하기.js │ ├── 43164. 여행경로 │ │ └── 여행경로.js │ └── problems.md ├── 20230307 │ ├── 160585. 혼자서 하는 틱택토 │ │ └── 혼자서 하는 틱택토.js │ ├── 1844. 게임 맵 최단거리 │ │ └── 1844. 게임 맵 최단거리.js │ ├── 2666. 벽장문의 이동 │ │ └── 2666. 벽장문의 이동.js │ ├── 4803. 트리 │ │ └── 4803. 트리.js │ ├── 5052. 전화번호 목록 │ │ └── 전화번호 목록.js │ ├── 92342. 양궁대회 │ │ └── 양궁대회.js │ └── problems.md ├── 20230314 │ ├── 11058 크리보드 │ │ └── 크리보드.js │ ├── 155651. 호텔 대실 │ │ └── 호텔 대실.js │ ├── 161989. 덧칠하기 │ │ └── 덧칠하기.js │ ├── 2573. 빙산 │ │ └── 빙산.js │ ├── 84512. 모음사전 │ │ └── 모음사전.js │ ├── 92341. 주차 요금 계산 │ │ └── 주차 요금 계산.js │ └── problems.md ├── 20230321 │ ├── N-Queen │ │ └── N-Queen.js │ ├── problems.md │ ├── 개인정보 수집 유효기간 │ │ └── 개인정보 수집 유효기간.js │ ├── 미로 탈출 │ │ └── 미로 탈출.js │ ├── 이중 우선 순위 큐 │ │ └── 이중 우선 순위 큐.js │ ├── 이진 트리 │ │ └── 이진 트리.js │ └── 택배 배달과 수거하기 │ │ └── 택배 배달과 수거하기.js ├── 20230328 │ ├── problems.md │ ├── 가희의 고구마 먹방 │ │ └── 가희의 고구마 먹방.js │ ├── 등대 │ │ ├── 등대(dfs 실패).js │ │ └── 등대(실패).js │ ├── 상근이의 여행 │ │ └── 상근이의 여행.js │ ├── 스킬트리 │ │ └── 스킬트리.js │ └── 자물쇠와 열쇠 │ │ └── 자물쇠와 열쇠.js ├── 20230404 │ ├── problems.md │ ├── 광물 캐기 │ │ └── 광물 캐기.js │ ├── 귤 고르기 │ │ └── 귤 고르기.js │ ├── 그렇고 그런 사이 │ │ └── 그렇고 그런 사이.js │ ├── 늑대와 올바른 단어 │ │ └── 늑대와 올바른 단어.js │ └── 메뉴 리뉴얼 │ │ └── 메뉴 리뉴얼.js ├── 20230411 │ ├── problems.md │ ├── 감시 피하기 │ │ └── 감시 피하기.js │ ├── 과제 진행하기 │ │ └── 과제 진행하기.js │ ├── 성격 유형 검사하기 │ │ └── 성격 유형 검사하기.js │ ├── 표현 가능한 이진트리 │ │ └── 표현 가능한 이진트리.js │ └── 프렌즈4블록 │ │ └── 프렌즈4블록.js ├── 20230418 │ ├── problems.md │ ├── 등산 경로 정하기 │ │ └── 등산 경로 정하기.js │ ├── 디펜스 게임 │ │ └── 디펜스 게임.js │ ├── 양과 늑대 │ │ └── 양과 늑대.js │ ├── 욕심쟁이 판다 │ │ └── 욕심쟁이 판다.js │ └── 택배상자 │ │ └── 택배상자.js ├── 20230425 │ ├── problems.md │ ├── 롤케이크 │ │ └── 롤케이크.js │ ├── 목장 걸설 │ │ └── 목장 건설.js │ ├── 미로 탈출 명령어 │ │ └── 미로 탈출 명령어.js │ ├── 숫자 블록 │ │ └── 숫자 블록.js │ └── 오픈채팅방 │ │ └── 오픈채팅방.js ├── 20230502 │ ├── 2개 이하로 다른 비트 │ │ └── 2개 이하로 다른 비트.js │ ├── problems.md │ ├── 블록 이동하기 │ │ └── 블록 이동하기.js │ ├── 알약 │ │ └── 알약.js │ ├── 이모티콘 할인 행사 │ │ └── 이모티콘 할인 행사.js │ └── 최고의 집합 │ │ └── 최고의 집합.js ├── 20230509 │ ├── problems.md │ ├── 삼각 달팽이 │ │ └── 삼각 달팽이.js │ ├── 순위 검색 │ │ └── 순위 검색.js │ ├── 숫자 변환하기 │ │ └── 숫자 변환하기.js │ ├── 타겟 넘버 │ │ └── 타겟 넘버.js │ └── 테이블 해시 함수 │ │ └── 테이블 해시 함수.js ├── 20230516 │ ├── 124 나라의 숫자 │ │ └── 124 나라의 숫자.js │ ├── n^2 배열 나누기 │ │ └── n^2 배열 나누기.js │ ├── problems.md │ ├── 당구 연습 │ │ └── 당구 연습.js │ ├── 야근 지수 │ │ └── 야근 지수.js │ └── 점프 게임 │ │ └── 점프 게임.js └── 20230523 │ ├── problems.md │ ├── 인구 이동 │ └── 인구 이동.js │ ├── 카잉달력 │ └── 카잉달력.js │ ├── 컨베이어 벨트 위의 로봇 │ └── 컨베이어 벨트 위의 로봇.js │ ├── 파일명 정렬 │ └── 파일명 정렬.js │ └── 혼자 놀기의 달인 │ └── 혼자 놀기의 달인.js ├── hyosin-Jang ├── 230314 │ ├── 11058.js │ ├── README.md │ ├── 주차요금계산.js │ └── 호텔대실.js ├── 230321 │ ├── N-Queen.js │ ├── README.md │ ├── 개인정보 수집 유효기간.js │ ├── 미로 탈출.js │ └── 이중우선순위큐.js ├── 230327 │ ├── 9372.js │ ├── README.md │ ├── test.js │ ├── 가희의고구마먹방.js │ ├── 스킬트리.js │ └── 자물쇠와열쇠.js ├── 230404 │ ├── README.md │ ├── 광물캐기.js │ ├── 귤고르기.js │ ├── 그렇고그런사이.js │ ├── 그렇고그런사이_TLE.js │ ├── 늑대와올바른단어.js │ └── 메뉴리뉴얼.js ├── 230411 │ ├── README.md │ ├── 감시피하기.js │ ├── 과제진행하기.js │ ├── 성격유형검사하기.js │ ├── 표현가능한이진트리.js │ └── 프렌즈블록.js ├── 230418 │ ├── README.md │ ├── 등산코스정하기.js │ ├── 디펜스게임.js │ ├── 양과늑대.js │ ├── 욕심쟁이판다.js │ └── 택배상자.js ├── 230425 │ ├── README.md │ ├── 롤케이크자르기.js │ ├── 목장건설하기.js │ ├── 미로탈출명령어.js │ ├── 숫자블록.js │ └── 오픈채팅방.js ├── 230502 │ ├── 2개이하로다른비트.js │ ├── 블록이동하기.js │ ├── 알약.js │ ├── 이모티콘할인행사.js │ └── 최고의집합.js └── 230509 │ ├── 삼각달팽이.js │ ├── 숫자변환하기.js │ ├── 타겟넘버.js │ └── 테이블해시함수.js ├── stakbucks ├── 230606 │ ├── p_12985_예상대진표.js │ ├── p_154540_무인도여행.js │ ├── p_42862_체육복.js │ ├── p_42883_큰수만들기.js │ └── p_68936_쿼드압축후개수변환.js ├── 230613 │ ├── p_12905_가장큰정사각형찾기.js │ ├── p_12913_땅따먹기.js │ ├── p_140107_점찍기.js │ ├── p_148653_마법의엘레베이터.js │ ├── p_17683_방금그곡.js │ └── p_178871_달리기경주.js ├── 230620 │ ├── README.md │ ├── b_1629_곱셈 │ │ ├── app.js │ │ └── input.txt │ ├── b_1654_랜선자르기 │ │ ├── app.js │ │ └── input.txt │ ├── p_12899_124나라의숫자.js │ ├── p_142085_디펜스게임.js │ └── p_42890_후보키.js ├── 230627 │ ├── README.md │ ├── b_1107_리모컨 │ │ ├── app.js │ │ └── input.txt │ ├── b_14499_주사위굴리기 │ │ ├── app.js │ │ └── input.txt │ ├── b_14500_테트로미노 │ │ ├── app.js │ │ └── input.txt │ ├── p_118667_두큐합같게만들기.js │ └── p_12946_하노이의탑.js ├── 230704 │ ├── README.md │ ├── b_5014_스타트링크 │ │ ├── app.js │ │ └── input.txt │ ├── b_9020_골드바흐의추측 │ │ ├── app.js │ │ ├── input.txt │ │ └── 소수판별함수들.js │ ├── p_172928_공원산책.js │ ├── p_17687_n진수게임.js │ └── p_68645_삼각달팽이.js ├── 230711 │ ├── README.md │ ├── b_5525_IOIOI │ │ ├── app.js │ │ └── input.txt │ ├── p_148652_유사칸토어비트열.js │ ├── p_159993_미로탈출.js │ ├── p_43165_타겟넘버.js │ └── p_84512_모음사전.js ├── 230718 │ ├── README.md │ ├── b_1013_Contact │ │ ├── app.js │ │ └── input.txt │ ├── b_13549_숨바꼭질3 │ │ ├── app.js │ │ └── input.txt │ ├── b_1713_후보추천하기 │ │ ├── app.js │ │ └── input.txt │ ├── p_81302_거리두기확인하기.js │ └── p_92342_양궁대회.js ├── 230725 │ ├── README.md │ ├── p_150368_이모티콘할인행사.js │ ├── p_1844_게임맵최단거리.js │ ├── p_42587_프로세스.js │ ├── p_42888_오픈채팅방.js │ └── p_72412_순위검색.js ├── 230801 │ ├── README.md │ ├── b_16194_카드구매하기 │ │ ├── app.js │ │ └── input.txt │ ├── b_2096_내려가기 │ │ ├── app.js │ │ └── input.txt │ ├── p_49994_방문길이.js │ ├── p_60058_괄호변환.js │ └── p_77885_2개이하로다른비트.js ├── 230808 │ ├── README.md │ ├── b_13549_숨바꼭질3 │ │ ├── app.js │ │ └── input.txt │ ├── p_12951_JadenCase문자열만들기.js │ ├── p_131127_할인행사.js │ ├── p_42578_의상.js │ └── p_72411_메뉴리뉴얼.js ├── 230815 │ ├── README.md │ ├── b_2565_전깃줄 │ │ ├── app.js │ │ └── input.txt │ ├── p_42577_전화번호목록.js │ ├── p_42584_주식가격.js │ ├── p_42626_더맵게.js │ └── p_92341_주차요금계산.js ├── 230822 │ ├── README.md │ ├── b_14395_4연산 │ │ ├── app.js │ │ └── input.txt │ ├── b_9084_동전 │ │ ├── app.js │ │ └── input.txt │ ├── p_17677_뉴스클러스터링.js │ ├── p_17684_압축.js │ └── p_86971_전력망을둘로나누기.js ├── 230829 │ ├── README.md │ ├── b_11509_풍선맞추기 │ │ ├── app.js │ │ └── input.txt │ ├── b_12865_배낭 │ │ ├── app.js │ │ └── input.txt │ ├── b_17609_회문 │ │ ├── app.js │ │ └── input.txt │ ├── p_131704_택배상자.js │ └── p_132265_롤케이크자르기.js ├── 230905 │ ├── README.md │ ├── b_1300_K번째수 │ │ ├── app.js │ │ └── input.txt │ ├── b_1987_알파벳 │ │ ├── app.js │ │ └── input.txt │ ├── b_2239_스두쿠 │ │ ├── app.js │ │ └── input.txt │ ├── b_27172_수나누기게임 │ │ ├── app.js │ │ └── input.txt │ └── p_131130_혼자놀기의달인.js ├── 230912 │ ├── README.md │ ├── b_10026_적록색약 │ │ ├── app.js │ │ └── input.txt │ ├── b_2668_숫자고르기 │ │ ├── app.js │ │ └── input.txt │ ├── b_3190_뱀 │ │ ├── app.js │ │ └── input.txt │ ├── p_17686_파일명정렬.js │ └── p_77485_행렬테두리회전하기.js ├── 230919 │ ├── README.md │ ├── b_18427_함께블록쌓기 │ │ ├── app.js │ │ └── input.txt │ ├── p_12913_땅따먹기.js │ ├── p_12914_멀리뛰기.js │ ├── p_152996_시소짝꿍.js │ └── p_169199_리코쳇로봇.js ├── 230926 │ ├── README.md │ ├── p_147354_테이블해시함수.js │ ├── p_154538_숫자변환하기.js │ ├── p_17683_방금그곡.js │ ├── p_49993_스킬트리.js │ └── p_72412_순위정렬.js ├── 231003 │ ├── README.md │ ├── b_14502_연구소 │ │ ├── app.js │ │ └── input.txt │ ├── b_2631_줄세우기 │ │ ├── app.js │ │ └── input.txt │ ├── p_131130_혼자놀기의달인.js │ ├── p_134239_우박수열정적분.js │ └── p_140107_점찍기.js ├── 231010 │ ├── README.md │ ├── b_15681_트리와쿼리 │ │ ├── app.js │ │ └── input.txt │ ├── b_2656_전깃줄 │ │ ├── app.js │ │ └── input.txt │ ├── p_135807_숫자카드나누기.js │ ├── p_176962_과제진행하기.js │ └── p_87377_교점에별만들기.js ├── 231017 │ ├── README.md │ ├── b_14891_톱니바퀴 │ │ ├── app.js │ │ └── input.txt │ ├── p_154540_무인도여행.js │ ├── p_42626_더맵게.js │ ├── p_62048_멀쩡한사각형.js │ └── p_67257_수식최대화.js ├── 231024 │ ├── README.md │ ├── b_10422_괄호 │ │ ├── app.js │ │ └── input.txt │ ├── b_17144_미세먼지안녕! │ │ ├── app.js │ │ └── input.txt │ ├── b_5557_1학년 │ │ ├── app.js │ │ └── input.txt │ ├── p_42583_다리를지나는트럭.js │ └── p_68936_쿼드압축후개수세기.js ├── 231031 │ ├── README.md │ ├── b_16935_배열돌리기 │ │ ├── app.js │ │ └── input.txt │ ├── b_17070_파이프옮기기1 │ │ ├── app.js │ │ └── input.txt │ ├── b_2133_타일채우기 │ │ ├── app.js │ │ └── input.txt │ ├── p_12936_줄서는방법.js │ └── p_12987_배달.js ├── 231107 │ ├── README.md │ ├── b_13164_행복유치원 │ │ ├── app.js │ │ └── input.txt │ ├── b_1334_다음팰린드롬수 │ │ ├── app.js │ │ └── input.txt │ ├── b_1339_단어수학 │ │ ├── app.js │ │ └── input.txt │ └── b_1652_누울자리를찾아라 │ │ ├── app.js │ │ └── input.txt ├── 231121 │ ├── README.md │ ├── b_19539_사과나무 │ │ ├── app.js │ │ └── input.txt │ ├── p_12905_가장큰정사각형찾기.js │ ├── p_131701_연속부분수열합의개수.js │ ├── p_154539_뒤에있는큰수찾기.js │ └── p_1844_게임맵최단거리.js ├── 231128 │ ├── README.md │ ├── b_4949_균형잡힌세상 │ │ ├── app.js │ │ └── input.txt │ ├── p_155651_호텔대실.js │ └── p_92335_k진수에서소수개수구하기.js ├── 231205 │ ├── README.md │ ├── p_150369_택배배달과수거하기.js │ ├── p_250136_석유시추.js │ ├── p_42883_큰수만들기.js │ ├── p_60057_문자열압축.js │ └── p_92334_신고결과받기.js ├── 231212 │ ├── README.md │ ├── p_118666_성격유형검사하기.js │ ├── p_150368_이모티콘할인행사.js │ ├── p_17686_파일명정렬.js │ └── p_92343_양과늑대.js ├── 231219 │ ├── README.md │ ├── b_1260_DFS와BFS │ │ ├── app.js │ │ └── input.txt │ ├── b_2346_풍선터뜨리기 │ │ ├── app.js │ │ └── input.txt │ ├── b_2667_단지번호붙이기 │ │ ├── app.js │ │ └── input.txt │ ├── p_172927_광물캐기.js │ └── p_60061_기둥과보설치.js └── 231226 │ ├── README.md │ ├── b_1012_유기농배추 │ ├── app.js │ └── input.txt │ ├── b_1904_01타일 │ ├── app.js │ └── input.txt │ ├── p_138476_귤고르기.js │ ├── p_150365_미로탈출명령어.js │ └── p_17679_프렌즈4블록.js └── youngduck └── 20230829 ├── b_11509_풍선맞추기 ├── app.js └── input.txt ├── b_12865_평범한배낭 ├── app.js └── input.txt ├── b_17609_회문 ├── app.js └── input.txt ├── p_121704_택배상자.js └── p_132265_롤케이크자르기.js /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### 📚 풀이 문제 2 | 3 | ### 🔏 궁금한 점 4 | 5 | ### 📒 새롭게 알게 된 점 6 | 7 | ### 🔍 체크 리스트 8 | 9 | - [ ] PR 제목을 규칙에 맞게 작성 10 | - [ ] label 설정 11 | - [ ] 작업한 사람 모두를 Assign 12 | - [ ] Code Review 요청 13 | -------------------------------------------------------------------------------- /.github/workflows/auto-assign-reviewer.yml: -------------------------------------------------------------------------------- 1 | name: 'Auto Assign' 2 | on: 3 | pull_request: 4 | types: [opened, ready_for_review] 5 | 6 | jobs: 7 | add-reviews: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: kentaro-m/auto-assign-action@v1.2.4 11 | with: 12 | configuration-path: '.github/auto-assign-setting.yml' 13 | repo-token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .history -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": true, 4 | "tabWidth": 2, 5 | "useTabs": false, 6 | "trailingComma": "all", 7 | "printWidth": 180, 8 | "singleAttributePerLine": false, 9 | "bracketSpacing": false 10 | } 11 | -------------------------------------------------------------------------------- /Doozuu/230620/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [백준 | 실버1 | 곱셈(1629번)](https://velog.io/@049494/%EC%8B%A4%EB%B2%84-1-1629%EB%B2%88-%EA%B3%B1%EC%85%88) 6 | 2. [백준 | 실버2 | 랜선자르기(1654번)](https://velog.io/@049494/%EC%8B%A4%EB%B2%84-2-1654%EB%B2%88-%EB%9E%9C%EC%84%A0-%EC%9E%90%EB%A5%B4%EA%B8%B0) 7 | 3. [프로그래머스 | Lv2 | 디펜스게임](https://velog.io/@049494/Level-2-%EB%94%94%ED%8E%9C%EC%8A%A4-%EA%B2%8C%EC%9E%84) 8 | 4. [프로그래머스 | Lv2 | 후보키](https://velog.io/@049494/Level-2-%ED%9B%84%EB%B3%B4%ED%82%A4) 9 | 5. [프로그래머스 | Lv2 | 124나라의숫자](https://velog.io/@049494/LEvel-2) 10 | -------------------------------------------------------------------------------- /Doozuu/230620/boj1629_곱셈.js: -------------------------------------------------------------------------------- 1 | // 1. 자바스크립트 정수 범위를 넘어가서 BigInt 사용해야 함. 2 | // 2. 분할 정복 알고리즘, 재귀. 3 | 4 | const fs = require('fs'); 5 | let [A, B, C] = fs.readFileSync('/dev/stdin').toString().split(' ').map(BigInt); 6 | 7 | const solve = (power) => { 8 | // B가 1이면 바로 A%C를 출력한다. 9 | if (power === 1n) { 10 | return A % C; 11 | } 12 | // B를 2로 나눈 값을 입력하여 함수를 재귀적으로 호출한다. 13 | const half = solve(power / 2n) % C; 14 | 15 | // B가 홀수면 ((A^(B / 2) % C) * (A^(B / 2) % C) * (A % C)) % C 를 적용한다. 16 | if (power % 2n) { 17 | return (half * half * (A % C)) % C; 18 | } 19 | 20 | // B가 짝수면 ((A^(B / 2) % C) * (A^(B / 2) % C)) % C 를 적용한다. 21 | return (half * half) % C; 22 | }; 23 | 24 | console.log(solve(B).toString()); 25 | -------------------------------------------------------------------------------- /Doozuu/230620/boj1654_랜선자르기.js: -------------------------------------------------------------------------------- 1 | // 이분 탐색 2 | let input = require('fs').readFileSync('dev/stdin').toString().split('\n'); 3 | 4 | let N = input[0].split(' ')[1]; 5 | let start = 1; // 시작 6 | let end = Math.max(...input.slice(1).map((el) => +el)); // 끝 7 | 8 | while (start <= end) { 9 | let mid = Math.floor((start + end) / 2); // 중간점 10 | let sum = input.slice(1).reduce((acc, cur) => acc + parseInt(cur / mid), 0); // 만들 수 있는 랜선 개수의 합 11 | if (sum < N) { 12 | end = mid - 1; 13 | } else { 14 | start = mid + 1; 15 | } 16 | } 17 | 18 | console.log(end); 19 | -------------------------------------------------------------------------------- /Doozuu/230620/pro_124나라의숫자.js: -------------------------------------------------------------------------------- 1 | // 3으로 나눈거를 다시 3으로 나눈 나머지에 해당하는 값을 계속 앞에 붙이기 2 | function solution(n) { 3 | let answer = ''; 4 | let arr = [4, 1, 2]; 5 | while (n >= 1) { 6 | answer = arr[n % 3].toString() + answer; 7 | if (Math.ceil(n / 3) - 1 < 1) break; 8 | n = Math.ceil(n / 3) - 1; 9 | } 10 | return answer; 11 | } 12 | -------------------------------------------------------------------------------- /Doozuu/230620/pro_디펜스게임.js: -------------------------------------------------------------------------------- 1 | // 이분 탐색 2 | function solution(n, k, enemy) { 3 | let answer = 0; 4 | let start = 0; 5 | let end = enemy.length; 6 | 7 | while (start <= end) { 8 | let mid = Math.floor((start + end) / 2); // 중간점 9 | let arr = enemy.slice(0, mid).sort((a, b) => b - a); 10 | 11 | let next = true; 12 | let temp = 0; 13 | // 무적권을 먼저 사용해버리고 남은 거 계산 14 | for (let i = k; i < arr.length; i++) { 15 | temp += arr[i]; 16 | if (temp > n) next = false; 17 | } 18 | 19 | // 최적의 지점을 찾기 위해 중간 지점을 왼쪽이나 오른쪽으로 이동시킴 20 | if (next) { 21 | answer = mid; 22 | start = mid + 1; 23 | } else end = mid - 1; 24 | } 25 | 26 | return answer; 27 | } 28 | -------------------------------------------------------------------------------- /Doozuu/230627/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [백준 | 골드4 | 테트로미노(14500번)](https://velog.io/@049494/%EA%B3%A8%EB%93%9C-5-14500%EB%B2%88-%ED%85%8C%ED%8A%B8%EB%A1%9C%EB%AF%B8%EB%85%B8) 6 | 2. [백준 | 골드4 | 주사위 굴리기(14499번)](https://velog.io/@049494/%EC%A3%BC%EC%82%AC%EC%9C%84-%EA%B5%B4%EB%A6%AC%EA%B8%B0) 7 | 3. [백준 | 골드5 | 리모컨(1107번)](https://velog.io/@049494/%EA%B3%A8%EB%93%9C-5-%EB%A6%AC%EB%AA%A8%EC%BB%A8) 8 | 4. [프로그래머스 | Lv2 | 두 큐 합 같게 만들기](https://velog.io/@049494/Level-2-%EB%91%90-%ED%81%90-%ED%95%A9-%EA%B0%99%EA%B2%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0) 9 | 5. [프로그래머스 | Lv2 | 하노이의 탑](https://velog.io/@049494/Level-2-%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98-%ED%83%91) 10 | -------------------------------------------------------------------------------- /Doozuu/230627/pro_하노이의탑.js: -------------------------------------------------------------------------------- 1 | function solution_(n, from, through, to) { 2 | if (n == 1) return [[from, to]]; // 1번에서 3번으로 이동 3 | let result = []; 4 | result = [...result, ...solution_(n - 1, from, to, through)]; // 1번에서 n-1개가 3번을 거쳐 2번으로 이동 5 | result.push([from, to]); // 1번에서 3번으로 이동 6 | result = [...result, ...solution_(n - 1, through, from, to)]; // 2번에서 n-1개를 1번을 거쳐 3번으로 이동 7 | return result; 8 | } 9 | 10 | function solution(n) { 11 | return solution_(n, 1, 2, 3); 12 | } 13 | -------------------------------------------------------------------------------- /Doozuu/230704/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [백준 | 실버1 | 스타트링크(14500번)](https://velog.io/@049494/%EC%8B%A4%EB%B2%84-1-5014%EB%B2%88-%EC%8A%A4%ED%83%80%ED%8A%B8%EB%A7%81%ED%81%AC) 6 | 2. [백준 | 실버2 | 골드바흐의 추측(14499번)](https://velog.io/@049494/%EC%8B%A4%EB%B2%84-2-9020%EB%B2%88-%EA%B3%A8%EB%93%9C%EB%B0%94%ED%9D%90%EC%9D%98-%EC%B6%94%EC%B8%A1) 7 | 3. [프로그래머스 | Lv2 | 삼각 달팽이(1107번)](https://velog.io/@049494/Level-2-%EC%82%BC%EA%B0%81%EB%8B%AC%ED%8C%BD%EC%9D%B4) 8 | 4. [프로그래머스 | Lv1 | 공원 산책](https://velog.io/@049494/Level-1-%EA%B3%B5%EC%9B%90-%EC%82%B0%EC%B1%85) 9 | 5. [프로그래머스 | Lv2 | n진수 게임](https://school.programmers.co.kr/learn/courses/30/lessons/17687) 10 | -------------------------------------------------------------------------------- /Doozuu/230704/boj9020_골드바흐의추측.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n').map(Number); 2 | 3 | // 에라토스테네스의 체 알고리즘으로 소수 찾기 4 | const prime = Array(10001).fill(true); 5 | prime[0] = false; 6 | prime[1] = false; 7 | 8 | for (let i = 2; i <= 100; i++) { 9 | for (let j = i * 2; j <= 10000; j += i) { 10 | prime[j] = false; // 4의 배수, 6의 배수,, 제거 11 | } 12 | } 13 | 14 | const output = []; 15 | for (let i = 1; i < input.length; i++) { 16 | const n = input[i]; 17 | let left = (right = n / 2); // 가운데가 제일 값 차이가 작으므로 가운데로 초기값 설정 18 | // 소수가 아니면 각각 왼쪽/오른쪽으로 이동하며 소수인 값 찾기 19 | while (!prime[left] || !prime[right]) { 20 | left -= 1; 21 | right += 1; 22 | } 23 | output.push(`${left} ${right}`); 24 | } 25 | 26 | console.log(output.join('\n')); 27 | -------------------------------------------------------------------------------- /Doozuu/230704/pro_삼각달팽이.js: -------------------------------------------------------------------------------- 1 | function solution(n) { 2 | let [count, currentX, currentY] = [0, -1, 0]; 3 | let arr = Array.from({length: n}, (_, index) => Array(index + 1).fill(0)); 4 | while (n > 0) { 5 | for (let i = 0; i < n; i++) { 6 | // 위에서 아래로 7 | currentX++; 8 | count++; 9 | arr[currentX][currentY] = count; 10 | } 11 | for (let i = 0; i < n - 1; i++) { 12 | // 왼쪽에서 오른쪽으로 13 | currentY++; 14 | count++; 15 | arr[currentX][currentY] = count; 16 | } 17 | for (let i = 0; i < n - 2; i++) { 18 | // 아래에서 위로 19 | currentX--; 20 | currentY--; 21 | count++; 22 | arr[currentX][currentY] = count; 23 | } 24 | n -= 3; 25 | } 26 | 27 | return arr.flat(); 28 | } 29 | -------------------------------------------------------------------------------- /Doozuu/230711/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [프로그래머스 | Lv2 | 미로 탈출](https://velog.io/@049494/Level-2-%EB%AF%B8%EB%A1%9C-%ED%83%88%EC%B6%9C) 6 | 2. [프로그래머스 | Lv2 |유사 칸토어 비트열](https://velog.io/@049494/Level-2-%EC%9C%A0%EC%82%AC-%EC%B9%B8%ED%86%A0%EC%96%B4-%EB%B9%84%ED%8A%B8%EC%97%B4) 7 | 3. [프로그래머스 | Lv2 | 타겟 넘버](https://velog.io/@049494/Level-2-%ED%83%80%EA%B2%9F-%EB%84%98%EB%B2%84) 8 | 4. [프로그래머스 | Lv1 | 모음사전](https://velog.io/@049494/Level-2-%EB%AA%A8%EC%9D%8C%EC%82%AC%EC%A0%84) 9 | 5. [백준 | 실버1 | IOIOI](https://velog.io/@049494/%EC%8B%A4%EB%B2%84-1-5525%EB%B2%88-IOIOI) 10 | -------------------------------------------------------------------------------- /Doozuu/230711/boj5525_IOIOI.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n'); 2 | 3 | let [N, M, S] = input; 4 | let answer = 0; 5 | let pattern = 0; 6 | let i = 0; 7 | 8 | while (i < M - 2) { 9 | if (S.slice(i, i + 3) === 'IOI') { 10 | pattern++; 11 | if (pattern == N) { 12 | answer++; 13 | pattern--; 14 | } 15 | i += 2; 16 | } else { 17 | pattern = 0; 18 | i++; 19 | } 20 | } 21 | 22 | console.log(answer); 23 | 24 | // IOI 패턴이 나타날 경우 패턴 갯수를 증가시켜준다. 25 | // 패턴 갯수가 N과 일치할 경우 answer를 증가시키고 패턴 갯수를 감소시킨다.(이미 센 패턴이므로 제거) 26 | // 패턴 갯수가 N과 일치하지 않을 경우 i를 2만큼 증가시켜 이어나오는 문자열에 IOI 패턴이 또 존재하는지 확인한다. 27 | // 패턴이 또 존재하는 경우 다시 패턴 갯수를 증가시키고, 다시 패턴 갯수가 N과 일치하는지 확인해준다. 28 | // IOI 패턴이 없는 경우 패턴 갯수를 0으로 초기화시키고 i를 1만큼 증가시킨다. 29 | -------------------------------------------------------------------------------- /Doozuu/230711/pro_모음사전.js: -------------------------------------------------------------------------------- 1 | function solution(word) { 2 | const result = []; 3 | const str = ''; 4 | for (let i = 1; i <= 5; i++) { 5 | dfs(str, i, result); 6 | } 7 | return result.sort().indexOf(word) + 1; 8 | } 9 | 10 | function dfs(str, length, result) { 11 | const words = ['A', 'E', 'I', 'O', 'U']; 12 | if (length === str.length) { 13 | result.push(str); 14 | return; 15 | } 16 | words.forEach((el) => dfs(el + str, length, result)); 17 | } 18 | 19 | // 문자열에 "A","E","I","O","U"를 붙여 가면서 길이가 1,2,,,5가 되는 경우를 모두 구해준다. 20 | // 사전순으로 나타내기 위해 정렬해서 위치를 구해준다. 21 | -------------------------------------------------------------------------------- /Doozuu/230711/pro_유사칸토어비트열.js: -------------------------------------------------------------------------------- 1 | function solution(n, l, r) { 2 | let result = 0; 3 | let memo = new Array(r - l + 1).fill().map((_, idx) => idx + l); 4 | 5 | if (n === 1) { 6 | return memo.filter((el) => el !== 3).length; 7 | } 8 | 9 | while (memo.length) { 10 | const newMemo = []; 11 | 12 | for (const el of memo) { 13 | if (el === 1) result += 1; 14 | else { 15 | if (!!((el + 2) % 5)) { 16 | const fixedEl = Math.ceil(el / 5); 17 | newMemo.push(fixedEl); 18 | } 19 | } 20 | } 21 | 22 | memo = newMemo; 23 | } 24 | 25 | return result; 26 | } 27 | 28 | // 신박한 풀이 29 | function solution(n, l, r) { 30 | let answer = 0; 31 | for (let i = l - 1; i <= r - 1; i++) { 32 | if (!i.toString(5).match('2')) answer += 1; 33 | } 34 | return answer; 35 | } 36 | -------------------------------------------------------------------------------- /Doozuu/230711/pro_타겟넘버.js: -------------------------------------------------------------------------------- 1 | function solution(numbers, target) { 2 | let answer = 0; 3 | 4 | getAnswer(0, 0); 5 | 6 | function getAnswer(x, value) { 7 | if (x < numbers.length) { 8 | getAnswer(x + 1, value + numbers[x]); 9 | getAnswer(x + 1, value - numbers[x]); 10 | } else { 11 | if (value === target) { 12 | answer++; 13 | } 14 | } 15 | } 16 | 17 | return answer; 18 | } 19 | 20 | // 재귀를 이용해 그래프를 채워나간다. 21 | // 마지막 줄에 도달했을 때 target과 일치하는 값이 있는지 찾는다. 22 | // 0 1 23 | // 1 -1 2 24 | // 2 -2 0 1 3 25 | // 3 -3-1 -1 1 0 2 2 4 26 | -------------------------------------------------------------------------------- /Doozuu/230718/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [백준 | 실버1 | 후보 추천하기](https://velog.io/@049494/%EC%8B%A4%EB%B2%84-1-1713%EB%B2%88-%ED%9B%84%EB%B3%B4-%EC%B6%94%EC%B2%9C%ED%95%98%EA%B8%B0) 6 | 2. [백준 | 골드5 | 숨바꼭질3 ](https://velog.io/@049494/%EA%B3%A8%EB%93%9C-5-13549%EB%B2%88-%EC%88%A8%EB%B0%94%EA%BC%AD%EC%A7%88-3) 7 | 3. [프로그래머스 | Lv2 | 양궁대회 ]() 8 | 4. [백준 | 골드5 | Contact ](https://velog.io/@049494/%EA%B3%A8%EB%93%9C-5-1013%EB%B2%88-Contact) 9 | 5. [프로그래머스 | Lv2 | 거리두기 확인하기](https://velog.io/@049494/Level-2-%EA%B1%B0%EB%A6%AC%EB%91%90%EA%B8%B0-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0) 10 | -------------------------------------------------------------------------------- /Doozuu/230718/boj1013_Contact.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('ex.txt').toString().trim().split('\n'); 2 | 3 | const strs = input.slice(1); 4 | 5 | // 정규 표현식 이용한 풀이 6 | strs.map((str) => { 7 | if (/^(100+1+|01)+$/.test(str)) console.log('YES'); 8 | else console.log('NO'); 9 | }); 10 | -------------------------------------------------------------------------------- /Doozuu/230801/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [백준 | 골드5 | 내려가기 ](https://velog.io/@049494/%EA%B3%A8%EB%93%9C-5-2096%EB%B2%88-%EB%82%B4%EB%A0%A4%EA%B0%80%EA%B8%B0) 6 | 2. [백준 | 실버1 | 카드 구매하기2](https://velog.io/@049494/%EC%8B%A4%EB%B2%84-1-16194%EB%B2%88-%EC%B9%B4%EB%93%9C-%EA%B5%AC%EB%A7%A4%ED%95%98%EA%B8%B0-2) 7 | 3. [프로그래머스 | Lv2 | 2개 이하로 다른 비트 ](https://velog.io/@049494/Level-2-2%EA%B0%9C-%EC%9D%B4%ED%95%98%EB%A1%9C-%EB%8B%A4%EB%A5%B8-%EB%B9%84%ED%8A%B8) 8 | 4. [프로그래머스 | Lv2 | 괄호 변환 ](https://velog.io/@049494/Level-2-%EA%B4%84%ED%98%B8-%EB%B3%80%ED%99%98) 9 | 5. [프로그래머스 | Lv2 | 방문 길이](https://velog.io/@049494/Level-2-%EB%B0%A9%EB%AC%B8-%EA%B8%B8%EC%9D%B4) 10 | -------------------------------------------------------------------------------- /Doozuu/230801/boj16194_카드구매하기2.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n'); 2 | const N = +input[0]; 3 | const card = input[1].split(' ').map(Number); 4 | 5 | let dp = [0, ...card]; 6 | for (let i = 2; i < dp.length; i++) { 7 | for (let j = 1; j < i; j++) { 8 | dp[i] = Math.min(dp[i], dp[i - j] + dp[j]); 9 | } 10 | } 11 | 12 | console.log(dp[N]); 13 | -------------------------------------------------------------------------------- /Doozuu/230808/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [프로그래머스 | Lv2 | 메뉴 리뉴얼 ](https://velog.io/@049494/Level-2-%EB%A9%94%EB%89%B4-%EB%A6%AC%EB%89%B4%EC%96%BC) 6 | 2. [프로그래머스 | Lv2 | JadenCase 문자열 만들기](https://velog.io/@049494/Level-2-JadenCase-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0) 7 | 3. [백준 | 골드 5 | 숨바꼭질3 ](https://velog.io/@049494/%EA%B3%A8%EB%93%9C-5-13549%EB%B2%88-%EC%88%A8%EB%B0%94%EA%BC%AD%EC%A7%88-3) 8 | 4. [프로그래머스 | Lv2 | 의상 ](https://velog.io/@049494/Level-2-%EC%9D%98%EC%83%81) 9 | 5. [프로그래머스 | Lv2 | 할인행사](https://velog.io/@049494/Level-2-%ED%95%A0%EC%9D%B8-%ED%96%89%EC%82%AC) 10 | -------------------------------------------------------------------------------- /Doozuu/230808/pro_JadenCase문자열만들기.js: -------------------------------------------------------------------------------- 1 | // 공백 문자 연속 유의하기 2 | function solution(s) { 3 | let arr = s.split(' '); 4 | for (let i = 0; i < arr.length; i++) { 5 | if (arr[i] === '') { 6 | continue; 7 | } 8 | arr[i] = arr[i][0].toUpperCase() + arr[i].slice(1).toLowerCase(); 9 | } 10 | return arr.join(' '); 11 | } 12 | -------------------------------------------------------------------------------- /Doozuu/230808/pro_의상.js: -------------------------------------------------------------------------------- 1 | function solution(clothes) { 2 | let obj = {}; 3 | clothes.map(([clothe, type]) => (obj[type] = (obj[type] || 0) + 1)); 4 | let types = Object.values(obj); 5 | return types.reduce((acc, cur) => acc * (cur + 1), 1) - 1; 6 | } 7 | -------------------------------------------------------------------------------- /Doozuu/230808/pro_할인행사.js: -------------------------------------------------------------------------------- 1 | // 1. want를 number 수대로 반복해서 이어붙이고 오름차순으로 정렬 2 | // ex. ["appleapple","bananabananabanana","porkpork","pot","ricerice"] 3 | // 2. 문자열로 합치기 4 | // ex. "appleapplebananabananabananaporkporkpotricerice" 5 | // 3. discount에서 i = 0 ~ discount.length - 10 까지 10개씩 잘라서 문자열로 합치고 위의 값과 같은지 비교 6 | // 4. 같으면 answer++ 7 | 8 | function solution(want, number, discount) { 9 | let answer = 0; 10 | let want_str = want 11 | .map((el, i) => el.repeat(number[i])) 12 | .sort() 13 | .join(''); 14 | for (let i = 0; i < discount.length - 9; i++) { 15 | let slice = discount.slice(i, i + 10); 16 | if (want_str === slice.sort().join('')) answer++; 17 | } 18 | return answer; 19 | } 20 | -------------------------------------------------------------------------------- /Doozuu/230814/REAMD.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [백준 | 골드 5 | 전깃줄 ](https://velog.io/@049494/%EA%B3%A8%EB%93%9C-5-2565%EB%B2%88.-%EC%A0%84%EA%B9%83%EC%A4%84) 6 | 2. [프로그래머스 | Lv2 | 주차 요금 계산 ](https://velog.io/@049494/Level-2-%EC%A3%BC%EC%B0%A8-%EC%9A%94%EA%B8%88-%EA%B3%84%EC%82%B0) 7 | 3. [프로그래머스 | Lv2 | 전화번호 목록](https://velog.io/@049494/Level-2-%EC%A0%84%ED%99%94%EB%B2%88%ED%98%B8-%EB%AA%A9%EB%A1%9D) 8 | 4. [프로그래머스 | Lv2 | 더 맵게 ](https://velog.io/@049494/Level-2-%EB%8D%94-%EB%A7%B5%EA%B2%8C) 9 | 5. [프로그래머스 | Lv2 | 주식가격](https://velog.io/@049494/Level-2-%EC%A3%BC%EC%8B%9D-%EA%B0%80%EA%B2%A9-5qrzkfse) 10 | -------------------------------------------------------------------------------- /Doozuu/230814/boj2565_전깃줄.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n'); 2 | 3 | const n = +input.slice(0, 1); 4 | 5 | const arr = input 6 | .slice(1) 7 | .map((el) => el.split(' ').map(Number)) 8 | .sort((a, b) => a[0] - b[0]); 9 | 10 | function solution(n, arr) { 11 | let dp = new Array(n).fill(1); 12 | 13 | for (let i = 1; i < n; i++) { 14 | const current = arr[i][1]; 15 | let count = 0; 16 | for (let j = 0; j < i; j++) { 17 | const before = arr[j][1]; 18 | if (current > before) count = Math.max(count, dp[j]); 19 | // 가장 긴 오름차순 수열을 만들기 위해 count를 최대한 큰 값으로 갱신 20 | } 21 | dp[i] = count + 1; // 현재 값도 길이에 포함해야 하므로 + 1 22 | } 23 | 24 | console.log(n - Math.max(...dp)); 25 | // 전체 길이 - 가장 긴 오름차순 수열 길이 = 제거해야 하는 전깃줄 개수 26 | } 27 | 28 | solution(n, arr); 29 | -------------------------------------------------------------------------------- /Doozuu/230814/pro_전화번호목록.js: -------------------------------------------------------------------------------- 1 | // 문자열 타입의 숫자는 정렬할시 사전순으로 정렬된다는 특성을 활용. 2 | // 바로 다음 것만 비교하면 된다. 3 | function solution(phone_book) { 4 | phone_book.sort(); 5 | for (let i = 0; i < phone_book.length - 1; i++) { 6 | if (phone_book[i] === phone_book[i + 1].slice(0, phone_book[i].length)) { 7 | return false; 8 | } 9 | } 10 | return true; 11 | } 12 | -------------------------------------------------------------------------------- /Doozuu/230814/pro_주식가격.js: -------------------------------------------------------------------------------- 1 | function solution(prices) { 2 | let answer = []; 3 | for (let i = 0; i < prices.length - 1; i++) { 4 | let temp = 0; 5 | for (let j = i + 1; j < prices.length; j++) { 6 | temp++; 7 | if (prices[i] > prices[j]) break; 8 | } 9 | answer.push(temp); 10 | } 11 | answer.push(0); 12 | return answer; 13 | } 14 | -------------------------------------------------------------------------------- /Doozuu/230822/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [골드 5] 동전 (https://velog.io/@049494/%EA%B3%A8%EB%93%9C-5-9084%EB%B2%88-%EB%8F%99%EC%A0%84) 6 | 2. [LV 2] 전력망을 둘로 나누기 (https://velog.io/@049494/Level-2-%EC%A0%84%EB%A0%A5%EB%A7%9D%EC%9D%84-%EB%91%98%EB%A1%9C-%EB%82%98%EB%88%84%EA%B8%B0) 7 | 3. [Lv2] 뉴스 클러스터링 (https://velog.io/@049494/Level-2-1%EC%B0%A8-%EB%89%B4%EC%8A%A4-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81) 8 | 4. [Lv2] 압축 (https://velog.io/@049494/Level-2-3%EC%B0%A8-%EC%95%95%EC%B6%95) 9 | 5. [골드 5] 4연산 (https://velog.io/@049494/%EA%B3%A8%EB%93%9C-5-14395%EB%B2%88-4%EC%97%B0%EC%82%B0) 10 | -------------------------------------------------------------------------------- /Doozuu/230822/boj9084_동전.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n'); 2 | 3 | let testCase = input.slice(1); 4 | 5 | for (let i = 0; i < testCase.length - 2; i += 3) { 6 | let N = +testCase[i]; // 동전의 가지 수 7 | let types = testCase[i + 1].split(' ').map(Number); // 동전의 각 금액 8 | let M = +testCase[i + 2]; // 만들어야 할 금액 9 | 10 | let dp = Array.from({length: M + 1}, () => 0); 11 | dp[0] = 1; 12 | 13 | for (let j = 0; j < N; j++) { 14 | for (let k = types[j]; k <= M; k++) { 15 | dp[k] += dp[k - types[j]]; 16 | } 17 | } 18 | 19 | console.log(dp[M]); 20 | } 21 | -------------------------------------------------------------------------------- /Doozuu/230919/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [골드4 | 함께 블록쌓기](https://velog.io/@049494/%EA%B3%A8%EB%93%9C-4-%ED%95%A8%EA%BB%98-%EB%B8%94%EB%A1%9D-%EC%8C%93%EA%B8%B0) 6 | 2. [Lv2 | 땅따먹기](https://velog.io/@049494/Level-2-%EB%95%85%EB%94%B0%EB%A8%B9%EA%B8%B0) 7 | 3. [Lv2 | 리코쳇 로봇](https://velog.io/@049494/Level-2-%EB%A6%AC%EC%BD%94%EC%B3%87-%EB%A1%9C%EB%B4%87) 8 | 4. [Lv2 | 시소 짝꿍](https://velog.io/@049494/Level-2-%EC%8B%9C%EC%86%8C-%EC%A7%9D%EA%BF%8D) 9 | 5. [LV2 | 멀리 뛰기](https://velog.io/@049494/Level-2-%EB%A9%80%EB%A6%AC-%EB%9B%B0%EA%B8%B0) 10 | -------------------------------------------------------------------------------- /Doozuu/230919/boj18427_함께블록쌓기.js: -------------------------------------------------------------------------------- 1 | const input = require('fs') 2 | .readFileSync('dev/stdin') 3 | .toString() 4 | .trim() 5 | .split('\n') 6 | .map((el) => el.split(' ').map(Number)); 7 | 8 | const [N, M, H] = input[0]; 9 | const dp = new Array(N + 1).fill(null).map(() => new Array(1001).fill(0)); 10 | const list = input; 11 | 12 | for (let i = 0; i <= N; i++) { 13 | dp[i][0] = 1; 14 | } 15 | 16 | for (let i = 1; i <= N; i++) { 17 | for (let j = 1; j <= H; j++) { 18 | for (const integer of list[i]) { 19 | if (j >= integer) { 20 | dp[i][j] += dp[i - 1][j - integer]; 21 | dp[i][j] %= 10007; 22 | } 23 | } 24 | dp[i][j] += dp[i - 1][j]; 25 | dp[i][j] %= 10007; 26 | } 27 | } 28 | 29 | console.log(dp[N][H]); 30 | -------------------------------------------------------------------------------- /Doozuu/230919/pro_땅따먹기.js: -------------------------------------------------------------------------------- 1 | function solution(land) { 2 | const dp = Array.from({length: land.length}, () => Array(4).fill(0)); 3 | 4 | dp[0] = land[0]; 5 | 6 | for (let i = 0; i < land.length - 1; i++) { 7 | for (let j = 0; j < 4; j++) 8 | for (let k = 0; k < 4; k++) { 9 | if (j === k) continue; // 두 행의 열이 같으면 건너뛰기 10 | const temp = dp[i][j] + land[i + 1][k]; // 현재 행의 값 + 다음 행의 값 11 | if (temp > dp[i + 1][k]) dp[i + 1][k] = temp; // dp의 해당 위치 값보다 temp가 더 크면 temp로 업데이트 12 | } 13 | } 14 | return Math.max(...dp.at(-1)); 15 | } 16 | -------------------------------------------------------------------------------- /Doozuu/230919/pro_멀리뛰기.js: -------------------------------------------------------------------------------- 1 | // 가능한 경우의 수 -> 피보나치 2 | function solution(n) { 3 | var answer = 0; 4 | var dp = []; 5 | dp[1] = 1; 6 | dp[2] = 2; 7 | for (var i = 3; i <= n; i++) { 8 | dp[i] = dp[i - 1] + (dp[i - 2] % 1234567); 9 | } 10 | answer = dp[n]; 11 | return answer % 1234567; 12 | } 13 | -------------------------------------------------------------------------------- /Doozuu/230919/pro_시소짝꿍.js: -------------------------------------------------------------------------------- 1 | function solution(weights) { 2 | const dict = {}; 3 | 4 | for (let weight of weights) { 5 | dict[weight] = (dict[weight] || 0) + 1; 6 | } 7 | 8 | weights.sort((a, b) => a - b); 9 | 10 | let answer = 0; 11 | 12 | for (let weight of weights) { 13 | // 1 : 1 14 | if (dict[weight] > 1) answer += dict[weight] - 1; 15 | // 3 : 2 16 | if (dict[weight * (3 / 2)] > 0) answer += dict[weight * (3 / 2)]; 17 | // 4 : 2 -> 2 : 1 18 | if (dict[weight * 2] > 0) answer += dict[weight * 2]; 19 | // 4 : 3 20 | if (dict[weight * (4 / 3)] > 0) answer += dict[weight * (4 / 3)]; 21 | 22 | dict[weight] -= 1; 23 | } 24 | return answer; 25 | } 26 | -------------------------------------------------------------------------------- /Doozuu/230926/pro_테이블해시함수.js: -------------------------------------------------------------------------------- 1 | function solution(data, col, row_begin, row_end) { 2 | let sum_list = []; 3 | // 1. col번째 컬럼값을 기준으로 오름차순 정렬, 값이 동일하면 첫 번째 컬럼값 기준으로 내림차순 4 | data.sort((a, b) => (a[col - 1] === b[col - 1] ? b[0] - a[0] : a[col - 1] - b[col - 1])); 5 | // 2. row_begin부터 row-end까지 i번째 행을 i로 나눈 나머지의 합 구하기 6 | for (let i = row_begin - 1; i < row_end; i++) { 7 | sum_list.push(data[i].reduce((acc, cur) => acc + (cur % (i + 1)), 0)); 8 | } 9 | // 3. XOR 계산 10 | return sum_list.reduce((acc, cur) => acc ^ cur, 0); 11 | } 12 | -------------------------------------------------------------------------------- /Doozuu/231003/README.md: -------------------------------------------------------------------------------- 1 | ### 📌 문제풀이 2 | 3 | 👇🏻 상세 풀이 Velog 정리 4 | 5 | 1. [Lv2 | 점 찍기](https://velog.io/@049494/Level-2-%EC%A0%90-%EC%B0%8D%EA%B8%B0) 6 | 2. [Lv 2 | 우박수열 정적분](https://velog.io/@049494/Level-2-%EC%9A%B0%EB%B0%95%EC%88%98%EC%97%B4-%EC%A0%95%EC%A0%81%EB%B6%84) 7 | 3. [Lv 2 | 혼자 놀기의 달인](https://velog.io/@049494/Level-2-%ED%98%BC%EC%9E%90-%EB%86%80%EA%B8%B0%EC%9D%98-%EB%8B%AC%EC%9D%B8) 8 | 4. [골드4 | 줄세우기](https://velog.io/@049494/%EA%B3%A8%EB%93%9C-4-2631%EB%B2%88-%EC%A4%84%EC%84%B8%EC%9A%B0%EA%B8%B0) 9 | 5. [골드4 | 연구소] https://www.acmicpc.net/problem/14502 10 | -------------------------------------------------------------------------------- /Doozuu/231003/boj2631_줄세우기.js: -------------------------------------------------------------------------------- 1 | const input = require('fs') 2 | .readFileSync('dev/stdin') 3 | .toString() 4 | .trim() 5 | .split('\n') 6 | .map((el) => Number(el)); 7 | 8 | // LIS 알고리즘 : 길이가 가장 긴 부분수열의 길이 구하기 9 | const [N, ...data] = input; 10 | 11 | let dp = new Array(N).fill(0); 12 | let maxLen = 0; 13 | 14 | for (let i = 0; i < N; i++) { 15 | dp[i] = 1; 16 | for (let j = 0; j < i; j++) { 17 | if (data[i] > data[j] && dp[i] < dp[j] + 1) { 18 | dp[i] = dp[j] + 1; 19 | } 20 | } 21 | if (dp[i] > maxLen) maxLen = dp[i]; 22 | } 23 | 24 | console.log(N - maxLen); 25 | -------------------------------------------------------------------------------- /Doozuu/231003/pro_우박수열정적분.js: -------------------------------------------------------------------------------- 1 | function solution(k, ranges) { 2 | let sequence = []; 3 | let area = []; 4 | // 1. 우박수열 구하기 5 | while (k > 1) { 6 | sequence.push(k); 7 | k = k % 2 ? k * 3 + 1 : k / 2; 8 | } 9 | sequence.push(1); 10 | // 2. 각 구역의 넓이 구하기 11 | for (let i = 0; i < sequence.length - 1; i++) { 12 | area.push((sequence[i] + sequence[i + 1]) / 2); 13 | } 14 | // 3. ranges 범위 값들을 더하기 15 | ranges = ranges.map(([a, b]) => { 16 | let sum = 0; 17 | for (let i = a; i < area.length + b; i++) { 18 | sum += area[i]; 19 | } 20 | return a > area.length + b ? -1 : sum; 21 | }); 22 | return ranges; 23 | } 24 | -------------------------------------------------------------------------------- /Doozuu/231003/pro_점찍기.js: -------------------------------------------------------------------------------- 1 | function solution(k, d) { 2 | let answer = 0; 3 | for (let i = 0; i <= d / k; i++) { 4 | let y_max = Math.floor(Math.sqrt(d ** 2 - (k * i) ** 2)); 5 | answer += Math.floor(y_max / k) + 1; 6 | } 7 | return answer; 8 | } 9 | -------------------------------------------------------------------------------- /Doozuu/231003/pro_혼자놀기의달인.js: -------------------------------------------------------------------------------- 1 | function solution(cards) { 2 | let answer = []; // 상자 그룹의 각 개수 3 | let visited = Array.from({length: cards.length}, () => false); 4 | let box_idx = 0; // 상자 그룹의 현재 index 5 | for (let cur = 0; cur < cards.length; cur++) { 6 | let next = cur; // 다음 상자의 위치 7 | while (!visited[next]) { 8 | answer[box_idx] = (answer[box_idx] || 0) + 1; 9 | visited[next] = true; 10 | next = cards[next] - 1; 11 | } 12 | box_idx++; 13 | } 14 | answer.sort((a, b) => b - a); 15 | return answer[0] * answer[1] || 0; 16 | } 17 | -------------------------------------------------------------------------------- /Doozuu/231010/boj2566_전깃줄.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('ex.txt').toString().trim().split('\n'); 2 | 3 | const n = +input.slice(0, 1); 4 | 5 | const arr = input 6 | .slice(1) 7 | .map((el) => el.split(' ').map(Number)) 8 | .sort((a, b) => a[0] - b[0]); 9 | 10 | function solution(n, arr) { 11 | let dp = new Array(n).fill(1); 12 | 13 | for (let i = 1; i < n; i++) { 14 | const current = arr[i][1]; 15 | let count = 0; 16 | for (let j = 0; j < i; j++) { 17 | const before = arr[j][1]; 18 | if (current > before) count = Math.max(count, dp[j]); 19 | // 가장 긴 오름차순 수열을 만들기 위해 count를 최대한 큰 값으로 갱신 20 | } 21 | dp[i] = count + 1; // 현재 값도 길이에 포함해야 하므로 + 1 22 | } 23 | 24 | console.log(n - Math.max(...dp)); 25 | // 전체 길이 - 가장 긴 오름차순 수열 길이 = 제거해야 하는 전깃줄 개수 26 | } 27 | 28 | solution(n, arr); 29 | -------------------------------------------------------------------------------- /Doozuu/231010/pro_과제진행하기.js: -------------------------------------------------------------------------------- 1 | function timeToMin(time) { 2 | const [hh, mm] = time.split(':').map(Number); 3 | return hh * 60 + mm; 4 | } 5 | 6 | function solution(plans) { 7 | const stack = []; 8 | const sortedPlans = plans.map(([subject, time, count]) => [subject, timeToMin(time), Number(count)]).sort((a, b) => b[1] - a[1]); 9 | 10 | while (sortedPlans.length) { 11 | const [subject, time, count] = sortedPlans.pop(); 12 | 13 | stack.forEach((val, idx) => { 14 | if (time < val[1]) stack[idx][1] += count; 15 | }); 16 | stack.push([subject, time + count]); 17 | } 18 | const answer = stack.sort((a, b) => a[1] - b[1]).map((val) => val[0]); 19 | return answer; 20 | } 21 | -------------------------------------------------------------------------------- /Doozuu/231017/pro_멀쩡한사각형.js: -------------------------------------------------------------------------------- 1 | // 공식 사용 풀이 2 | function solution(w, h) { 3 | function gcd(a, b) { 4 | return a % b ? gcd(b, a % b) : b; 5 | } 6 | return w * h - (w + h - gcd(w, h)); 7 | } 8 | 9 | // 기울기 사용 풀이 10 | function solution(w, h) { 11 | const slope = h / w; 12 | let result = 0; 13 | 14 | for (let i = 1; i <= w; i++) { 15 | result += Math.ceil(slope * i); 16 | } 17 | 18 | return (h * w - result) * 2; 19 | } 20 | -------------------------------------------------------------------------------- /Doozuu/231024/boj10422_괄호.js: -------------------------------------------------------------------------------- 1 | const [_, ...input] = require('fs').readFileSync('ex.txt').toString().trim().split('\n').map(Number); 2 | const LIMIT = 1000000007n; 3 | let dp = Array(5001).fill(0n); 4 | dp[0] = 1n; 5 | dp[1] = 0n; 6 | 7 | for (let i = 2; i <= 5000; i += 2) { 8 | for (let j = 0; j < i; j += 2) { 9 | dp[i] = (dp[i] + ((dp[j] * dp[i - j - 2]) % LIMIT)) % LIMIT; 10 | } 11 | } 12 | 13 | dp = dp.map((v) => (v ? v : 0n)); 14 | 15 | let answer = ''; 16 | for (let i of input) answer += `${dp[i]}\n`; 17 | 18 | console.log(answer); 19 | -------------------------------------------------------------------------------- /Doozuu/231024/boj5557_1학년.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('ex.txt').toString().split('\n'); 2 | const N = +input[0]; 3 | const numbers = input[1].split(' ').map(Number); 4 | 5 | const solution = (N, numbers) => { 6 | const dp = Array.from({length: N - 1}, () => new Array(21).fill(BigInt(0))); 7 | 8 | dp[0][numbers[0]] += BigInt(1); 9 | 10 | for (let i = 1; i < N - 1; i++) { 11 | for (let j = 0; j <= 20; j++) { 12 | if (dp[i - 1][j]) { 13 | if (j + numbers[i] <= 20) dp[i][j + numbers[i]] += dp[i - 1][j]; 14 | if (j - numbers[i] >= 0) dp[i][j - numbers[i]] += dp[i - 1][j]; 15 | } 16 | } 17 | } 18 | 19 | return dp[N - 2][numbers[N - 1]].toString(); 20 | }; 21 | 22 | console.log(solution(N, numbers)); 23 | -------------------------------------------------------------------------------- /Doozuu/231031/boj2133_타일채우기.js: -------------------------------------------------------------------------------- 1 | let N = require('fs').readFileSync('ex.txt').toString(); 2 | N = +N; 3 | 4 | // 홀수면 불가능, return 안하면 밑에 콘솔이랑 중복되서 꼭 return 해줘야 함 5 | if (N % 2) return console.log(0); 6 | 7 | const dp = new Array(N + 1).fill(0); 8 | dp[0] = 1; 9 | dp[2] = 3; 10 | 11 | for (let i = 4; i <= +N; i += 2) { 12 | dp[i] = dp[i - 2] * 3; 13 | 14 | for (let j = 4; j <= i; j += 2) { 15 | dp[i] += dp[i - j] * 2; // 예외 케이스 16 | } 17 | } 18 | 19 | console.log(dp[N]); 20 | -------------------------------------------------------------------------------- /Doozuu/231031/pro_줄서는방법.js: -------------------------------------------------------------------------------- 1 | function solution(n, k) { 2 | const answer = []; 3 | const people = Array.from({length: n}, (_, i) => i + 1); 4 | let caseNum = people.reduce((acc, cur) => acc * cur, 1); 5 | 6 | while (answer.length < n) { 7 | caseNum /= people.length; 8 | answer.push(...people.splice(Math.floor((k - 1) / caseNum), 1)); 9 | k %= caseNum; 10 | } 11 | 12 | return answer; 13 | } 14 | -------------------------------------------------------------------------------- /Doozuu/231107/boj1339_단어수학.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('ex.txt').toString().split('\n'); 2 | const [N, ...list] = input; 3 | 4 | const map = new Map(); 5 | let number = 10; 6 | 7 | // 각 자리수에 숫자 부여하고 더하기 8 | list.map((item) => 9 | [...item].map((a, idx) => { 10 | const val = map.get(a); 11 | map.set(a, (val || 0) + 10 ** (item.length - idx - 1)); 12 | }), 13 | ); 14 | 15 | const mapEntries = Array.from(map); 16 | // 내림차순 정렬하기 17 | let sortedMap = mapEntries.sort((a, b) => b[1] - a[1]); 18 | // 9부터 순서대로 곱해서 누적합 구하기 19 | let answer = sortedMap.reduce((acc, cur) => { 20 | number--; 21 | return acc + cur[1] * number; 22 | }, 0); 23 | 24 | console.log(answer); 25 | -------------------------------------------------------------------------------- /Doozuu/231107/pro_조이스틱.js: -------------------------------------------------------------------------------- 1 | function solution(name) { 2 | let answer = 0; 3 | let min_move = name.length - 1; 4 | 5 | [...name].map((n, i) => { 6 | answer += Math.min(n.charCodeAt() - 65, 91 - n.charCodeAt()); 7 | let idx = i + 1; 8 | 9 | while (idx < name.length && name[idx] === 'A') { 10 | idx++; 11 | } 12 | 13 | min_move = Math.min(min_move, i * 2 + name.length - idx, i + 2 * (name.length - idx)); 14 | }); 15 | 16 | return answer + min_move; 17 | } 18 | -------------------------------------------------------------------------------- /Doozuu/231114/boj11399_ATM.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('ex.txt').toString().split('\n'); 2 | const [N, P] = input; 3 | 4 | const list = P.split(' ') 5 | .map(Number) 6 | .sort((a, b) => a - b); 7 | 8 | let answer = list.reduce((acc, cur, i) => acc + cur * (N - i), 0); 9 | 10 | console.log(answer); 11 | -------------------------------------------------------------------------------- /Doozuu/231114/boj1783_병든나이트.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('ex.txt').toString(); 2 | const [n, m] = input.split(' ').map(Number); 3 | 4 | if (n === 1) { 5 | console.log(1); 6 | } else if (n === 2) { 7 | console.log(Math.min(4, Math.floor((m + 1) / 2))); 8 | } else if (m < 7) { 9 | console.log(Math.min(4, m)); 10 | } else { 11 | console.log(5 + m - 7); 12 | } 13 | -------------------------------------------------------------------------------- /Doozuu/231114/pro_가장큰수.js: -------------------------------------------------------------------------------- 1 | function solution(numbers) { 2 | let answer = numbers 3 | .map((el) => el.toString()) 4 | .sort((a, b) => b + a - (a + b)) 5 | .join(''); 6 | return answer[0] === '0' ? '0' : answer; 7 | } 8 | -------------------------------------------------------------------------------- /Doozuu/231114/pro_숫자블록.js: -------------------------------------------------------------------------------- 1 | function findMaxDivisor(num) { 2 | if (num === 1) { 3 | return 0; 4 | } 5 | 6 | for (let i = 2; i <= Math.sqrt(num); i++) { 7 | if (num % i === 0 && num / i <= 1e7) { 8 | return num / i; 9 | } 10 | } 11 | return 1; 12 | } 13 | 14 | function solution(begin, end) { 15 | let answer = []; 16 | 17 | for (let i = begin; i <= end; i++) { 18 | answer.push(findMaxDivisor(i)); 19 | } 20 | 21 | return answer; 22 | } 23 | -------------------------------------------------------------------------------- /Doozuu/231114/pro_피로도.js: -------------------------------------------------------------------------------- 1 | function solution(k, dungeons) { 2 | let answer = 0; 3 | let visited = Array.from({length: dungeons.length}, () => false); 4 | 5 | function dfs(hp, depth) { 6 | for (let i = 0; i < dungeons.length; i++) { 7 | if (!visited[i] && hp >= dungeons[i][0]) { 8 | visited[i] = true; 9 | dfs(hp - dungeons[i][1], depth + 1); 10 | visited[i] = false; 11 | } 12 | } 13 | answer = Math.max(answer, depth); 14 | } 15 | dfs(k, 0); 16 | 17 | return answer; 18 | } 19 | -------------------------------------------------------------------------------- /Doozuu/231121/boj19539_사과나무.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('ex.txt').toString().split('\n'); 2 | let [N, trees] = input; 3 | N = +N; 4 | trees = trees.split(' ').map(Number); 5 | 6 | let one = 0; 7 | let two = 0; 8 | let answer = ''; 9 | 10 | for (let i = 0; i < N; i++) { 11 | if (trees[i] % 2) { 12 | one++; 13 | } 14 | two += Math.floor(trees[i] / 2); 15 | } 16 | 17 | while (true) { 18 | if (one === two) { 19 | answer = 'YES'; 20 | break; 21 | } 22 | two--; 23 | one += 2; 24 | if (one > two) { 25 | answer = 'NO'; 26 | break; 27 | } 28 | } 29 | 30 | console.log(answer); 31 | -------------------------------------------------------------------------------- /Doozuu/231121/pro_가장큰정사각형찾기.js: -------------------------------------------------------------------------------- 1 | function solution(board) { 2 | const N = board.length; 3 | const M = board[0].length; 4 | 5 | let checkZero = 0; 6 | for (let i = 0; i < N; i++) { 7 | for (let j = 0; j < M; j++) { 8 | checkZero += board[i][j]; 9 | } 10 | } 11 | if (checkZero === 0) return 0; 12 | 13 | let answer = 1; 14 | for (let i = 1; i < N; i++) { 15 | for (let j = 1; j < M; j++) { 16 | if (board[i][j] > 0) { 17 | board[i][j] = Math.min(board[i - 1][j], board[i][j - 1], board[i - 1][j - 1]) + 1; 18 | answer = Math.max(board[i][j], answer); 19 | } 20 | } 21 | } 22 | return answer ** 2; 23 | } 24 | -------------------------------------------------------------------------------- /Doozuu/231121/pro_뒤에있는큰수찾기.js: -------------------------------------------------------------------------------- 1 | function solution(numbers) { 2 | let answer = []; 3 | let max = 0; 4 | let search_arr = []; 5 | 6 | for (let i = numbers.length - 1; i >= 0; i--) { 7 | if (numbers[i] >= max) { 8 | max = numbers[i]; 9 | answer.push(-1); 10 | search_arr = [numbers[i]]; 11 | } else { 12 | while (1) { 13 | if (numbers[i] < search_arr[0]) { 14 | answer.push(search_arr[0]); 15 | search_arr.unshift(numbers[i]); 16 | break; 17 | } else { 18 | search_arr.shift(); 19 | } 20 | } 21 | } 22 | } 23 | 24 | return answer.reverse(); 25 | } 26 | -------------------------------------------------------------------------------- /Doozuu/231121/pro_연속부분수열합의개수.js: -------------------------------------------------------------------------------- 1 | function solution(elements) { 2 | const set = new Set(); 3 | for (let i = 1; i <= elements.length; i++) { 4 | // 원순열 만들기 i개의 원소를 뒤에 추가해준다 5 | const els = elements.concat(elements.slice(0, i)); 6 | // set 갱신 7 | for (let j = 0; j < elements.length; j++) { 8 | set.add(els.slice(j, j + i).reduce((a, c) => a + c, 0)); 9 | } 10 | } 11 | return set.size; 12 | } -------------------------------------------------------------------------------- /Doozuu/231127/pro_K진수에서소수개수구하기.js: -------------------------------------------------------------------------------- 1 | function solution(n, k) { 2 | let answer = 0; 3 | let k_num = n.toString(k); 4 | let k_arr = k_num.split('0'); 5 | 6 | function isPrimeNumber(number) { 7 | if (number <= 1) { 8 | return false; 9 | } 10 | for (let i = 2; i <= Math.sqrt(number); i++) { 11 | if (number % i === 0) { 12 | return false; 13 | } 14 | } 15 | return true; 16 | } 17 | 18 | for (let i = 0; i < k_arr.length; i++) { 19 | if (isPrimeNumber(+k_arr[i])) { 20 | answer++; 21 | } 22 | } 23 | 24 | return answer; 25 | } 26 | -------------------------------------------------------------------------------- /Doozuu/231127/pro_호텔대실.js: -------------------------------------------------------------------------------- 1 | function solution(book_time) { 2 | let stack = []; 3 | 4 | function transMinute(time) { 5 | let [hour, minute] = time.split(':').map(Number); 6 | return hour * 60 + minute; 7 | } 8 | 9 | book_time.sort((a, b) => transMinute(a[0]) - transMinute(b[0])); 10 | 11 | for (let i = 0; i < book_time.length; i++) { 12 | let [start, end] = book_time[i]; 13 | let j = 0; 14 | while (true) { 15 | if (j === stack.length) { 16 | stack.push(transMinute(end) + 10); 17 | break; 18 | } else { 19 | if (transMinute(start) >= stack[j]) { 20 | stack[j] = transMinute(end) + 10; 21 | break; 22 | } else { 23 | j++; 24 | } 25 | } 26 | } 27 | } 28 | return stack.length; 29 | } 30 | -------------------------------------------------------------------------------- /Doozuu/231205/pro_신고결과받기.js: -------------------------------------------------------------------------------- 1 | function solution(id_list, report, k) { 2 | let reports = [...new Set(report)].map((a) => { 3 | return a.split(' '); 4 | }); 5 | let counts = new Map(); 6 | for (const bad of reports) { 7 | counts.set(bad[1], counts.get(bad[1]) + 1 || 1); 8 | } 9 | let good = new Map(); 10 | for (const report of reports) { 11 | if (counts.get(report[1]) >= k) { 12 | good.set(report[0], good.get(report[0]) + 1 || 1); 13 | } 14 | } 15 | let answer = id_list.map((a) => good.get(a) || 0); 16 | return answer; 17 | } 18 | -------------------------------------------------------------------------------- /Doozuu/231205/pro_큰수만들기.js: -------------------------------------------------------------------------------- 1 | function solution(number, k) { 2 | let stack = []; 3 | 4 | let arr = number.split('').reverse(); 5 | 6 | while (arr.length && k > 0) { 7 | stack.push(arr.pop()); 8 | while (stack[stack.length - 1] < arr[arr.length - 1] && k > 0) { 9 | stack.pop(); 10 | k = k - 1; 11 | } 12 | } 13 | 14 | if (k !== 0) stack = stack.slice(0, -k); 15 | 16 | return stack.join('') + arr.reverse().join(''); 17 | } 18 | -------------------------------------------------------------------------------- /Doozuu/231205/pro_택배배달과수거하기.js: -------------------------------------------------------------------------------- 1 | function solution(cap, n, deliveries, pickups) { 2 | let answer = 0; 3 | let d = 0; // 배달용 4 | let p = 0; // 수거용 5 | 6 | for (let i = n - 1; i >= 0; i--) { 7 | let count = 0; 8 | d -= deliveries[i]; 9 | p -= pickups[i]; 10 | 11 | while (d < 0 || p < 0) { 12 | d += cap; 13 | p += cap; 14 | count++; 15 | } 16 | 17 | answer += (i + 1) * 2 * count; 18 | } 19 | 20 | return answer; 21 | } 22 | -------------------------------------------------------------------------------- /Doozuu/231212/pro_성격유형검사.js: -------------------------------------------------------------------------------- 1 | function solution(survey, choices) { 2 | const map = new Map(); 3 | const types = ['RT', 'CF', 'JM', 'AN'].map((t) => t.split('')); 4 | 5 | function SetScore(t1, t2, score) { 6 | map.set(t1, (map.get(t1) || 0) + Math.abs(score - 4)); 7 | map.set(t2, map.get(t2) || 0); 8 | } 9 | 10 | survey.forEach(([t1, t2], i) => { 11 | const score = choices[i]; 12 | score < 4 ? SetScore(t1, t2, score) : SetScore(t2, t1, score); 13 | }); 14 | 15 | return types.map(([t1, t2]) => (map.get(t1) < map.get(t2) ? t2 : t1)).join(''); 16 | } 17 | -------------------------------------------------------------------------------- /Doozuu/231212/pro_양과늑대.js: -------------------------------------------------------------------------------- 1 | function solution(info, edges) { 2 | let answer = 0; 3 | let connectedNode = Array.from({length: info.length}, () => []); 4 | 5 | edges.forEach(([from, to]) => connectedNode[from].push(to)); 6 | 7 | function dfs(currentNode, sheep, wolf, possible) { 8 | let newPossibles = [...possible]; 9 | let currentIndex = newPossibles.indexOf(currentNode); 10 | 11 | info[currentNode] ? wolf++ : sheep++; 12 | 13 | answer = Math.max(answer, sheep); 14 | 15 | if (sheep === wolf) return; 16 | 17 | newPossibles.push(...connectedNode[currentNode]); 18 | newPossibles.splice(currentIndex, 1); 19 | 20 | for (const nextNode of newPossibles) { 21 | dfs(nextNode, sheep, wolf, newPossibles); 22 | } 23 | } 24 | 25 | dfs(0, 0, 0, [0]); 26 | 27 | return answer; 28 | } 29 | -------------------------------------------------------------------------------- /Doozuu/231212/pro_파일명정렬.js: -------------------------------------------------------------------------------- 1 | function solution(files) { 2 | function isNumber(n) { 3 | return n !== ' ' && !Number.isNaN(Number(n)); 4 | } 5 | 6 | function Seperate(name) { 7 | let [head, number] = ['', '']; 8 | for (let i = 0; i < name.length; i++) { 9 | if (isNumber(name[i])) { 10 | number += name[i]; 11 | if (!isNumber(name[i + 1])) break; 12 | } else { 13 | head += name[i]; 14 | } 15 | } 16 | return [head, Number(number)]; 17 | } 18 | 19 | return files.sort((a, b) => { 20 | const [head1, number1] = Seperate(a); 21 | const [head2, number2] = Seperate(b); 22 | 23 | if (head1.toUpperCase() === head2.toUpperCase()) { 24 | if (number1 === number2) return; 25 | return number1 - number2; 26 | } 27 | return head1.localeCompare(head2); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Hyeple/230822/README.md: -------------------------------------------------------------------------------- 1 | 1. [골드 5] 동전 2 | 2. [LV 2] 전력망을 둘로 나누기 3 | 3. [Lv2] 뉴스 클러스터링 4 | 4. [Lv2] 압축 5 | 5. [골드 5] 4연산 6 | https://hw-ple.notion.site/20230822-4af8dd5370e24747b1cafc892f33c502?pvs=4 7 | -------------------------------------------------------------------------------- /Hyeple/230822/골드5_동전.js: -------------------------------------------------------------------------------- 1 | //동전 종류와 목표 금액으로 동전 조합의 경우의 수를 계산 2 | function coinCombination(coins,amount) { 3 | const dp = new Array(amount + 1).fill(0); 4 | dp[0] = 1; 5 | 6 | for (const coin of coins) { 7 | for (let i = coin ; i <= amount ; i++) { 8 | dp[i] += dp[i - coin]; 9 | } 10 | } 11 | return dp[amount]; 12 | } 13 | 14 | const fs = require('fs').readFileSync('/dev/stdin'); 15 | let input = fs.toString().split('\n'); 16 | 17 | let index = 0; 18 | 19 | const T = parseInt(input[index++]); 20 | 21 | for (let t = 0; t < T; t++) { 22 | const N = parseInt(input[index++]); 23 | const coinValues = input[index++].split(" ").map(Number); 24 | const M = parseInt(input[index++]); 25 | 26 | const result = coinCombination(coinValues, M); 27 | console.log(result); 28 | } -------------------------------------------------------------------------------- /Hyeple/230829/LV2_롤케이크자르기.js: -------------------------------------------------------------------------------- 1 | function solution(topping) { 2 | let answer = 0; 3 | const toppingCounts = new Map(); 4 | 5 | //각 토핑 개수 카운트해서 맵에 저장 6 | for (const t of topping) { 7 | toppingCounts.set(t, (toppingCounts.get(t) || 0) + 1); 8 | } 9 | 10 | const uniqueToppings = new Set(); 11 | //공평하게 자를 수 있는지 확인 12 | for (const t of topping) { 13 | uniqueToppings.add(t); 14 | toppingCounts.set(t, toppingCounts.get(t) - 1); 15 | //해당 토핑 개수가 0이 되면 맵에서 삭제 16 | if (toppingCounts.get(t) === 0) { 17 | toppingCounts.delete(t); 18 | } 19 | //공평한 자르기가 가능한 경우의 수 카운트 20 | if (uniqueToppings.size === toppingCounts.size) { 21 | answer++; 22 | } 23 | } 24 | 25 | return answer; 26 | } -------------------------------------------------------------------------------- /Hyeple/230829/LV2_택배상자.js: -------------------------------------------------------------------------------- 1 | function solution(order) { 2 | const assistance = []; 3 | let answer = 0; 4 | let i = 0; 5 | 6 | // 컨베이어 벨트를 반복하여 상자를 옮기는 과정 7 | for (let box = 1; box <= order.length; box++) { 8 | if (order[i] !== box) { //상자가 택배 기사가 원하는 상자 번호가 아닌 경우 9 | assistance.push(box); 10 | continue; 11 | } 12 | 13 | // 상자가 택배 기사가 원하는 상자 번호일 경우 14 | i++; 15 | answer++; 16 | 17 | // 보조 컨베이어 벨트에 만족하는 상자 번호가 있을 때 18 | while (assistance.length !== 0 && order[i] === assistance[assistance.length - 1]) { 19 | assistance.pop(); 20 | i++; 21 | answer++; 22 | } 23 | } 24 | 25 | return answer; 26 | } -------------------------------------------------------------------------------- /Hyeple/230829/README.md: -------------------------------------------------------------------------------- 1 | 20230829 장혜원 문제 풀이 2 | 3 | 1. [골드5] 회문 https://www.acmicpc.net/problem/17609 4 | 5 | 2. [골드5] 풍선 맞추기 https://www.acmicpc.net/problem/11509 6 | 7 | 3. [Lv2] 롤케이크 자르기 https://school.programmers.co.kr/learn/courses/30/lessons/132265 8 | 9 | 4. [Lv2] 택배상자 https://school.programmers.co.kr/learn/courses/30/lessons/131704 10 | 11 | 5. [골드5] 평범한 배낭 https://www.acmicpc.net/problem/12865 12 | 13 | 14 | https://hw-ple.notion.site/20230829-13e3dc1ae3b94792a50ccc4c27fd1de6?pvs=4 15 | -------------------------------------------------------------------------------- /Hyeple/230829/골드5_평범한배낭.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs'); 2 | let input = fs.readFileSync('input.txt').toString().split('\n'); 3 | 4 | let [N, K] = input[0].split(' ').map(Number); 5 | let items = []; 6 | 7 | for (let i = 1; i <= N; i++) { 8 | let [W, V] = input[i].split(' ').map(Number); 9 | items.push({ weight: W, value: V }); 10 | } 11 | 12 | //배낭 문제 13 | let dp = new Array(K + 1).fill(0); // dp[i] = i 무게의 배낭에서 얻을 수 있는 최대 가치 14 | 15 | for (let i = 0; i < N; i++) { 16 | for (let j = K; j >= items[i].weight; j--) { 17 | dp[j] = Math.max(dp[j], dp[j - items[i].weight] + items[i].value); 18 | } 19 | } 20 | 21 | console.log(dp[K]); -------------------------------------------------------------------------------- /Hyeple/230829/골드5_풍선맞추기.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs'); 2 | let input = fs.readFileSync('input.txt').toString().split('\n'); 3 | 4 | let n = Number(input[0]); 5 | let h = input[1].split(' ').map(Number); 6 | let result = 0; 7 | 8 | let arrow = new Array(100001).fill(0); //각 높이에 현재 화살이 0개라고 가정 9 | for(let x of h){ 10 | if(arrow[x] > 0){ //해당 높이에 화살 있는 상황 11 | arrow[x] -= 1; //화살 개수 줄임 12 | arrow[x-1] += 1; //화살 위치를 한 단계 낮춤 13 | } 14 | else { //해당 높이에 화살이 없는 상황 15 | arrow[x-1] += 1; 16 | result += 1; //화살을 쏨 17 | } 18 | } 19 | 20 | console.log(result); -------------------------------------------------------------------------------- /Hyeple/230905/LV2_혼자놀기의달인.js: -------------------------------------------------------------------------------- 1 | function solution(cards) { 2 | const answer = []; 3 | let visited = new Array(cards.length + 1).fill(false); // 방문 체크 4 | 5 | for (let v of cards) { 6 | if (!visited[v]) { 7 | const temp = []; 8 | while (!temp.includes(v)) { 9 | temp.push(v); 10 | v = cards[v - 1]; 11 | visited[v] = true; 12 | } 13 | answer.push(temp.length); 14 | } 15 | } 16 | 17 | if (answer[0] === cards.length) { 18 | return 0; 19 | } else { 20 | answer.sort((a, b) => b - a); // 내림차순 정렬 21 | } 22 | 23 | return answer[0] * answer[1]; 24 | } -------------------------------------------------------------------------------- /Hyeple/230905/README.md: -------------------------------------------------------------------------------- 1 | 1. [골드1] k번째 수 https://www.acmicpc.net/problem/1300 2 | 2. [골드4] 알파벳 https://www.acmicpc.net/problem/1987 3 | 3. [골드4] 스도쿠 https://www.acmicpc.net/problem/2239 4 | 4. [골드5] 수나누기게임 https://www.acmicpc.net/problem/27172 5 | 5. [LV2] 혼자 놀기의 달인 https://school.programmers.co.kr/learn/courses/30/lessons/131130 6 | 7 | https://hw-ple.notion.site/20230905-a7a6c19984094612af87129a176d2364?pvs=4 8 | 9 | -------------------------------------------------------------------------------- /Hyeple/230905/골드1_k번째수.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs'); 2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n'); 3 | 4 | let n = Number(input[0]); 5 | let k = Number(input[1]); 6 | 7 | let start = 1; 8 | let end = 10 ** 10; 9 | 10 | let result = 0; 11 | while (start <= end) { //이진탐색 시작 12 | let mid = parseInt((start+end) / 2); //중간점 (현재) 13 | let total = 0; //중간값보다 작거나 같은 데이터 개수 14 | for (let i = 1; i <= n ; i++) { //각 행마다 계산하도록 했음 15 | total += Math.min(parseInt(mid/i), n); 16 | } 17 | if (total >= k) { //mid보다 작거나 같은 데이터 개수가 k이상일때 18 | result = mid; //결과값 저장 19 | end = mid - 1; 20 | } 21 | //mid보다 작거나 같은 데이터의 개수가 k개 미만이면 22 | else start = mid + 1; 23 | } 24 | console.log(result); -------------------------------------------------------------------------------- /Hyeple/230905/골드5_수나누기게임.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const input = fs.readFileSync('/dev/stdin').toString().split('\n'); 3 | 4 | //입력 처리 5 | const N = parseInt(input[0]); 6 | const SIZE = 1000001; 7 | 8 | const player = input[1].split(' ').map(Number); 9 | const card = new Array(SIZE).fill(false); 10 | const score = new Array(SIZE).fill(0); 11 | 12 | for (const num of player) { 13 | card[num] = true; 14 | } 15 | 16 | //카드의 배수에 해당하는 카드가 있는지 확인 17 | for (const i of player) { 18 | for (let j = i * 2; j < SIZE; j += i) { 19 | if (card[j]) { 20 | score[i]++; 21 | score[j]--; 22 | } 23 | } 24 | } 25 | 26 | const result = player.map(num => score[num]).join(' '); 27 | 28 | console.log(result); -------------------------------------------------------------------------------- /Hyeple/230912/Lv2_파일명정렬.js: -------------------------------------------------------------------------------- 1 | function solution(files) { 2 | return files.sort((a, b) => { 3 | const aMatch = a.match(/([a-zA-Z\s.-]+)([0-9]{1,5})(.*)/); 4 | const bMatch = b.match(/([a-zA-Z\s.-]+)([0-9]{1,5})(.*)/); 5 | 6 | const aHead = aMatch[1].toLowerCase(); 7 | const bHead = bMatch[1].toLowerCase(); 8 | const aNumber = parseInt(aMatch[2], 10); 9 | const bNumber = parseInt(bMatch[2], 10); 10 | 11 | if (aHead < bHead) return -1; 12 | if (aHead > bHead) return 1; 13 | 14 | if (aNumber < bNumber) return -1; 15 | if (aNumber > bNumber) return 1; 16 | 17 | return 0; 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /Hyeple/230912/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드5] 숫자 고르기](https://www.acmicpc.net/problem/2668) 2 | 2. [[골드5] 적록색약](https://www.acmicpc.net/problem/10026) 3 | 3. [[골드4] 뱀](https://www.acmicpc.net/problem/3190) 4 | 4. [[LV2] 행렬 테두리 회전하기](https://school.programmers.co.kr/learn/courses/30/lessons/77485) 5 | 5. [[LV2] 파일명 정렬](https://school.programmers.co.kr/learn/courses/30/lessons/17686) 6 | 7 | https://hw-ple.notion.site/20230912-ac3de928bace4be685be3ac356639c2e?pvs=4 -------------------------------------------------------------------------------- /Hyeple/230912/input.txt: -------------------------------------------------------------------------------- 1 | 6 2 | 3 3 | 3 4 4 | 2 5 5 | 5 3 6 | 3 7 | 3 D 8 | 15 L 9 | 17 D -------------------------------------------------------------------------------- /Hyeple/230919/Lv2_땅따먹기.js: -------------------------------------------------------------------------------- 1 | function solution(land) { 2 | const N = land.length; 3 | const dp = new Array(N).fill(0).map(() => new Array(4).fill(0)); 4 | 5 | //1행 초기값 6 | for (let i = 0; i < 4; i++) { 7 | dp[0][i] = land[0][i]; 8 | } 9 | 10 | //2행 dp 11 | for (let i = 1; i < N; i++) { 12 | for (let j = 0; j < 4; j++) { 13 | dp[i][j] = land[i][j] + Math.max(dp[i - 1][(j + 1) % 4], dp[i - 1][(j + 2) % 4], dp[i - 1][(j + 3) % 4]); 14 | } 15 | } 16 | 17 | return Math.max(...dp[N - 1]); 18 | } -------------------------------------------------------------------------------- /Hyeple/230919/Lv2_멀리뛰기.js: -------------------------------------------------------------------------------- 1 | function solution(n) { 2 | const MOD = 1234567; 3 | const dp = new Array(n + 1).fill(0); 4 | 5 | dp[1] = 1; 6 | dp[2] = 2; 7 | 8 | for (let i = 3; i <= n; i++) { 9 | dp[i] = (dp[i - 1] + dp[i - 2]) % MOD; 10 | } 11 | 12 | return dp[n]; 13 | } 14 | -------------------------------------------------------------------------------- /Hyeple/230919/Lv2_시소짝꿍.js: -------------------------------------------------------------------------------- 1 | function solution(weights) { 2 | const visit = new Array(4001).fill(-1); 3 | const sameWeightCount = new Array(1001).fill(-1); 4 | 5 | let pairCount = 0; 6 | 7 | for (let i = 0; i < weights.length; i++) { 8 | sameWeightCount[weights[i]] += 1; 9 | pairCount += sameWeightCount[weights[i]]; 10 | 11 | const sameWeightCnt = sameWeightCount[weights[i]]; 12 | 13 | // 2~4 배수 몸무게 -> 시소 방문 여부 업데이트 14 | for (let j = 2; j <= 4; j++) { 15 | visit[weights[i] * j] += 1; 16 | pairCount += visit[weights[i] * j] - sameWeightCnt; 17 | } 18 | } 19 | 20 | return pairCount; 21 | } -------------------------------------------------------------------------------- /Hyeple/230919/README.md: -------------------------------------------------------------------------------- 1 | 1. [골드4] 함께 블록쌓기 https://www.acmicpc.net/problem/18427 2 | 2. [Lv2] 땅따먹기 https://school.programmers.co.kr/learn/courses/30/lessons/12913 3 | 3. [Lv2] 리코쳇 로봇 https://school.programmers.co.kr/learn/courses/30/lessons/169199 4 | 4. [Lv2] 시소 짝꿍 https://school.programmers.co.kr/learn/courses/30/lessons/152996 5 | 5. [LV2] 멀리 뛰기 https://school.programmers.co.kr/learn/courses/30/lessons/12914 -------------------------------------------------------------------------------- /Hyeple/231017/lv2_멀쩡한사각형.js: -------------------------------------------------------------------------------- 1 | function gcd(a, b) { 2 | if (b === 0) return a; 3 | return gcd(b, a % b); 4 | } 5 | 6 | function solution(W, H) { 7 | const a = W + H - gcd(W, H); 8 | const total = W * H; 9 | const result= total - a; 10 | 11 | return result; 12 | } 13 | -------------------------------------------------------------------------------- /Hyeple/231031/백준_2133.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | 3 | const input = fs.readFileSync("/dev/stdin", "utf8").trim().split("\n"); 4 | const n = Number(input); 5 | 6 | if (n % 2 !== 0) return console.log(0); 7 | 8 | const dp = new Array(n + 1).fill(0); 9 | dp[0] = 1; 10 | dp[2] = 3; 11 | 12 | for (let i = 4; i <= n; i += 2) { 13 | dp[i] = dp[i - 2] * 3; 14 | 15 | for (let j = 4; j <= i; j += 2) { 16 | dp[i] += dp[i - j] * 2; 17 | } 18 | } 19 | 20 | console.log(dp[n]); 21 | -------------------------------------------------------------------------------- /Hyeple/231031/프로그래머스_줄서는방법.js: -------------------------------------------------------------------------------- 1 | function solution(n, k) { 2 | function factorial(num) { 3 | let result = 1; 4 | for (let i = 1; i <= num; i++) { 5 | result *= i; 6 | } 7 | return result; 8 | } 9 | 10 | const answer = []; 11 | const numbers = Array.from({ length: n }, (_, idx) => idx + 1); 12 | 13 | k--; 14 | 15 | for (let i = n - 1; i >= 0; i--) { 16 | const fact = factorial(i); 17 | const index = Math.floor(k / fact); 18 | answer.push(numbers.splice(index, 1)[0]); 19 | k %= fact; 20 | } 21 | 22 | return answer; 23 | } 24 | -------------------------------------------------------------------------------- /Hyeple/231107/boj_13164.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | 3 | const input = fs.readFileSync("/dev/stdin", "utf-8").split("\n"); 4 | const [n, k] = input[0].split(" ").map(Number); 5 | const Length = input[1].split(" ").map(Number); 6 | const tmp = []; 7 | 8 | for (let i = 0; i < n - 1; i++) { 9 | tmp.push(Length[i + 1] - Length[i]); 10 | } 11 | 12 | tmp.sort((a, b) => a - b); 13 | 14 | let result = 0; 15 | 16 | for (let i = 0; i < n - k; i++) { 17 | result += tmp[i]; 18 | } 19 | 20 | console.log(result); 21 | -------------------------------------------------------------------------------- /Hyeple/231107/boj_1339.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const input = fs.readFileSync("/dev/stdin", "utf8").split("\n"); 3 | const wordList = []; 4 | let ans = 0; 5 | const dic = {}; 6 | 7 | const n = parseInt(input[0]); 8 | for (let i = 1; i <= n; i++) { 9 | wordList.push(input[i].trim()); 10 | } 11 | 12 | for (let i of wordList) { 13 | let cnt = i.length; 14 | for (let j of i) { 15 | if (!dic[j]) { 16 | dic[j] = 10 ** (cnt - 1); 17 | } else { 18 | dic[j] += 10 ** (cnt - 1); 19 | } 20 | cnt--; 21 | } 22 | } 23 | 24 | const valuesList = Object.values(dic).sort((a, b) => b - a); 25 | 26 | let num = 9; 27 | for (let i of valuesList) { 28 | ans += i * num; 29 | num--; 30 | } 31 | 32 | console.log(ans); 33 | -------------------------------------------------------------------------------- /Hyeple/231107/boj_1652.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const input = fs.readFileSync("/dev/stdin", "utf8").split("\n"); 3 | const n = parseInt(input[0]); 4 | const graph = input.slice(1, n + 1); 5 | 6 | let rowCnt = 0; 7 | let colCnt = 0; 8 | 9 | for (let i = 0; i < n; i++) { 10 | const parts = graph[i].split("X"); 11 | for (let j = 0; j < parts.length; j++) { 12 | if (parts[j].length >= 2) { 13 | rowCnt++; 14 | } 15 | } 16 | } 17 | 18 | for (let i = 0; i < n; i++) { 19 | let col = 0; 20 | for (let j = 0; j < n; j++) { 21 | if (graph[j][i] === ".") { 22 | col++; 23 | } else { 24 | col = 0; 25 | } 26 | if (col === 2) { 27 | colCnt++; 28 | } 29 | } 30 | } 31 | console.log(rowCnt, colCnt); 32 | -------------------------------------------------------------------------------- /Hyeple/231107/pro_42860.js: -------------------------------------------------------------------------------- 1 | function solution(name) { 2 | let answer = 0; 3 | const len = name.length; 4 | let move = len - 1; 5 | 6 | for (let i = 0; i < len; i++) { 7 | const charCodeA = "A".charCodeAt(0); 8 | const charCodeZ = "Z".charCodeAt(0); 9 | const charCodeCurrent = name.charCodeAt(i); 10 | 11 | answer += Math.min(charCodeCurrent - charCodeA, charCodeZ - charCodeCurrent + 1); 12 | 13 | let next = i + 1; 14 | while (next < len && name.charAt(next) === "A") { 15 | next++; 16 | } 17 | 18 | move = Math.min(move, i * 2 + len - next, (len - next) * 2 + i); 19 | } 20 | answer += move; 21 | 22 | return answer; 23 | } 24 | -------------------------------------------------------------------------------- /Hyeple/231114/boj_11399.js: -------------------------------------------------------------------------------- 1 | let fs = require("fs"); 2 | let input = fs.readFileSync("/dev/stdin").toString().split("\n"); 3 | 4 | let n = Number(input[0]); 5 | let arr = input[1].split(" ").map(Number); 6 | 7 | arr.sort((a, b) => { 8 | return a - b; 9 | }); 10 | 11 | let cnt = 0; 12 | let answer = 0; 13 | for (let i = 0; i < n; i++) { 14 | cnt += arr[i]; 15 | answer += cnt; 16 | } 17 | 18 | console.log(answer); 19 | -------------------------------------------------------------------------------- /Hyeple/231114/boj_1783.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | 3 | const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n"); 4 | 5 | const [n, m] = input[0].split(" ").map(Number); 6 | 7 | if (n === 1) { 8 | console.log(1); 9 | } else if (n === 2) { 10 | console.log(Math.min(4, Math.floor((m - 1) / 2) + 1)); 11 | } else if (m <= 6) { 12 | console.log(Math.min(4, m)); 13 | } else { 14 | console.log(m - 2); 15 | } 16 | 17 | //나이트 움직임 4개로 그리디 가능 18 | -------------------------------------------------------------------------------- /Hyeple/231114/pro_12923.js: -------------------------------------------------------------------------------- 1 | function solution(begin, end) { 2 | const answer = []; 3 | 4 | for (let i = begin; i <= end; i++) { 5 | let minNum = 1; 6 | let maxNum = 1; 7 | for (let j = 2; j <= Math.sqrt(i); j++) { 8 | if (i % j === 0) { 9 | if (i / j <= 10000000) { 10 | minNum = j; 11 | answer.push(i / j); 12 | break; 13 | } else { 14 | maxNum = j; 15 | } 16 | } 17 | } 18 | if (i === 1) { 19 | answer.push(0); 20 | } else if (minNum === 1) { 21 | answer.push(maxNum); 22 | } 23 | } 24 | return answer; 25 | } 26 | -------------------------------------------------------------------------------- /Hyeple/231114/pro_42746.js: -------------------------------------------------------------------------------- 1 | function solution(numbers) { 2 | const numbersStr = numbers.map((num) => num.toString()); 3 | numbersStr.sort((a, b) => b + a - (a + b)); 4 | 5 | console.log(numbersStr); 6 | return BigInt(numbersStr.join("")).toString(); 7 | } 8 | -------------------------------------------------------------------------------- /Hyeple/231128/pro_155651.js: -------------------------------------------------------------------------------- 1 | function solution(bookTime) { 2 | const time = Array(60 * 24).fill(0); 3 | 4 | for (const [s, e] of bookTime) { 5 | const start = 60 * parseInt(s.slice(0, 2)) + parseInt(s.slice(3)); 6 | let end = 60 * parseInt(e.slice(0, 2)) + parseInt(e.slice(3)) + 10; 7 | 8 | if (end > 60 * 24 - 1) { 9 | end = 60 * 24 - 1; 10 | } 11 | 12 | for (let i = start; i < end; i++) { 13 | time[i] += 1; 14 | } 15 | } 16 | 17 | return Math.max(...time); 18 | } 19 | -------------------------------------------------------------------------------- /JeeeunOh/230221/README.md: -------------------------------------------------------------------------------- 1 | ### 스택 큐 2 | 3 | 1. [boj1335번.트럭](https://www.acmicpc.net/problem/13335) 4 | 2. [boj6198번.옥상정원 꾸미기](https://www.acmicpc.net/problem/6198) 5 | 3. [boj2841번.외계인의 기타연주](https://www.acmicpc.net/problem/2841) 6 | 4. [programmers.다리를 지나는 트럭](https://school.programmers.co.kr/learn/courses/30/lessons/42583) 7 | -------------------------------------------------------------------------------- /JeeeunOh/230221/boj2841_외계인의기타연주.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n'); 3 | 4 | // 음의 수, 한 줄의 프렛의 수 5 | let N = +input[0].split(' ')[0]; 6 | let P = +input[0].split(' ')[1]; 7 | 8 | let guitar = []; 9 | 10 | for (let i = 0; i < N; i++) { 11 | guitar.push([]); 12 | } 13 | 14 | let ans = 0; 15 | 16 | for (let i = 1; i < input.length; i++) { 17 | let num = +input[i].split(' ')[0]; 18 | let fret = +input[i].split(' ')[1]; 19 | let cur = guitar[num - 1]; 20 | 21 | // 눌러야하는 fret이 번호가 크면 계속 pop 22 | while (cur[cur.length - 1] > fret) { 23 | ans++; 24 | cur.pop(); 25 | } 26 | 27 | if (cur[cur.length - 1] != fret) { 28 | cur.push(fret); 29 | ans++; 30 | } 31 | } 32 | 33 | console.log(JSON.stringify(ans)); 34 | -------------------------------------------------------------------------------- /JeeeunOh/230221/input.txt: -------------------------------------------------------------------------------- 1 | 7 15 2 | 1 5 3 | 2 3 4 | 2 5 5 | 2 7 6 | 2 4 7 | 1 5 8 | 1 3 -------------------------------------------------------------------------------- /JeeeunOh/230221/pro_다리를지나는트럭.js: -------------------------------------------------------------------------------- 1 | function solution(len, limit, wArr) { 2 | // 다리 길이, 버티는 무게, 트럭 무게 배열 3 | let time = 0; 4 | let bridge = Array(len).fill(0); 5 | let weight = 0; 6 | 7 | while (true) { 8 | time++; 9 | // 다리 맨 앞의 트럭 한대 빼기 10 | weight -= bridge[0]; 11 | bridge.shift(); 12 | // 다리 위 트럭과 대기 중인 트럭이 한대도 없을 때 return 13 | if (wArr.length == 0 && weight == 0) { 14 | return time; 15 | } 16 | // 대기중인 트럭이 올라갈 수 있을 때 17 | if (wArr[0] + weight <= limit) { 18 | weight += wArr[0]; 19 | bridge.push(wArr[0]); 20 | wArr.shift(); 21 | } 22 | // 없을 때 23 | else { 24 | bridge.push(0); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /JeeeunOh/230228/README.md: -------------------------------------------------------------------------------- 1 | ### 스택 큐 2 | 3 | 1. [programmers.섬 연결하기](https://school.programmers.co.kr/learn/courses/30/lessons/42861) 4 | 2. [boj1911번.흙길 보수하기](https://www.acmicpc.net/problem/1911) 5 | 3. [programmers.두 큐의 합 같게 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/118667) 6 | 4. [boj1504.특정한 최단 경로](https://www.acmicpc.net/problem/1504) 7 | 5. [boj2251.물통](https://www.acmicpc.net/problem/2251) 8 | 6. [programmers.여행 경로](https://school.programmers.co.kr/learn/courses/30/lessons/43164) 9 | -------------------------------------------------------------------------------- /JeeeunOh/230307/README.md: -------------------------------------------------------------------------------- 1 | 1. [boj2666번.벽장문의이동](https://www.acmicpc.net/problem/2666) 2 | 2. [programmers.양궁대회](https://school.programmers.co.kr/learn/courses/30/lessons/92342) 3 | 3. [boj4803번.트리](https://www.acmicpc.net/problem/4803) 4 | 4. [programmers.혼자서하는틱택토](https://school.programmers.co.kr/learn/courses/30/lessons/160585) 5 | 5. [programmers.게임맵최단거리](https://school.programmers.co.kr/learn/courses/30/lessons/1844) 6 | 6. [boj5052번.전화번호목록](https://www.acmicpc.net/problem/5052) 7 | -------------------------------------------------------------------------------- /JeeeunOh/230307/boj5052_전화번호목록.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const input = fs 3 | .readFileSync('/dev/stdin') 4 | .toString() 5 | .trim() 6 | .split('\n'); 7 | 8 | let num = Number(input[0]); 9 | let idx = 1; 10 | while (num--) { 11 | let cnt = +input[idx]; 12 | // 전화번호 문자열 길이 기준 오름차순 13 | let arr = input.slice(idx + 1, idx + cnt + 1); 14 | arr.sort(); 15 | let ans = 'YES'; 16 | 17 | for (let i = 0; i < arr.length - 1; i++) { 18 | if (arr[i] === arr[i + 1].substring(0, arr[i].length)) { 19 | ans = 'NO'; 20 | break; 21 | } 22 | } 23 | 24 | console.log(ans); 25 | idx += cnt + 1; 26 | } 27 | -------------------------------------------------------------------------------- /JeeeunOh/230314/README.md: -------------------------------------------------------------------------------- 1 | 1. [programmers.호텔대실](https://school.programmers.co.kr/learn/courses/30/lessons/155651)✅ 2 | 2. [programmers.모음사전](https://school.programmers.co.kr/learn/courses/30/lessons/84512)✅ 3 | 3. [programmers.주차요금계산](https://school.programmers.co.kr/learn/courses/30/lessons/92341)✅ 4 | 4. [boj11058번.크리보드](https://www.acmicpc.net/problem/11058)✅ 5 | 5. [programmers.덧칠하기](https://school.programmers.co.kr/learn/courses/30/lessons/161989)✅ 6 | 6. [boj2573번.빙산](https://www.acmicpc.net/problem/2573)✅ -------------------------------------------------------------------------------- /JeeeunOh/230314/pro_덧칠하기.js: -------------------------------------------------------------------------------- 1 | // 웅덩이 문제랑 비슷한 듯 2 | function solution(n, m, section) { 3 | let answer = 0; 4 | let paint_idx = 0; 5 | 6 | for(let i=0 ; i{ 6 | let [alpha, len] = item.split(' '); 7 | terms_map[alpha] = +len; 8 | }) 9 | 10 | // 오늘 날짜, 약관 유효기간 11 | const termToDate = (date) => { 12 | const [year, month, day] = date.split('.').map(Number); 13 | return (year-1)*28*12 + (month-1)*28 + day; 14 | } 15 | 16 | let today_term = termToDate(today); 17 | 18 | privacies.map((pri, idx)=>{ 19 | let [date, alpha] = pri.split(' '); 20 | let pri_term = termToDate(date); 21 | 22 | if( today_term - pri_term >= terms_map[alpha]*28 ){ 23 | answer.push(idx+1) 24 | } 25 | }) 26 | 27 | return answer; 28 | } -------------------------------------------------------------------------------- /JeeeunOh/230321/pro_이중우선순위큐.js: -------------------------------------------------------------------------------- 1 | function solution(operations) { 2 | let queue = []; 3 | 4 | operations.forEach((item)=>{ 5 | let [op, num] = item.split(' '); 6 | if(op==='I') queue.push(+num); 7 | else if (op==='D' && num ==='1' && queue.length){ // 최댓값 삭제 8 | queue.sort((a, b)=> a-b); 9 | queue.pop(); 10 | } else if (op==='D' && num ==='-1' && queue.length){ // 최솟값 삭제 11 | queue.sort((a, b)=> b-a); 12 | queue.pop(); 13 | } 14 | }) 15 | 16 | queue.sort((a, b)=> a-b); 17 | 18 | return queue.length? [queue[queue.length-1], queue[0]] : [0, 0]; 19 | } -------------------------------------------------------------------------------- /JeeeunOh/230328/README.md: -------------------------------------------------------------------------------- 1 | 1. [boj21772번.가희의고구마먹방](https://www.acmicpc.net/problem/21772)✅ 2 | 3 | 2. [boj9372번.상근이의여행](https://www.acmicpc.net/problem/9372)✅ 4 | 5 | 3. [programmers.등대](https://school.programmers.co.kr/learn/courses/30/lessons/133500)✅ 6 | 7 | 4. [programmers.스킬트리](https://school.programmers.co.kr/learn/courses/30/lessons/49993)✅ 8 | 9 | 5. [programmers.자물쇠와열쇠](https://school.programmers.co.kr/learn/courses/30/lessons/60059)✅ -------------------------------------------------------------------------------- /JeeeunOh/230328/boj9372_상근이의여행.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | // const input = fs.readFileSync('/dev/stdin').toString().split('\n'); 3 | const input = fs.readFileSync('/Users/jieun/Documents/GitHub/JS_ALGORITHM_STUDY/JeeeunOh/230328/input.txt').toString().split('\n'); 4 | 5 | let T = +input.shift(); 6 | 7 | let idx=0; 8 | while(T--){ 9 | // 국가의 수, 비행기 종류 10 | let [N, M] = input[idx].split(' ').map(Number); 11 | idx+=M+1; 12 | console.log(N-1); 13 | } -------------------------------------------------------------------------------- /JeeeunOh/230328/input.txt: -------------------------------------------------------------------------------- 1 | 11 11 5 2 | G....S..... 3 | ........... 4 | ........... 5 | ........... 6 | ........... 7 | ........... 8 | .....#..... 9 | ........... 10 | ........... 11 | ........... 12 | ........... -------------------------------------------------------------------------------- /JeeeunOh/230404/README.md: -------------------------------------------------------------------------------- 1 | 1. [programmers.귤 고르기](https://school.programmers.co.kr/learn/courses/30/lessons/138476)✅ 2 | 3 | 2. [programmers.메뉴 리뉴얼](https://school.programmers.co.kr/learn/courses/30/lessons/72411)✅ 4 | 5 | 3. [boj13022번.늑대와 올바른 단어](https://www.acmicpc.net/problem/13022)✅ 6 | 7 | 4. [boj17505번.링고와 순열](https://www.acmicpc.net/problem/17505)✅ 8 | 9 | 5. [programmers.광물 캐기](https://school.programmers.co.kr/learn/courses/30/lessons/172927)✅ 10 | -------------------------------------------------------------------------------- /JeeeunOh/230404/pro_귤고르기.js: -------------------------------------------------------------------------------- 1 | function solution(k, tangerine) { 2 | let answer=0; 3 | // 귤 개수 담은 map 4 | let cnt = new Map(); 5 | for(const tan of tangerine){ 6 | cnt.get(tan)? cnt.set(tan, cnt.get(tan)+1):cnt.set(tan, 1); 7 | } 8 | // 귤 개수대로 내림차순 위해 배열로 변환 9 | let mapToArray = [...cnt]; 10 | mapToArray.sort((a, b) => b[1]-a[1]); 11 | 12 | // 필요한 귤 개수 맞추면 반복문 break 13 | for(const tan of mapToArray){ 14 | answer++; 15 | k-=tan[1]; 16 | if(k<=0) break; 17 | } 18 | 19 | return answer; 20 | } -------------------------------------------------------------------------------- /JeeeunOh/230411/README.md: -------------------------------------------------------------------------------- 1 | 1. [boj18428번.감시 피하기](https://www.acmicpc.net/problem/18428)✅ 2 | 3 | 2. [programmers.표현 가능한 이진트리](https://school.programmers.co.kr/learn/courses/30/lessons/150367)✅ 4 | 5 | 3. [programmers.과제 진행하기](https://school.programmers.co.kr/learn/courses/30/lessons/176962)✅ 6 | 7 | 4. [programmers.성격유형 검사하기](https://school.programmers.co.kr/learn/courses/30/lessons/118666)✅ 8 | 9 | 5. [programmers.프렌즈블록](https://school.programmers.co.kr/learn/courses/30/lessons/17679)✅ -------------------------------------------------------------------------------- /JeeeunOh/230411/input.txt: -------------------------------------------------------------------------------- 1 | 4 2 | S S S T 3 | X X X X 4 | X X X X 5 | T T T X -------------------------------------------------------------------------------- /JeeeunOh/230418/README.md: -------------------------------------------------------------------------------- 1 | 1. [boj1937번.욕심쟁이 판다](https://www.acmicpc.net/problem/1937)✅ 2 | 3 | 2. [programmers.등산코스 정하기](https://school.programmers.co.kr/learn/courses/30/lessons/118669)✅ 4 | 5 | 3. [programmers.양과 늑대](https://school.programmers.co.kr/learn/courses/30/lessons/92343)✅ 6 | 7 | 4. [programmers.택배상자](https://school.programmers.co.kr/learn/courses/30/lessons/131704)✅ 8 | 9 | 5. [programmers.디펜스 게임](https://school.programmers.co.kr/learn/courses/30/lessons/142085)✅ -------------------------------------------------------------------------------- /JeeeunOh/230418/input.txt: -------------------------------------------------------------------------------- 1 | 4 2 | 14 9 12 10 3 | 1 11 5 4 4 | 7 15 2 13 5 | 6 3 16 8 -------------------------------------------------------------------------------- /JeeeunOh/230418/pro_택배상자.js: -------------------------------------------------------------------------------- 1 | // 1 2 3 4 5-> 4 3 1 2 5 2 | function solution(order) { 3 | var answer = 0, idx=0; 4 | let st = []; 5 | 6 | 7 | for(let i=1 ; i<=order.length; i++){ 8 | if(order[idx]>i) st.push(i); // 4 발견할 때까지 스택에 담음. => 1,2,3 순서대로 담김. 9 | else if(order[idx]===i) { // 4 발견하면 10 | answer++; 11 | idx++; // 다음 택배상자 탐색위해 idx++ 12 | } 13 | 14 | while(st.length && st[st.length-1]===order[idx]){ // 스택 맨 위의 요소가 현재 탐색 요소와 같으면 15 | st.pop(); // 스택에서 해당 상자 뽑아주기 16 | idx++; 17 | answer++; 18 | } 19 | } 20 | 21 | return answer; 22 | } -------------------------------------------------------------------------------- /JeeeunOh/230425/README.md: -------------------------------------------------------------------------------- 1 | 1. [boj14925번.목장 건설하기](https://www.acmicpc.net/problem/14925)✅ 2 | 3 | 2. [programmers.미로탈출명령어](https://school.programmers.co.kr/learn/courses/30/lessons/150365) 4 | 5 | 3. [programmers.롤케이크 자르기](https://school.programmers.co.kr/learn/courses/30/lessons/132265)✅ 6 | 7 | 4. [programmers.숫자 블록](https://school.programmers.co.kr/learn/courses/30/lessons/12923)✅ 8 | 9 | 5. [programmers.오픈 채팅방](https://school.programmers.co.kr/learn/courses/30/lessons/42888)✅ -------------------------------------------------------------------------------- /JeeeunOh/230425/input.txt: -------------------------------------------------------------------------------- 1 | 6 6 2 | 0 0 0 1 0 0 3 | 0 0 0 2 1 0 4 | 0 0 2 0 0 0 5 | 0 1 0 0 0 0 6 | 2 0 0 0 0 0 7 | 0 0 0 0 0 0 -------------------------------------------------------------------------------- /JeeeunOh/230425/pro_롤케이크자르기.js: -------------------------------------------------------------------------------- 1 | function solution(topping) { 2 | let answer = 0; 3 | let a = new Map(); 4 | let b = new Map(); 5 | 6 | for(const cur of topping){ 7 | a.set(cur, a.has(cur)? a.get(cur)+1 : 1) 8 | } 9 | 10 | for(const cur of topping){ // 0~i까지 b거 11 | // a에서 빼주기 12 | a.set(cur, a.get(cur)-1); 13 | if(a.get(cur)===0){ 14 | a.delete(cur); 15 | } 16 | // b에 더하기 17 | if(b.get(cur)){ 18 | b.set(cur, b.get(cur)+1); 19 | } else { 20 | b.set(cur, 1); 21 | } 22 | if(a.size===b.size) answer++; 23 | } 24 | 25 | return answer; 26 | } -------------------------------------------------------------------------------- /JeeeunOh/230425/pro_숫자블록.js: -------------------------------------------------------------------------------- 1 | function solution(begin, end) { 2 | let answer = []; 3 | 4 | for(let i=begin; i<=end; i++){ 5 | answer.push(findN(i)); 6 | } 7 | return answer; 8 | } 9 | 10 | function findN(number){ 11 | if(number===1) return 0; 12 | 13 | let temp = 1; 14 | for(let i=2 ; i<=Math.sqrt(number); i++){ 15 | if(number%i===0){ 16 | temp = i; 17 | // 10**7인데 10*7로 써서 한시간동안 에러 찾음...;; 18 | // 예시케이스는 되는데 테케는 왜 안되나...내가 멀 잘못햇나..세상이 날 억까한다... 19 | if(number/i<=10**7) return number/i; 20 | } 21 | } 22 | return temp; 23 | } 24 | -------------------------------------------------------------------------------- /JeeeunOh/230502/README.md: -------------------------------------------------------------------------------- 1 | 1. [[Lv. 3] 최고의 집합](https://school.programmers.co.kr/learn/courses/30/lessons/12938)✅ 2 | 3 | 2. [[Lv. 2] 2개 이하로 다른 비트](https://school.programmers.co.kr/learn/courses/30/lessons/77885)✅ 4 | 5 | 3. [[골드 5] 알약](https://www.acmicpc.net/problem/4811)✅ 6 | 7 | 4. [[Lv. 2] 이모티콘 할인행사](https://school.programmers.co.kr/learn/courses/30/lessons/150368)✅ 8 | 9 | 5. [[Lv. 3] 블록 이동하기](https://school.programmers.co.kr/learn/courses/30/lessons/60063)✅ -------------------------------------------------------------------------------- /JeeeunOh/230502/input.txt: -------------------------------------------------------------------------------- 1 | 6 2 | 1 3 | 4 4 | 2 5 | 3 6 | 30 7 | 0 -------------------------------------------------------------------------------- /JeeeunOh/230502/pro_최고의집합.js: -------------------------------------------------------------------------------- 1 | function solution(n, s) { 2 | let temp = Math.floor(s/n); 3 | if(temp<1) return [-1]; // 최고의 집합이 존재하지 않는 경우 4 | 5 | let answer = Array(n).fill(temp); 6 | let num = s-n*temp; // 남은 카운트 7 | 8 | for(let i=n-1; i>n-1-num ; i--){ 9 | answer[i]++; 10 | } 11 | 12 | return answer; 13 | } 14 | 15 | // 최대한 중간 수들끼리 곱하는 것이 이득. 16 | 17 | // 2, 9 -> 9/2 = 4.xx 18 | // 4 5 19 | 20 | // 3, 9 21 | // 3 3 3 22 | 23 | // 4 13 -> 13/4 = 3.xx 24 | // 3 3 3 4 25 | 26 | // 5 17 -> 17/5 = 3.xx 27 | // 3 3 3 4 4 28 | 29 | // 2 1 -> 1/2 = 0.xx 30 | // 실패 31 | 32 | // 3 2 -> 2/3 = 0.xx 33 | // 실패 -------------------------------------------------------------------------------- /JeeeunOh/230509/README.md: -------------------------------------------------------------------------------- 1 | 1. [[Lv.2] 숫자변환하기](https://school.programmers.co.kr/learn/courses/30/lessons/154538) 2 | 2. [[Lv.2] 삼각달팽이](https://school.programmers.co.kr/learn/courses/30/lessons/68645) 3 | 3. [[Lv.2] 순위 검색](https://school.programmers.co.kr/learn/courses/30/lessons/72412) 4 | 4. [[Lv.2] 타겟 넘버](https://school.programmers.co.kr/learn/courses/30/lessons/43165) 5 | 5. [[Lv.2] 테이블 해시 함수](https://school.programmers.co.kr/learn/courses/30/lessons/147354) -------------------------------------------------------------------------------- /JeeeunOh/230509/pro_숫자변환하기.js: -------------------------------------------------------------------------------- 1 | function solution(x, y, n) { 2 | let dp = new Array(y+1).fill(Infinity); 3 | dp[x] = 0; 4 | 5 | for(let i=x+1 ; i<=y ; i++){ 6 | if(i-n>=x) dp[i] = Math.min(dp[i], dp[i-n]+1); 7 | if(i%2===0) dp[i] = Math.min(dp[i], dp[i/2]+1); 8 | if(i%3===0) dp[i] = Math.min(dp[i], dp[i/3]+1); 9 | } 10 | 11 | return dp[y]===Infinity? -1 : dp[y]; 12 | } -------------------------------------------------------------------------------- /JeeeunOh/230509/pro_타겟넘버.js: -------------------------------------------------------------------------------- 1 | function solution(numbers, target) { 2 | let answer=0; 3 | 4 | const dfs = (curIdx, sum) => { 5 | if(curIdx===numbers.length){ 6 | if(sum===target) answer++; 7 | return; 8 | } 9 | dfs(curIdx+1, sum-numbers[curIdx]) 10 | dfs(curIdx+1, sum+numbers[curIdx]) 11 | } 12 | 13 | dfs(0, 0); 14 | 15 | return answer; 16 | } -------------------------------------------------------------------------------- /JeeeunOh/230509/pro_테이블해시함수.js: -------------------------------------------------------------------------------- 1 | function solution(data, col, row_begin, row_end) { 2 | data.sort((a, b)=>{ 3 | return a[col-1]===b[col-1]? b[0]-a[0] : a[col-1]-b[col-1]; 4 | }) 5 | 6 | let S_i = data.map((item, idx)=> { 7 | return item.reduce((acc, cur)=> acc + cur%(idx+1), 0) 8 | }).slice(row_begin-1, row_end); 9 | 10 | let sum = S_i[0]; 11 | 12 | for(let i=1; i { 8 | // 연 상자들 9 | let last = curArr.length - 1; 10 | if (curArr.includes(cards[curArr[last]])) { 11 | // 열려고 했는데 이미 열려있을 때 12 | cnt.push(last + 1); 13 | for (let i = 0; i < curArr.length; i++) arr[curArr[i]] = 0; 14 | return; 15 | } else { 16 | // 아닐 때 17 | calc([...curArr, cards[curArr[last]]]); 18 | } 19 | }; 20 | 21 | for (let i = 1; i <= cards.length; i++) { 22 | if (arr[i]) calc([i]); 23 | } 24 | cnt.sort((a, b) => b - a); 25 | return cnt[0] * cnt[1]; 26 | } 27 | -------------------------------------------------------------------------------- /JeeeunOh/230606/README.md: -------------------------------------------------------------------------------- 1 | 1. [[Lv.2] 쿼드압축 후 개수 세기](https://school.programmers.co.kr/learn/courses/30/lessons/68936)✅ 2 | 3 | 2. [[Lv.2] 무인도여행](https://school.programmers.co.kr/learn/courses/30/lessons/154540)✅ 4 | 5 | 3. [[Lv.2] 예상대진표](https://school.programmers.co.kr/learn/courses/30/lessons/12985)✅ 6 | 7 | 4. [[Lv.1] 체육복](https://school.programmers.co.kr/learn/courses/30/lessons/42862)✅ 8 | 9 | 5. [[Lv.2] 큰 수 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/42883)✅ 10 | -------------------------------------------------------------------------------- /JeeeunOh/230606/예상대진표.js: -------------------------------------------------------------------------------- 1 | function solution(n, a, b) { 2 | // a, b를 2^x로 나눈 몫이 같은 x를 찾기 3 | let ans = 1; 4 | while (2 ** ans <= n) { 5 | // 라운드 1~n -> 0~n-1라고 가정 6 | if (Math.floor((a - 1) / 2 ** ans) == Math.floor((b - 1) / 2 ** ans)) break; 7 | ans++; 8 | } 9 | return ans; 10 | } 11 | -------------------------------------------------------------------------------- /JeeeunOh/230606/체육복.js: -------------------------------------------------------------------------------- 1 | function solution(n, lost, reserve) { 2 | lost.sort((a, b) => a - b); 3 | reserve.sort((a, b) => a - b); 4 | 5 | lost = lost.filter((lt) => { 6 | // 1. 도난 당했는데 여벌 있을 때 7 | if (reserve.indexOf(lt) !== -1) { 8 | reserve.splice(reserve.indexOf(lt), 1); 9 | return false; 10 | } 11 | return true; 12 | }); 13 | lost = lost.filter((lt) => { 14 | // 2. 도난 당했는데 여벌 없을 때 15 | if (reserve.indexOf(lt - 1) !== -1) { 16 | // 2-1. 앞 사람한테 빌리기 17 | reserve.splice(reserve.indexOf(lt - 1), 1); 18 | return false; 19 | } else if (reserve.indexOf(lt + 1) !== -1) { 20 | // 2-2. 뒷 사람한테 빌리기 21 | reserve.splice(reserve.indexOf(lt + 1), 1); 22 | return false; 23 | } 24 | return true; 25 | }); 26 | 27 | return n - lost.length; 28 | } 29 | -------------------------------------------------------------------------------- /JeeeunOh/230606/큰수만들기.js: -------------------------------------------------------------------------------- 1 | // 스택 풀이 2 | function solution(number, k) { 3 | let ans = []; 4 | 5 | for (const num of number) { 6 | while (k > 0 && ans.at(-1) < num) { 7 | ans.pop(); 8 | k--; 9 | if (k === 0) break; 10 | } 11 | ans.push(num); 12 | } 13 | 14 | while (k--) ans.pop(); 15 | 16 | return ans.join(''); 17 | } 18 | 19 | // 10번 시간초과 풀이 20 | function solution(number, k) { 21 | let arr = number.split(''); 22 | let idx = 1; 23 | while (k) { 24 | if (arr[idx - 1] < arr[idx]) { 25 | arr.splice(idx - 1, 1); 26 | if (idx != 1) idx--; 27 | k--; 28 | } else if (idx < arr.length - 1) { 29 | idx++; 30 | } else if (idx >= arr.length - 1) break; 31 | } 32 | 33 | while (k--) { 34 | arr.pop(); 35 | } 36 | 37 | return arr.join(''); 38 | } 39 | -------------------------------------------------------------------------------- /JeeeunOh/230613/README.md: -------------------------------------------------------------------------------- 1 | 1. [[Lv. 2] 점 찍기](https://school.programmers.co.kr/learn/courses/30/lessons/140107)✅ 2 | 2. [[Lv. 2] 가장 큰 정사각형 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/12905)✅ 3 | 3. [[Lv. 2] 방금그곡](https://school.programmers.co.kr/learn/courses/30/lessons/17683)✅ 4 | 4. [[Lv. 2] 땅따먹기](https://school.programmers.co.kr/learn/courses/30/lessons/12913)✅ 5 | 5. [[Lv. 2] 마법의 엘리베이터](https://school.programmers.co.kr/learn/courses/30/lessons/148653)✅ 6 | 7 | +) [[Lv. 1] 달리기경주](https://school.programmers.co.kr/learn/courses/30/lessons/178871)✅ 8 | -------------------------------------------------------------------------------- /JeeeunOh/230613/달리기경주.js: -------------------------------------------------------------------------------- 1 | function solution(players, callings) { 2 | let order = new Map(); 3 | let name = new Map(); 4 | 5 | players.forEach((item, idx) => { 6 | order.set(idx, item); 7 | name.set(item, idx); 8 | }); 9 | 10 | callings.forEach((call) => { 11 | let number = name.get(call); // 얘가 몇등이었지? 12 | let preName = order.get(number - 1); // 얘 앞에있던 애 이름이 뭐지? 13 | 14 | order.set(number - 1, call); 15 | order.set(number, preName); 16 | 17 | name.set(call, number - 1); 18 | name.set(preName, number); 19 | }); 20 | 21 | let answer = [...order].sort((a, b) => a[0] - b[0]); // 등수대로 sort해서 22 | answer = answer.map((item) => item[1]); // 이름만 뽑기 23 | 24 | return answer; 25 | } 26 | -------------------------------------------------------------------------------- /JeeeunOh/230613/땅따먹기.js: -------------------------------------------------------------------------------- 1 | function solution(land) { 2 | let answer = 0; 3 | let dp = Array.from({length: land.length}, () => Array(4).fill(0)); 4 | 5 | for (let i = 0; i < 4; i++) { 6 | dp[0][i] = land[0][i]; 7 | } 8 | 9 | for (let i = 1; i < land.length; i++) { 10 | for (let j = 0; j < 4; j++) { 11 | for (let k = 0; k < 4; k++) { 12 | if (j !== k) dp[i][j] = Math.max(dp[i][j], dp[i - 1][k] + land[i][j]); 13 | } 14 | 15 | // 마지막 층에서 최대값 갱신 16 | if (i === land.length - 1) answer = Math.max(answer, dp[i][j]); 17 | } 18 | } 19 | 20 | return answer; 21 | } 22 | -------------------------------------------------------------------------------- /JeeeunOh/230613/마법의엘레베이터.js: -------------------------------------------------------------------------------- 1 | // 끝 자리가 5일 때를 기준으로 예외처리가 필요함 2 | // 85 일 때 8*10 + 5*1 (13)보다 1*100 - 3*10 - 5*1 (9)가 더 빠름. : case 3 | // 이 케이스 기준으로 (last == 5 && (st % 10) + 1 <= 5) 와 같은 공식이 나옴. 4 | 5 | function solution(st) { 6 | let cnt = 0; 7 | 8 | while (st) { 9 | let last = st % 10; // 나머지 10 | st = Math.floor(st / 10); // 몫 11 | 12 | // 끝자리가 5보다 작을 때 or 위에서 말한 케이스에 해당되지 않을 때 13 | if (last < 5 || (last === 5 && (st % 10) + 1 <= 5)) { 14 | cnt += last; 15 | } 16 | // 끝자리가 5보다 크거나 or 위에서 말한 케이스에 해당될 때 17 | else if (last > 5 || (last === 5 && (st % 10) + 1 > 5)) { 18 | cnt += 10 - last; 19 | st++; 20 | } 21 | } 22 | return cnt; 23 | } 24 | -------------------------------------------------------------------------------- /JeeeunOh/230613/점찍기.js: -------------------------------------------------------------------------------- 1 | function solution(k, d) { 2 | let answer = 0; 3 | let arr = []; 4 | for (let i = 0; i <= d; i += k) { 5 | arr.push(i); 6 | } 7 | 8 | for (const x of arr) { 9 | let y = Math.sqrt(d ** 2 - x ** 2); // y^2 = d^2 - x^2 10 | 11 | // Math.floor(y/k)은 y까지 찍을 수 있는 점의 개수. 이 때 0도 포함해야하므로 1 더해줌. 12 | answer += Math.floor(y / k) + 1; 13 | } 14 | 15 | return answer; 16 | } 17 | -------------------------------------------------------------------------------- /JeeeunOh/230620/124나라의숫자.js: -------------------------------------------------------------------------------- 1 | function solution(n) { 2 | let arr = ['1', '2', '4']; 3 | let ans = ''; 4 | 5 | while (n) { 6 | let temp = n % 3; 7 | n = Math.floor(n / 3); 8 | 9 | if (temp === 0) { 10 | temp = 2; 11 | n--; 12 | } else temp--; 13 | ans = arr[temp] + ans; 14 | } 15 | 16 | return ans; 17 | } 18 | -------------------------------------------------------------------------------- /JeeeunOh/230620/README.md: -------------------------------------------------------------------------------- 1 | 1. [[실버 1] 곱셈](https://www.acmicpc.net/problem/1629) ✅ 2 | 2. [[실버 2] 랜선 자르기](https://www.acmicpc.net/problem/1654) ✅ 3 | 3. [[Lv 2] 디펜스게임](https://school.programmers.co.kr/learn/courses/30/lessons/142085) ✅ 4 | 4. [[Lv 2] 후보키](https://school.programmers.co.kr/learn/courses/30/lessons/42890) ✅ 5 | 5. [[Lv 2] 124나라의숫자](https://school.programmers.co.kr/learn/courses/30/lessons/12899) ✅ 6 | -------------------------------------------------------------------------------- /JeeeunOh/230620/boj1629_곱셈.js: -------------------------------------------------------------------------------- 1 | const readFileSyncAddress = process.platform === 'linux' ? '/dev/stdin' : '/Users/jieun/Documents/GitHub/JS_ALGORITHM_STUDY/JeeeunOh/230620/input.txt'; 2 | 3 | const input = require('fs').readFileSync(readFileSyncAddress).toString().trimEnd().split('\n'); 4 | 5 | const [A, B, C] = input[0].split(' ').map(BigInt); 6 | 7 | const calc = (cnt) => { 8 | if (cnt === 1n) return A % C; 9 | 10 | let temp = calc(cnt / 2n) % C; 11 | 12 | if (cnt % 2n === 0n) return (temp * temp) % C; 13 | else return (temp * temp * (A % C)) % C; 14 | }; 15 | 16 | console.log(calc(B).toString()); 17 | -------------------------------------------------------------------------------- /JeeeunOh/230620/boj1654_랜선자르기.js: -------------------------------------------------------------------------------- 1 | const readFileSyncAddress = process.platform === 'linux' ? '/dev/stdin' : '/Users/jieun/Documents/GitHub/JS_ALGORITHM_STUDY/JeeeunOh/230620/input.txt'; 2 | 3 | const input = require('fs').readFileSync(readFileSyncAddress).toString().trimEnd().split('\n'); 4 | 5 | const [K, N] = input[0].split(' ').map(Number); 6 | const arr = input.slice(1).map(Number); 7 | arr.sort((a, b) => b - a); 8 | 9 | let start = 1, 10 | end = arr[0]; 11 | 12 | let ans = 0; 13 | 14 | while (start <= end) { 15 | let mid = Math.floor((start + end) / 2); 16 | let cnt = 0; 17 | 18 | for (const el of arr) { 19 | cnt += Math.floor(el / mid); 20 | } 21 | if (cnt >= N) { 22 | // mid 길이인 랜선을 N개 만들 수 있는가? 23 | ans = mid; 24 | start = mid + 1; 25 | } else { 26 | end = mid - 1; 27 | } 28 | } 29 | 30 | console.log(ans); 31 | -------------------------------------------------------------------------------- /JeeeunOh/230620/input.txt: -------------------------------------------------------------------------------- 1 | 10 11 12 -------------------------------------------------------------------------------- /JeeeunOh/230620/디펜스게임.js: -------------------------------------------------------------------------------- 1 | function solution(n, k, enemy) { 2 | let answer = 0; 3 | let start = 0, 4 | end = enemy.length; 5 | 6 | while (start <= end) { 7 | // mid 라운드까지 진행했을 때 가능한지 8 | let mid = Math.floor((start + end) / 2); 9 | let temp = enemy.slice(0, mid).sort((a, b) => a - b); 10 | 11 | // 가장 적이 많은 k개의 라운드 제외하고 cnt 에 추가 12 | let cnt = 0; 13 | for (let i = 0; i < temp.length - k; i++) { 14 | cnt += temp[i]; 15 | } 16 | 17 | // n 명의 아군으로 cnt 명의 적을 막을 수 있다면 answer 재설정 18 | if (cnt <= n) { 19 | answer = mid; 20 | start = mid + 1; 21 | } else { 22 | end = mid - 1; 23 | } 24 | } 25 | 26 | return answer; 27 | } 28 | -------------------------------------------------------------------------------- /JeeeunOh/230627/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드 5] 리모컨](https://www.acmicpc.net/problem/1107) ✅ 2 | 2. [[Lv.2] 하노이의 탑](https://school.programmers.co.kr/learn/courses/30/lessons/12946) ✅ 3 | 3. [[Lv.2] 두 큐 합 같게 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/118667) ✅ 4 | 4. [[골드 4] 주사위 굴리기](https://www.acmicpc.net/problem/14499) ✅ 5 | 5. [[골드 4] 테트로미노](https://www.acmicpc.net/problem/14500) ✅ 6 | -------------------------------------------------------------------------------- /JeeeunOh/230627/boj1107_리모컨.js: -------------------------------------------------------------------------------- 1 | const readFileSyncAddress = process.platform === 'linux' ? '/dev/stdin' : '/Users/jieun/Documents/GitHub/JS_ALGORITHM_STUDY/JeeeunOh/230627/input.txt'; 2 | 3 | const input = require('fs').readFileSync(readFileSyncAddress).toString().trimEnd().split('\n'); 4 | 5 | const [N, M] = [input[0], +input[1]]; 6 | let isPos = Array(11).fill(1); 7 | if (M != 0) { 8 | input[2] 9 | .split(' ') 10 | .map(Number) 11 | .forEach((btn) => (isPos[btn] = 0)); 12 | } 13 | 14 | let ans = Math.abs(+N - 100); // 초기값 : 100에서부터 +-한 값 15 | 16 | for (let num = 0; num <= 999999; num++) { 17 | let flag = String(num) 18 | .split('') 19 | .every((item) => isPos[item] === 1); 20 | if (flag) { 21 | ans = Math.min(ans, String(num).length + Math.abs(num - N)); 22 | } 23 | } 24 | 25 | console.log(ans); 26 | -------------------------------------------------------------------------------- /JeeeunOh/230627/input.txt: -------------------------------------------------------------------------------- 1 | 2 2 0 0 16 2 | 0 2 3 | 3 4 4 | 4 4 4 4 1 1 1 1 3 3 3 3 2 2 2 2 -------------------------------------------------------------------------------- /JeeeunOh/230627/pro_두큐의합같게만들기.js: -------------------------------------------------------------------------------- 1 | function solution(q1, q2) { 2 | let q = q1.concat(q2); 3 | let total = q.reduce((acc, cur) => acc + cur, 0); 4 | 5 | // 합이 홀수면 return -1 6 | if (total % 2 != 0) return -1; 7 | 8 | let target = total / 2; 9 | let [start, end] = [0, q1.length]; 10 | 11 | let temp = q1.reduce((acc, cur) => acc + cur, 0); 12 | 13 | while (start != end && end <= q.length) { 14 | if (temp === target) { 15 | return start + (end - q1.length); 16 | } 17 | if (temp < target) { 18 | temp += q[end]; 19 | end++; 20 | } else if (temp > target) { 21 | temp -= q[start]; 22 | start++; 23 | } 24 | } 25 | 26 | return -1; 27 | } 28 | -------------------------------------------------------------------------------- /JeeeunOh/230627/pro_하노이의탑.js: -------------------------------------------------------------------------------- 1 | /* 2 | 생각한 규칙 3 | 가장 맨 밑에 있는 원반을 3까지 옮기고 4 | 그 다음 맨 밑에 있는 원반을 3까지 옮기고... 반복 5 | 그 과정에서 기둥에 n개의 원반이 있을 때 n-1개의 원반은 3이 아닌 다른 기둥으로 옮겨놔야함. 6 | */ 7 | 8 | function solution(n) { 9 | const answer = []; 10 | 11 | const hanoi = (n, start, end, mid) => { 12 | // 1. 이동해야 하는 원반이 1개면 중간 거칠 필요 x -> 바로 answer에 push 13 | if (n === 1) answer.push([start, end]); 14 | else { 15 | // 2. start => end로 이동해야 하는 원반이 2개 이상이면 16 | // 2-1. start -> mid로 n-1개를 이동시키고 17 | hanoi(n - 1, start, mid, end); 18 | // 2-2. start -> end로 1개를 이동시키고 19 | answer.push([start, end]); 20 | // 2-3. mid로 옮긴 n-1개를 start를 거쳐 end로 이동시켜야 함. 21 | hanoi(n - 1, mid, end, start); 22 | } 23 | }; 24 | 25 | // n개의 원반을 2를 거쳐서 1->3 으로 옮겨야 함. 26 | hanoi(n, 1, 3, 2); 27 | 28 | return answer; 29 | } 30 | -------------------------------------------------------------------------------- /JeeeunOh/230703/README.md: -------------------------------------------------------------------------------- 1 | 1. [[실버 1] 스타트링크](https://www.acmicpc.net/problem/5014) ✅ 2 | 2. [[실버 2] 골드바흐의추측](https://www.acmicpc.net/problem/9020) ✅ 3 | 3. [[Lv.2] 삼각 달팽이](https://school.programmers.co.kr/learn/courses/30/lessons/68645) ✅ 4 | 4. [[Lv.1] 공원 산책](https://school.programmers.co.kr/learn/courses/30/lessons/172928) ✅ 5 | 5. [[Lv.2] n진수 게임](https://school.programmers.co.kr/learn/courses/30/lessons/17687) ✅ 6 | -------------------------------------------------------------------------------- /JeeeunOh/230703/boj9020_골드바흐의추측.js: -------------------------------------------------------------------------------- 1 | const readFileSyncAddress = process.platform === 'linux' ? '/dev/stdin' : '/Users/jieun/Documents/GitHub/JS_ALGORITHM_STUDY/JeeeunOh/230703/input.txt'; 2 | 3 | const input = require('fs').readFileSync(readFileSyncAddress).toString().trimEnd().split('\n').map(Number); 4 | 5 | input.shift(); 6 | 7 | const isPrime = (num) => { 8 | if (num <= 1) return false; 9 | for (let i = 2; i <= num / 2; i++) { 10 | if (num % i == 0) return false; 11 | } 12 | return true; 13 | }; 14 | 15 | input.forEach((num) => { 16 | let temp = Math.floor(num / 2); 17 | while (true) { 18 | if (isPrime(temp) && isPrime(num - temp)) { 19 | console.log(temp, num - temp); 20 | break; 21 | } 22 | temp--; 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /JeeeunOh/230703/input.txt: -------------------------------------------------------------------------------- 1 | 10 1 10 2 1 -------------------------------------------------------------------------------- /JeeeunOh/230703/pro_n진수게임.js: -------------------------------------------------------------------------------- 1 | function solution(n, t, m, p) { 2 | let answer = ''; 3 | let turn = 0; 4 | 5 | for (let i = 0; ; i++) { 6 | let arr = i.toString(n).split(''); 7 | 8 | for (let j = 0; j < arr.length; j++) { 9 | if (turn === p - 1) { 10 | // 튜브의 순서가 왔다면 answer 갱신 11 | answer += arr[j].toUpperCase(); 12 | if (answer.length === t) break; 13 | } 14 | // 다음 사람 턴으로 넘김. 15 | turn++; 16 | if (turn === m) turn = 0; 17 | } 18 | if (answer.length === t) break; 19 | } 20 | 21 | return answer; 22 | } 23 | -------------------------------------------------------------------------------- /JeeeunOh/230704/README.md: -------------------------------------------------------------------------------- 1 | 1. [[실버 1] 스타트링크](https://www.acmicpc.net/problem/5014) ✅ 2 | 2. [[실버 2] 골드바흐의추측](https://www.acmicpc.net/problem/9020) ✅ 3 | 3. [[Lv.2] 삼각 달팽이](https://school.programmers.co.kr/learn/courses/30/lessons/68645) ✅ 4 | 4. [[Lv.1] 공원 산책](https://school.programmers.co.kr/learn/courses/30/lessons/172928) ✅ 5 | 5. [[Lv.2] n진수 게임](https://school.programmers.co.kr/learn/courses/30/lessons/17687) ✅ 6 | -------------------------------------------------------------------------------- /JeeeunOh/230704/boj9020_골드바흐의추측.js: -------------------------------------------------------------------------------- 1 | const readFileSyncAddress = process.platform === 'linux' ? '/dev/stdin' : '/Users/jieun/Documents/GitHub/JS_ALGORITHM_STUDY/JeeeunOh/230703/input.txt'; 2 | 3 | const input = require('fs').readFileSync(readFileSyncAddress).toString().trimEnd().split('\n').map(Number); 4 | 5 | input.shift(); 6 | 7 | const isPrime = (num) => { 8 | if (num <= 1) return false; 9 | for (let i = 2; i <= num / 2; i++) { 10 | if (num % i == 0) return false; 11 | } 12 | return true; 13 | }; 14 | 15 | input.forEach((num) => { 16 | let temp = Math.floor(num / 2); 17 | while (true) { 18 | if (isPrime(temp) && isPrime(num - temp)) { 19 | console.log(temp, num - temp); 20 | break; 21 | } 22 | temp--; 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /JeeeunOh/230704/input.txt: -------------------------------------------------------------------------------- 1 | 10 1 10 2 1 -------------------------------------------------------------------------------- /JeeeunOh/230704/pro_n진수게임.js: -------------------------------------------------------------------------------- 1 | function solution(n, t, m, p) { 2 | let answer = ''; 3 | let turn = 0; 4 | 5 | for (let i = 0; ; i++) { 6 | let arr = i.toString(n).split(''); 7 | 8 | for (let j = 0; j < arr.length; j++) { 9 | if (turn === p - 1) { 10 | // 튜브의 순서가 왔다면 answer 갱신 11 | answer += arr[j].toUpperCase(); 12 | if (answer.length === t) break; 13 | } 14 | // 다음 사람 턴으로 넘김. 15 | turn++; 16 | if (turn === m) turn = 0; 17 | } 18 | if (answer.length === t) break; 19 | } 20 | 21 | return answer; 22 | } 23 | -------------------------------------------------------------------------------- /JeeeunOh/230711/README.md: -------------------------------------------------------------------------------- 1 | 1. [[LV. 2] 미로 탈출](https://school.programmers.co.kr/learn/courses/30/lessons/159993) ✅ 2 | 2. [[LV. 2] 유사 칸토어 비트열](https://school.programmers.co.kr/learn/courses/30/lessons/148652) ✅ 3 | 3. [[Lv. 2] 타겟 넘버](https://school.programmers.co.kr/learn/courses/30/lessons/43165) ✅ 4 | 4. [[Lv. 2] 모음사전](https://school.programmers.co.kr/learn/courses/30/lessons/84512) ✅ 5 | 5. [[실버 1] IOIOI](https://www.acmicpc.net/problem/5525) ✅ 6 | -------------------------------------------------------------------------------- /JeeeunOh/230711/input.txt: -------------------------------------------------------------------------------- 1 | 2 2 | 13 3 | OOIOIOIOIIOII -------------------------------------------------------------------------------- /JeeeunOh/230711/모음사전.js: -------------------------------------------------------------------------------- 1 | function solution(word) { 2 | let answer = 0; 3 | let alpha = {A: 0, E: 1, I: 2, O: 3, U: 4}; 4 | // 1, 5, 25, 125, 625 5 | let prevNum = [781, 156, 31, 6, 1]; 6 | 7 | // 스트링에서 i 번째 알파벳 순서대로 탐색 8 | for (let i = 0; i < word.length; i++) { 9 | // alpha 중 몇번째 알파벳인가? 10 | let cnt = alpha[word[i]]; 11 | answer += prevNum[i] * cnt + 1; 12 | } 13 | return answer; 14 | } 15 | -------------------------------------------------------------------------------- /JeeeunOh/230711/타겟넘버.js: -------------------------------------------------------------------------------- 1 | function solution(numbers, target) { 2 | let answer = 0; 3 | 4 | const dfs = (curIdx, sum) => { 5 | if (curIdx === numbers.length) { 6 | if (sum === target) answer++; 7 | return; 8 | } 9 | dfs(curIdx + 1, sum - numbers[curIdx]); 10 | dfs(curIdx + 1, sum + numbers[curIdx]); 11 | }; 12 | 13 | dfs(0, 0); 14 | 15 | return answer; 16 | } 17 | -------------------------------------------------------------------------------- /JeeeunOh/230718/README.md: -------------------------------------------------------------------------------- 1 | 1. [[실버 1] 후보 추천하기](https://www.acmicpc.net/problem/1713) 2 | 2. [[골드 5] 숨바꼭질3](https://www.acmicpc.net/problem/13549) 3 | 3. [[LV. 2] 양궁대회](https://school.programmers.co.kr/learn/courses/30/lessons/92342) 4 | 4. [[골드 5] Contact](https://www.acmicpc.net/problem/1013) 5 | 5. [[Lv. 2] 거리두기 확인하기](https://school.programmers.co.kr/learn/) 6 | -------------------------------------------------------------------------------- /JeeeunOh/230725/README.md: -------------------------------------------------------------------------------- 1 | 1. [[LV. 2] 이모티콘 할인행사](https://school.programmers.co.kr/learn/courses/30/lessons/150368) ✅ 2 | 2. [[LV. 2] 순위검색](https://school.programmers.co.kr/learn/courses/30/lessons/72412) 3 | 3. [[LV. 2] 오픈채팅방](https://school.programmers.co.kr/learn/courses/30/lessons/42888) ✅ 4 | 4. [[LV. 2] 게임 맵 최단거리](https://school.programmers.co.kr/learn/courses/30/lessons/1844) ✅ 5 | 5. [[LV. 2] 프로세스](https://school.programmers.co.kr/learn/courses/30/lessons/42587) ✅ 6 | -------------------------------------------------------------------------------- /JeeeunOh/230725/게임맵최단거리.js: -------------------------------------------------------------------------------- 1 | function solution(maps) { 2 | let n = maps.length, 3 | m = maps[0].length; 4 | const dir = [ 5 | [0, -1], 6 | [0, 1], 7 | [1, 0], 8 | [-1, 0], 9 | ]; 10 | 11 | let queue = [[0, 0, 1]]; 12 | maps[0][0] = 0; 13 | 14 | while (queue.length) { 15 | let [cx, cy, cnt] = queue.shift(); 16 | if (cx === n - 1 && cy === m - 1) return cnt; 17 | 18 | for (const [dx, dy] of dir) { 19 | let [nx, ny] = [cx + dx, cy + dy]; 20 | if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; 21 | if (maps[nx][ny]) { 22 | maps[nx][ny] = 0; 23 | queue.push([nx, ny, cnt + 1]); 24 | } 25 | } 26 | } 27 | 28 | return -1; 29 | } 30 | -------------------------------------------------------------------------------- /JeeeunOh/230725/오픈채팅방.js: -------------------------------------------------------------------------------- 1 | function solution(record) { 2 | let answer = []; 3 | let map = new Map(); 4 | 5 | record.forEach((s) => { 6 | let list = s.split(' '); 7 | let [command, userId, userName] = list; 8 | 9 | if (command === 'Enter' || command === 'Change') map.set(userId, userName); 10 | }); 11 | 12 | record.forEach((s) => { 13 | let list = s.split(' '); 14 | let [command, userId, _] = list; 15 | 16 | switch (command) { 17 | case 'Enter': 18 | answer.push(`${map.get(userId)}님이 들어왔습니다.`); 19 | break; 20 | case 'Leave': 21 | answer.push(`${map.get(userId)}님이 나갔습니다.`); 22 | break; 23 | } 24 | }); 25 | 26 | return answer; 27 | } 28 | -------------------------------------------------------------------------------- /JeeeunOh/230725/프로세스.js: -------------------------------------------------------------------------------- 1 | function solution(prior, loc) { 2 | let firstLen = prior.length; 3 | 4 | while (true) { 5 | let cur = prior.shift(); 6 | 7 | if (cur >= Math.max(...prior)) { 8 | if (loc === 0) return firstLen - prior.length; 9 | } else { 10 | prior.push(cur); 11 | } 12 | 13 | loc = loc - 1 === -1 ? prior.length - 1 : loc - 1; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /JeeeunOh/230801/2개이하로다른비트.js: -------------------------------------------------------------------------------- 1 | function solution(numbers) { 2 | return numbers.map((number) => { 3 | let bi = number.toString(2); 4 | // 1. 0으로 끝나면 0 -> 1 5 | if (bi.at(-1) === '0') { 6 | bi = bi.slice(0, bi.length - 1) + '1'; 7 | return parseInt(bi, 2); 8 | } else { 9 | // 2. 1이 아닐 때 01이 존재하면, 10으로 바꿔주기 10 | bi = '0' + bi; // 11111 .. 인 경우 위해 제일 앞에 0 추가 11 | for (let i = bi.length; i > 0; i--) { 12 | if (bi.slice(i - 1, i + 1) === '01') { 13 | return parseInt(bi.slice(0, i - 1) + '10' + bi.slice(i + 1), 2); 14 | } 15 | } 16 | } 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /JeeeunOh/230801/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드 5] 내려가기](https://www.acmicpc.net/problem/2096) ✅ 2 | 2. [[실버 1] 카드 구매하기2](https://www.acmicpc.net/problem/16194) ✅ 3 | 3. [[Lv 2] 2개 이하로 다른 비트](https://school.programmers.co.kr/learn/courses/30/lessons/77885) ✅ 4 | 4. [[Lv 2] 괄호 변환](https://school.programmers.co.kr/learn/courses/30/lessons/60058) 5 | 5. [[Lv 2] 방문 길이](https://school.programmers.co.kr/learn/courses/30/lessons/49994) ✅ 6 | -------------------------------------------------------------------------------- /JeeeunOh/230801/방문길이.js: -------------------------------------------------------------------------------- 1 | let cmd = {U: [0, 1], D: [0, -1], R: [1, 0], L: [-1, 0]}; 2 | 3 | function solution(dirs) { 4 | let cur = [5, 5]; 5 | let set = new Set(); 6 | 7 | dirs.split('').forEach((dir) => { 8 | const [dx, dy] = cmd[dir]; 9 | let [nx, ny] = [cur[0] + dx, cur[1] + dy]; 10 | 11 | if (nx >= 0 && nx <= 10 && ny >= 0 && ny <= 10) { 12 | let validString = JSON.stringify([cur, [nx, ny]].sort()); 13 | set.add(validString); 14 | cur = [nx, ny]; 15 | } 16 | }); 17 | 18 | return set.size; 19 | } 20 | -------------------------------------------------------------------------------- /JeeeunOh/stdin.js: -------------------------------------------------------------------------------- 1 | const readFileSyncAddress = process.platform === 'linux' ? '/dev/stdin' : '/Users/jieun/Documents/GitHub/Algorithm_Study/BAEKJOON/JAVASCRIPT/input.txt'; 2 | 3 | const input = require('fs').readFileSync(readFileSyncAddress).toString().trimEnd().split('\n'); 4 | 5 | console.log(input); 6 | -------------------------------------------------------------------------------- /JeeeunOh/test.js: -------------------------------------------------------------------------------- 1 | // JeeeunOh PR 실험용 -------------------------------------------------------------------------------- /RookieAND/20230214/42578. 위장/위장.js: -------------------------------------------------------------------------------- 1 | function solution(clothes) { 2 | const closet = new Map(); 3 | // 인자로 전달 받은 배열을 순회하여 closet Map에 추가하되, value는 옷의 수량으로만 추가 4 | clothes.forEach(([, key]) => closet.set(key, !closet.get(key) ? 1 : closet.get(key) + 1)); 5 | return Array.from(closet.values()).reduce((acc, cur) => acc * (cur + 1), 1) - 1; 6 | } 7 | -------------------------------------------------------------------------------- /RookieAND/20230221/42586. 기능개발/기능개발.js: -------------------------------------------------------------------------------- 1 | function solution(progresses, speeds) { 2 | let answer = []; 3 | let currentProgress = progresses; 4 | 5 | while (currentProgress.length || speeds.length) { 6 | currentProgress = currentProgress.map((progress, idx) => 7 | progress + speeds[idx] >= 100 ? 100 : progress + speeds[idx] 8 | ); 9 | // 만약 가장 앞의 진행도가 100이라면, 100으로 작업된 기능을 모두 제거함. 10 | let buildAmount = 0; 11 | while (currentProgress[0] === 100) { 12 | currentProgress.shift(); 13 | speeds.shift(); 14 | buildAmount += 1; 15 | } 16 | if (buildAmount > 0) { 17 | answer.push(buildAmount); 18 | } 19 | } 20 | return answer; 21 | } 22 | -------------------------------------------------------------------------------- /RookieAND/20230228/1911. 흙길 보수하기/README.md: -------------------------------------------------------------------------------- 1 | # [Silver I] 흙길 보수하기 - 1911 2 | 3 | [문제 링크](https://www.acmicpc.net/problem/1911) 4 | 5 | ### 성능 요약 6 | 7 | 메모리: 16264 KB, 시간: 224 ms 8 | 9 | ### 분류 10 | 11 | 정렬(sorting), 스위핑(sweeping) 12 | 13 | ### 문제 설명 14 | 15 |

어젯밤 겨울 캠프 장소에서 월드 본원까지 이어지는, 흙으로 된 비밀길 위에 폭우가 내려서 N (1 <= N <= 10,000) 개의 물웅덩이가 생겼다. 월드학원은 물웅덩이를 덮을 수 있는 길이 L (L은 양의 정수) 짜리 널빤지들을 충분히 가지고 있어서, 이들로 다리를 만들어 물웅덩이들을 모두 덮으려고 한다. 물웅덩이들의 위치와 크기에 대한 정보가 주어질 때, 모든 물웅덩이들을 덮기 위해 필요한 널빤지들의 최소 개수를 구하여라.

16 | 17 | ### 입력 18 | 19 |

첫째 줄에 N과 L이 들어온다.

20 | 21 |

둘째 줄부터 N+1번째 줄까지 총 N개의 줄에 각각의 웅덩이들의 정보가 주어진다. 웅덩이의 정보는 웅덩이의 시작 위치와 끝 위치로 이루어진다. 각 위치는 0이상 1,000,000,000이하의 정수이다.

22 | 23 | ### 출력 24 | 25 |

첫째 줄에 모든 물웅덩이들을 덮기 위해 필요한 널빤지들의 최소 개수를 출력한다.

26 | 27 | -------------------------------------------------------------------------------- /RookieAND/20230228/2251. 물통/README.md: -------------------------------------------------------------------------------- 1 | # [Gold V] 물통 - 2251 2 | 3 | [문제 링크](https://www.acmicpc.net/problem/2251) 4 | 5 | ### 성능 요약 6 | 7 | 메모리: 9660 KB, 시간: 124 ms 8 | 9 | ### 분류 10 | 11 | 너비 우선 탐색(bfs), 깊이 우선 탐색(dfs), 그래프 이론(graphs), 그래프 탐색(graph_traversal) 12 | 13 | ### 문제 설명 14 | 15 |

각각 부피가 A, B, C(1≤A, B, C≤200) 리터인 세 개의 물통이 있다. 처음에는 앞의 두 물통은 비어 있고, 세 번째 물통은 가득(C 리터) 차 있다. 이제 어떤 물통에 들어있는 물을 다른 물통으로 쏟아 부을 수 있는데, 이때에는 한 물통이 비거나, 다른 한 물통이 가득 찰 때까지 물을 부을 수 있다. 이 과정에서 손실되는 물은 없다고 가정한다.

16 | 17 |

이와 같은 과정을 거치다보면 세 번째 물통(용량이 C인)에 담겨있는 물의 양이 변할 수도 있다. 첫 번째 물통(용량이 A인)이 비어 있을 때, 세 번째 물통(용량이 C인)에 담겨있을 수 있는 물의 양을 모두 구해내는 프로그램을 작성하시오.

18 | 19 | ### 입력 20 | 21 |

첫째 줄에 세 정수 A, B, C가 주어진다.

22 | 23 | ### 출력 24 | 25 |

첫째 줄에 공백으로 구분하여 답을 출력한다. 각 용량은 오름차순으로 정렬한다.

26 | 27 | -------------------------------------------------------------------------------- /RookieAND/20230307/1844. 게임 맵 최단거리/게임 맵 최단거리.js: -------------------------------------------------------------------------------- 1 | function solution(maps) { 2 | let queue = [[0, 0]]; 3 | const [maxY, maxX] = [maps.length, maps[0].length]; 4 | const direction = [[0, 1], [0, -1], [1, 0], [-1, 0]]; 5 | while (queue.length > 0) { 6 | const [ny, nx] = queue.shift(); 7 | for (const [dy, dx] of direction) { 8 | const [my, mx] = [ny + dy, nx + dx]; 9 | if (my >= 0 && mx >= 0 && my < maxY && mx < maxX) { 10 | if (maps[my][mx] == 1 || maps[my][mx] > maps[ny][nx] + 1) { 11 | queue.push([my, mx]); 12 | maps[my][mx] = maps[ny][nx] + 1; 13 | } 14 | } 15 | } 16 | } 17 | return maps[maxY - 1][maxX - 1] == 1 ? -1 : maps[maxY - 1][maxX - 1]; 18 | } -------------------------------------------------------------------------------- /RookieAND/20230314/11058. 크리보드/크리보드.js: -------------------------------------------------------------------------------- 1 | const input = require('fs').readFileSync('/dev/stdin').toString().trimEnd(); 2 | const N = +input; 3 | 4 | // dp[i] : i번째 버튼을 눌렀을 때 가장 많이 출력되는 A의 갯수. 5 | // dp 초기화, 처음에는 누를 수 있는 버튼의 횟수만큼 이를 추가. 6 | const dp = [...Array(N + 1).keys()]; 7 | 8 | /** 9 | * 맨 처음에는 A를 화면에 출력시키는 것으로 시작한다. 10 | * 1. 화면 선택 - 복사 - 붙여넣기와 같은 순번 (3회 필요) 11 | * 2. 버튼을 누를 수 있는 횟수만큼 A를 눌러 추가하기. 12 | * => 3회 이전의 횟수에서 선택 => 붙여넣기를 했을 때의 케이스가 더 큰지 비교 13 | * => 특정 시점에서 버퍼에 든 값을 계속해서 복사 붙여넣기 했는지를 조사해야 함. 14 | */ 15 | for (let i = 4; i <= N; i++) { 16 | // 3회 이상 이전으로 되돌아가야 하므로 최소 3회 이상의 카운트가 필요하다. 17 | // i-j 번째의 내용을 복사하여 버퍼에 옮기고, 이를 j - 1 번만큼 붙였을 때의 값을 대조 18 | for (let j = 3; j < i; j++) { 19 | dp[i] = Math.max(dp[i], dp[i - j] * (j - 1)); 20 | } 21 | } 22 | 23 | console.log(dp[N]); 24 | -------------------------------------------------------------------------------- /RookieAND/20230314/161989. 덧칠하기/덧칠하기.js: -------------------------------------------------------------------------------- 1 | // n 은 전체 구역의 너비, m 은 롤러의 길이를 의미한다. 2 | // 현재 페인트 롤러가 "위치한 곳" 을 포인터로 놓고, 붓을 칠하면서 포인터를 업데이트 하는 방식으로. 3 | function solution(N, M, section) { 4 | let [currentRollerIdx, answer] = [0, 0]; 5 | 6 | 7 | for (const needPainted of section) { 8 | // 만약 롤러가 칠해야 하는 영역보다 같거나 앞에 있다면, 해당 영역을 기준으로 M칸만큼 칠하자. 9 | if (currentRollerIdx <= needPainted) { 10 | currentRollerIdx = needPainted + M; 11 | answer += 1; 12 | } 13 | } 14 | 15 | console.log(answer); 16 | return answer; 17 | } -------------------------------------------------------------------------------- /RookieAND/20230314/84512. 모음 사전/모음 사전.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 각 자리수에 해당되는 증가량을 더해준 수, 문자열의 길이만큼 수를 더한다. 3 | * 증가량은 단어의 자리별로 [781, 156, 31, 6, 1] 순이다. 4 | */ 5 | function solution(word) { 6 | const vowels = ['A', 'E', 'I', 'O', 'U']; 7 | const counts = [781, 156, 31, 6, 1]; 8 | 9 | let result = word.length; 10 | Array.from(word).forEach((char, idx) => { 11 | result += counts[idx] * vowels.indexOf(char); 12 | }); 13 | 14 | return result; 15 | } -------------------------------------------------------------------------------- /RookieAND/20230321/42628. 이중우선순위큐/이중우선순위큐.js: -------------------------------------------------------------------------------- 1 | function solution(operations) { 2 | const queue = []; 3 | operations.forEach((operation) => { 4 | const [oper, num] = operation.split(" "); 5 | switch(oper) { 6 | case 'I': 7 | queue.push(Number(num)); 8 | break; 9 | case 'D': 10 | const value = (num === '1' ? Math.max : Math.min)(...queue); 11 | queue.splice(queue.indexOf(value), 1); 12 | } 13 | }) 14 | return queue.length ? [Math.max(...queue), Math.min(...queue)] : [0, 0]; 15 | } -------------------------------------------------------------------------------- /RookieAND/20230328/49993. 스킬트리/스킬트리.js: -------------------------------------------------------------------------------- 1 | // 스킬을 하나하나 뜯어보면서, 현재 선행한 스킬보다 앞서거나 이전의 스킬을 배운 경우는 패싱 2 | function solution(baseSkill, skillTrees) { 3 | let answer = 0; 4 | for (const skillTree of skillTrees) { 5 | let currentLearned = []; 6 | let canLearn = true; 7 | for (const skill of skillTree) { 8 | // 스킬 트리에 있으며, 이전에 선행한 스킬 이후에 배워야 하는 스킬인지 체크 9 | if (baseSkill.indexOf(skill) > -1) { 10 | const curLearnedSkill = baseSkill.indexOf(skill); 11 | const prevLearnedSkill = currentLearned.length - 1; 12 | if (curLearnedSkill === prevLearnedSkill + 1) { 13 | currentLearned.push(skill); 14 | } else { 15 | canLearn = false; 16 | } 17 | } 18 | } 19 | if (canLearn) answer++; 20 | } 21 | return answer; 22 | } 23 | -------------------------------------------------------------------------------- /RookieAND/20230404/13022. 늑대와 올바른 단어/늑대와 올바른 단어.js: -------------------------------------------------------------------------------- 1 | // 문자열 길이가 50을 안 넘기 때문에, 만약 최대 길이라면 n이 12인 케이스까지 충족한다. 2 | let input = require("fs").readFileSync("/dev/stdin").toString().trimEnd(); 3 | const possibleCase = []; 4 | 5 | for (let i = 1; i < 13; i++) { 6 | const wolfWord = 7 | "w".repeat(i) + "o".repeat(i) + "l".repeat(i) + "f".repeat(i); 8 | possibleCase.push(wolfWord); 9 | } 10 | 11 | while (true) { 12 | let isRemoved = false; 13 | for (const word of possibleCase) { 14 | if (input.startsWith(word)) { 15 | input = input.slice(word.length); 16 | isRemoved = true; 17 | break; 18 | } 19 | } 20 | // 문자가 제거되지 않았거나, 길이가 0이라면 반복을 종료해야 함. 21 | if (!isRemoved || input.length === 0) break; 22 | } 23 | 24 | // 반복 종료 후 남은 문자가 없다면 규칙에 맞게 온전히 소거된 것이다. 25 | console.log(input.length === 0 ? 1 : 0); 26 | -------------------------------------------------------------------------------- /RookieAND/20230404/138476. 귤 고르기/귤 고르기.js: -------------------------------------------------------------------------------- 1 | // 서로 "다른 종류" 의 귤을 최소화 하려면, 결국 가짓수가 많은 귤을 선별해야 한다. 2 | // 근데 원소가 1천만이 넘어서 일일히 배열을 sort 하는 방식은 불가능해 보인다.. 되네? 3 | function solution(k, tangerines) { 4 | const tangerineMap = new Map(); 5 | for (const tangerine of tangerines) { 6 | tangerineMap.set(tangerine, tangerineMap.has(tangerine) ? tangerineMap.get(tangerine) + 1 : 1); 7 | } 8 | // 귤의 갯수가 많은 순대로 내림차순을 진행한다. 9 | const tangerineAmount = [...tangerineMap.values()].sort((a, b) => b - a); 10 | 11 | let answer = 0; 12 | // 가장 많은 갯수부터 k를 소거하고, 0 이하로 떨어졌다면 반복을 멈춘다. 13 | for (const amount of tangerineAmount) { 14 | if (k <= 0) break; 15 | k -= amount; 16 | answer += 1; 17 | } 18 | return answer; 19 | } 20 | -------------------------------------------------------------------------------- /RookieAND/20230425/132265. 롤케이크 자르기/롤케이크 자르기.js: -------------------------------------------------------------------------------- 1 | function solution(topping) { 2 | const cakeSize = topping.length; 3 | const wholeTopping = new Set(topping).size; 4 | 5 | let answer = 0; 6 | const LeftSideTopping = new Map(); 7 | const rightSideTopping = new Set(); 8 | 9 | topping.forEach((top) => 10 | LeftSideTopping.set(top, (LeftSideTopping.get(top) || 0) + 1) 11 | ); 12 | 13 | topping.forEach((top) => { 14 | const currentToppingAmount = LeftSideTopping.get(top); 15 | // 남은 토핑이 한 개밖에 없는데 이것마저도 빼야 한다면 아예 Map에서 소거시킨다. 16 | currentToppingAmount == 1 17 | ? LeftSideTopping.delete(top) 18 | : LeftSideTopping.set(top, currentToppingAmount - 1); 19 | 20 | rightSideTopping.add(top); 21 | 22 | if (rightSideTopping.size === LeftSideTopping.size) answer++; 23 | }); 24 | 25 | return answer; 26 | } 27 | -------------------------------------------------------------------------------- /RookieAND/20230425/14925. 목장 건설하기/README.md: -------------------------------------------------------------------------------- 1 | # [Gold IV] 목장 건설하기 - 14925 2 | 3 | [문제 링크](https://www.acmicpc.net/problem/14925) 4 | 5 | ### 성능 요약 6 | 7 | 메모리: 27964 KB, 시간: 2232 ms 8 | 9 | ### 분류 10 | 11 | 다이나믹 프로그래밍 12 | 13 | ### 문제 설명 14 | 15 |

랜드 씨는 퇴직금으로 땅을 사서 목장을 지으려 한다. 그가 사려고 소개받은 땅은 직사각형이고 대부분 들판이지만, 여기저기에 베기 어려운 나무와 치울 수 없는 바위가 있다.

16 | 17 |

그는 목장을 하나의 정사각형으로 최대한 크게 지으려 하는데, 그 안에 나무나 바위는 없어야 한다.

18 | 19 |

땅의 세로 길이가 M미터, 가로 길이가 N미터일 때, 1미터 간격의 격자로 된 땅의 지도를 M x N행렬로 표현하자.

20 | 21 |

이때, 행렬의 원소 0은 들판, 1은 나무 그리고 2는 돌을 의미한다. 랜드씨의 땅에서 지을 수 있는 가장 큰 정사각형 목장의 한 변의 크기 L을 출력하시오.

22 | 23 | ### 입력 24 | 25 |
M N
26 | M x N 행렬
27 | 28 | 32 | 33 | ### 출력 34 | 35 |
L
36 | 37 | -------------------------------------------------------------------------------- /RookieAND/20230502/12938. 최고의 집합/최고의 집합.js: -------------------------------------------------------------------------------- 1 | // 결론, 최대한 균등하게 수를 나눈 후에 적당히 분배하자. 2 | // 나머지가 존재한다면 1, 2, 3... 이런 식으로 3 | function solution(n, s) { 4 | // n 이 s 보다 크면 조합 자체가 불가능하다. 5 | if (n > s) return [-1]; 6 | 7 | // 나머지가 없다면, s를 n으로 나눈 몫으로 채운다. 8 | const rest = s % n; 9 | if (rest === 0) return new Array(n).fill(s / n); 10 | 11 | // 그게 아니라면, 나머지를 균등하게 나눠서 추가해준 후 배열을 뒤집는다 12 | const result = new Array(n).fill(Math.floor(s / n)); 13 | for (let i = 0; i < rest; i++) { 14 | result[i] += 1; 15 | } 16 | return result.reverse(); 17 | } -------------------------------------------------------------------------------- /RookieAND/20230509/147354. 테이블 해시 함수/테이블 해시 함수.js: -------------------------------------------------------------------------------- 1 | function solution(data, col, row_begin, row_end) { 2 | data.sort((a, b) => 3 | a[col - 1] === b[col - 1] ? b[0] - a[0] : a[col - 1] - b[col - 1], 4 | ); 5 | const S = data 6 | .slice(row_begin - 1, row_end) 7 | .map((cols, idx) => cols.reduce((acc, cur) => acc + (cur % (idx + row_begin)), 0)); 8 | const result = S.slice(1).reduce((acc, cur) => acc ^ cur, S[0]); 9 | return result; 10 | } 11 | -------------------------------------------------------------------------------- /RookieAND/20230509/154538. 숫자 변환하기/숫자 변환하기.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 점화식 : dp[i] = min(dp[i - n], dp[i / 2], dp[i / 3]) + 1 3 | * 단, i / 2가 x 보다 크면서 정수여야 하고, i / 3 이 x 보다 크면서 정수여야 한다. i - n도 x 보다 커야 한다. 4 | * 이후 조건에 맞는 값들을 추출하고, 가장 작은 값에 1을 더한 결과를 dp에 메모이제이션 한다. 5 | */ 6 | function solution(x, y, n) { 7 | const dp = Array.from({length: y + 1}).fill(-1); 8 | dp[x] = 0; 9 | for (let i = x; i <= y; i++) { 10 | let validCase = []; 11 | if (i % 2 === 0 && i / 2 >= x) validCase.push(dp[i / 2]); 12 | if (i % 3 === 0 && i / 3 >= x) validCase.push(dp[i / 3]); 13 | if (i - n >= x) validCase.push(dp[i - n]); 14 | validCase = validCase.filter((value) => value !== -1); 15 | 16 | if (!validCase.length) continue; 17 | dp[i] = Math.min(...validCase) + 1; 18 | } 19 | return dp[y]; 20 | } -------------------------------------------------------------------------------- /RookieAND/20230509/43165. 타겟 넘버/타겟 넘버.js: -------------------------------------------------------------------------------- 1 | function solution(numbers, target) { 2 | let answer = 0; 3 | function dfs(currentIndex, sum) { 4 | if (currentIndex > numbers.length - 1) { 5 | if (sum === target) answer += 1; 6 | return; 7 | } 8 | dfs(currentIndex + 1, sum + numbers[currentIndex]); 9 | dfs(currentIndex + 1, sum - numbers[currentIndex]); 10 | } 11 | 12 | const [startNum] = numbers; 13 | dfs(0, 0); 14 | 15 | return answer; 16 | } 17 | -------------------------------------------------------------------------------- /RookieAND/20230516/12899. 124 나라의 숫자/124 나라의 숫자.js: -------------------------------------------------------------------------------- 1 | // 1, 2, 4 : 3 (3의 1제곱) 2 | // 11, 12, 14, 21, 22, 24, 41, 42, 44 : 3 x 3 = 9 (3의 2제곱) 3 | // 111, 112, 114, 121, 122, 124, 141, 142, 144, ... 444 : 3 x 3 x 3 = 27 (3의 3제곱) 4 | // 3의 제곱의 누적 합.. n 보다 큰지 대조해서 자릿수를 구해야 한다. 단, 3으로 나눈 나머지가 0이라면 5 | 6 | 7 | // [도출법] 8 | // 16 / 3 => 5... 1 9 | // 5 / 3 => 1... 2 10 | // 1 / 3 => 0... 1 => 121 11 | 12 | // 18 / 3 => 6 ... 0 13 | // 5 / 3 => 1 ... 2 14 | // 1 / 3 => 0 ... 1 => 124 (나머지가 0이면 몫에서 1을 빼고 4로 대체) 15 | 16 | function solution(n) { 17 | let answer = []; 18 | while (n) { 19 | if (n % 3) { 20 | answer.push(n % 3); 21 | n = Math.floor(n / 3); 22 | continue; 23 | } 24 | answer.push(4); 25 | n = Math.floor(n / 3) - 1; 26 | } 27 | return answer.reverse().join("") 28 | } -------------------------------------------------------------------------------- /RookieAND/20230516/87390. n^2 배열 자르기/n^2 배열 자르기.js: -------------------------------------------------------------------------------- 1 | function solution(N, left, right) { 2 | let answer = []; 3 | 4 | // x번째 숫자는 x / N 열 x % N 행에 위치한다. 5 | // k열에 위치한 숫자들은 최소 k보다는 커야 하며 6 | // l행에 위치한 숫자들은 k, l 둘 중 큰 숫자가 올 수 있다. 7 | for (let num = left; num <= right; num++) { 8 | answer.push(Math.max(Math.floor(num / N), num % N) + 1) 9 | } 10 | return answer; 11 | } 12 | -------------------------------------------------------------------------------- /RookieAND/20230516/87390. n^2 배열 자르기/n^2 배열 자르기.py: -------------------------------------------------------------------------------- 1 | def solution(N, left, right): 2 | answer = [] 3 | for num in range(left, right + 1): 4 | answer.append(max(num // N, num % N) + 1) 5 | return answer 6 | -------------------------------------------------------------------------------- /RookieAND/20230918/12913. 땅따먹기/땅따먹기.js: -------------------------------------------------------------------------------- 1 | function solution(land) { 2 | const N = land.length; 3 | const dp = Array.from({length: N}, () => new Array(4).fill(0)); 4 | 5 | // 첫 번째 줄은 land 와 동기화 한다. 6 | dp[0] = land[0]; 7 | 8 | 9 | // j = 4 라고 가정했을 때, 점화식 10 | // dp[i][j] = max(dp[i - 1][1], dp[i - 1][2], dp[i - 1][3]) + land[i][j]; 11 | for (let row = 1; row < N; row++) { 12 | for (let col = 0; col < 4; col ++) { 13 | dp[row][col] = Math.max(...dp[row - 1].filter((_, index) => index !== col)) + land[row][col]; 14 | } 15 | } 16 | 17 | const answer = Math.max(...dp[N - 1]); 18 | return answer; 19 | } -------------------------------------------------------------------------------- /RookieAND/20230918/12914. 멀리 뛰기/멀리 뛰기.js: -------------------------------------------------------------------------------- 1 | // 규칙을 찾아보면 1, 2, 3, 5, 8... 순으로 방법이 증가함을 알 수 있다 (피보나치 수열) 2 | // N = 2000 이므로 메모이제이션을 통해 1234567을 나눈 나머지를 저장하여 최적화 해보자. 3 | function solution(n) { 4 | 5 | // 예외 : n 이 3 이하일 경우 n 이 답이다. 빠른 return 6 | if (n < 4) return n; 7 | 8 | const memoize = Array.from({length : n + 1}, () => 0); 9 | memoize[1] = 1; 10 | memoize[2] = 2; 11 | 12 | 13 | for (let i = 1; i <= n - 2; i++) { 14 | memoize[i + 2] = (memoize[i] + memoize[i + 1]) % 1234567; 15 | } 16 | 17 | const answer = memoize[n]; 18 | 19 | return answer; 20 | } -------------------------------------------------------------------------------- /RookieAND/20230926/147354. 테이블 해시 함수/테이블 해시 함수.js: -------------------------------------------------------------------------------- 1 | function solution(data, col, row_begin, row_end) { 2 | data.sort((a, b) => 3 | a[col - 1] === b[col - 1] ? b[0] - a[0] : a[col - 1] - b[col - 1], 4 | ); 5 | const S = data 6 | .slice(row_begin - 1, row_end) 7 | .map((cols, idx) => cols.reduce((acc, cur) => acc + (cur % (idx + row_begin)), 0)); 8 | const result = S.slice(1).reduce((acc, cur) => acc ^ cur, S[0]); 9 | return result; 10 | } 11 | -------------------------------------------------------------------------------- /RookieAND/20230926/154538. 숫자 변환하기/숫자 변환하기.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 점화식 : dp[i] = min(dp[i - n], dp[i / 2], dp[i / 3]) + 1 3 | * 단, i / 2가 x 보다 크면서 정수여야 하고, i / 3 이 x 보다 크면서 정수여야 한다. i - n도 x 보다 커야 한다. 4 | * 이후 조건에 맞는 값들을 추출하고, 가장 작은 값에 1을 더한 결과를 dp에 메모이제이션 한다. 5 | */ 6 | function solution(x, y, n) { 7 | const dp = Array.from({length: y + 1}).fill(-1); 8 | dp[x] = 0; 9 | for (let i = x; i <= y; i++) { 10 | let validCase = []; 11 | if (i % 2 === 0 && i / 2 >= x) validCase.push(dp[i / 2]); 12 | if (i % 3 === 0 && i / 3 >= x) validCase.push(dp[i / 3]); 13 | if (i - n >= x) validCase.push(dp[i - n]); 14 | validCase = validCase.filter((value) => value !== -1); 15 | 16 | if (!validCase.length) continue; 17 | dp[i] = Math.min(...validCase) + 1; 18 | } 19 | return dp[y]; 20 | } -------------------------------------------------------------------------------- /RookieAND/20231004/140107. 점 찍기/점 찍기.js: -------------------------------------------------------------------------------- 1 | // 0, k, 2k, ... 순으로 한 줄씩 체크하며 d 보다 작은 거리를 이루는 최댓값을 구한다. 2 | function solution(k, d) { 3 | let result = 0; 4 | for (let x = 0; x <= d; x += k) { 5 | // y = (d ^ 2 - x ^ 2) ^ (1 / 2) 6 | const max_y = Math.floor(Math.sqrt(d ** 2 - x ** 2)); 7 | const y_amount = Math.floor(max_y / k) + 1; 8 | result += y_amount; 9 | } 10 | return result; 11 | } -------------------------------------------------------------------------------- /RookieAND/20231010/2565. 전깃줄/전깃줄.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | 3 | const input = fs.readFileSync('/dev/stdin').toString().trimEnd().split("\n"); 4 | const [N, ...rest] = input; 5 | 6 | const lineList = rest.map((row) => row.split(" ").map(Number)); 7 | lineList.sort(([first], [second]) => first - second); 8 | 9 | // A와 B 사이를 연결하는 전깃줄을 "A" 연결점을 기준으로 정렬한다. 10 | const leftLineList = lineList.map(([_, b]) => b); 11 | 12 | const connectionAmount = leftLineList.length; 13 | const dp = Array(connectionAmount).fill(1); 14 | 15 | // 이후 B의 연결점들을 대상으로, 가장 긴 부분수열을 구한다. 16 | for (let i = 0; i < N; i++) { 17 | for (let j = 0; j < i; j++) { 18 | if (leftLineList[i] > leftLineList[j] && dp[i] < dp[j] + 1) dp[i] = dp[j] + 1; 19 | } 20 | } 21 | 22 | console.log(connectionAmount - Math.max(...dp)); 23 | -------------------------------------------------------------------------------- /RookieAND/20231107/13164. 행복 유치원/행복 유치원.js: -------------------------------------------------------------------------------- 1 | // 조에서 가장 키가 큰 원생과 가장 작은 원생의 키 차이만큼 든다는 이야기는.. 2 | // 결국 인접한 학생들 간의 키 목록 중에서, 차이가 "크게" 나는 케이스를 제거하면 된다. 3 | const input = require("fs") 4 | .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt") 5 | .toString() 6 | .trim() 7 | .split("\n") 8 | .map((row) => row.split(" ").map(Number)); 9 | 10 | const [[N, K], talls] = input; 11 | const differences = []; 12 | 13 | // 인접한 학생들 간의 키 차이를 구해야 한다. 이후 차이가 큰 순으로 정렬한다. 14 | for (let i = 1; i < N; i++) { 15 | differences.push(talls[i] - talls[i - 1]); 16 | } 17 | 18 | differences.sort((a, b) => a - b); 19 | 20 | // 키가 큰 원생은 혼자 그룹을 생성하도록 하여, 큰 비용이 생기지 않게 방어 21 | const answer = differences.slice(0, N - K).reduce((acc, cur) => acc + cur, 0); 22 | console.log(answer); 23 | -------------------------------------------------------------------------------- /RookieAND/20231107/42860. 조이스틱/조이스틱.js: -------------------------------------------------------------------------------- 1 | function solution(name) { 2 | let answer = 0; 3 | let verticalMovement = name.length - 1; 4 | 5 | [...name].map((char, index) => { 6 | answer += Math.min( 7 | char.charCodeAt() - "A".charCodeAt(), 8 | "Z".charCodeAt() + 1 - char.charCodeAt() 9 | ); 10 | let nextIndex = index + 1; 11 | 12 | while (nextIndex < name.length && name[nextIndex] === "A") { 13 | nextIndex++; 14 | } 15 | 16 | verticalMovement = Math.min( 17 | verticalMovement, 18 | index * 2 + name.length - nextIndex, 19 | index + 2 * (name.length - nextIndex) 20 | ); 21 | }); 22 | 23 | return answer + verticalMovement; 24 | } 25 | -------------------------------------------------------------------------------- /alsrb0504/20230214/42578. 위장/위장.js: -------------------------------------------------------------------------------- 1 | function solution(clothes) { 2 | const map = new Map(); 3 | 4 | clothes.forEach((el) => { 5 | if (map.has(el[1])) { 6 | map.set(el[1], map.get(el[1]) + 1); 7 | } else { 8 | map.set(el[1], 1); 9 | } 10 | }); 11 | 12 | let answer = 1; 13 | 14 | map.forEach((val) => { 15 | answer *= val + 1; 16 | }); 17 | 18 | return answer - 1; 19 | } 20 | -------------------------------------------------------------------------------- /alsrb0504/20230228/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [특별한 최단 경로](https://www.acmicpc.net/problem/1504) 4 | 5 | - 데이크스트라 6 | 7 | ### 2. [흙길 보수하기](https://www.acmicpc.net/problem/1911) 8 | 9 | - 정렬 10 | - 그리디 11 | 12 | ### 3. [물통](https://www.acmicpc.net/problem/2251) 13 | 14 | - BFS 15 | 16 | ### 4. [섬 연결하기](https://school.programmers.co.kr/learn/courses/30/lessons/42861?language=javascript) 17 | 18 | - 그리디 19 | - 유니온 파인드 20 | 21 | ### 5. [여행경로](https://school.programmers.co.kr/learn/courses/30/lessons/43164) 22 | 23 | - DFS 24 | 25 | ### 6. [두 큐 합 같게 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/118667) 26 | 27 | - 구현 28 | - 시뮬레이션 29 | -------------------------------------------------------------------------------- /alsrb0504/20230307/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [게임 맵 최단거리](https://school.programmers.co.kr/learn/courses/30/lessons/1844) 4 | 5 | - BFS 6 | 7 | ### 2. [벽장문의 이동](https://www.acmicpc.net/problem/2666) 8 | 9 | - DP 10 | 11 | ### 3. [트리](https://www.acmicpc.net/problem/4803) 12 | 13 | - 유니온 파인드 14 | 15 | ### 4. [전화번호 목록](https://www.acmicpc.net/problem/5052) 16 | 17 | - 정렬 18 | - 트라이 19 | 20 | ### 5. [양궁대회](https://school.programmers.co.kr/learn/courses/30/lessons/92342) 21 | 22 | - DFS 23 | - 구현 24 | 25 | ### 6. [혼자서 하는 틱택토](https://school.programmers.co.kr/learn/courses/30/lessons/160585) 26 | 27 | - 구현 28 | - 시뮬레이션 29 | -------------------------------------------------------------------------------- /alsrb0504/20230314/161989. 덧칠하기/덧칠하기.js: -------------------------------------------------------------------------------- 1 | function solution(n, m, section) { 2 | let answer = 0; 3 | // 현재 롤러의 위치 4 | let curIdx = 0; 5 | 6 | section.forEach((pos) => { 7 | // 현재 롤러의 위치보다 칠해야 할 위치가 더 크다면 8 | // 카운트하고 롤러 위치 이동 9 | if (curIdx < pos) { 10 | answer++; 11 | curIdx = pos + m - 1; 12 | } 13 | }); 14 | 15 | return answer; 16 | } 17 | 18 | const n = 4; 19 | const m = 1; 20 | const section = [1, 2, 3, 4]; 21 | 22 | console.log(solution(n, m, section)); 23 | -------------------------------------------------------------------------------- /alsrb0504/20230314/84512. 모음사전/모음사전.js: -------------------------------------------------------------------------------- 1 | // https://school.programmers.co.kr/learn/courses/30/lessons/84512 2 | 3 | function solution(word) { 4 | const chars = ["A", "E", "I", "O", "U"]; 5 | const arr = []; 6 | const stack = []; 7 | 8 | // 문자 조합 생성 및 정렬 9 | for (let i = 1; i <= 5; i++) dfs(0, i); 10 | arr.sort(); 11 | 12 | // Array.indexOf 사용하여 몇 번째 문자인지 찾음 13 | return arr.indexOf(word) + 1; 14 | // return arr.findIndex((val) => val === word) + 1; 15 | 16 | // 모든 문자를 조합을 만들기 위한 DFS 17 | function dfs(cnt, end) { 18 | if (cnt === end) { 19 | arr.push(stack.join("")); 20 | return; 21 | } 22 | 23 | chars.forEach((ch) => { 24 | stack.push(ch); 25 | dfs(cnt + 1, end); 26 | stack.pop(); 27 | }); 28 | } 29 | } 30 | 31 | const word = "AAAE"; 32 | 33 | console.log(solution(word)); 34 | -------------------------------------------------------------------------------- /alsrb0504/20230314/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [빙산](https://www.acmicpc.net/problem/2573) 4 | 5 | - BFS 6 | 7 | ### 2. [크리보드](https://www.acmicpc.net/problem/11058) 8 | 9 | - DP 10 | 11 | ### 3. [모음사전](https://school.programmers.co.kr/learn/courses/30/lessons/84512) 12 | 13 | - 브루트포스 14 | 15 | ### 4. [주차요금계산](https://school.programmers.co.kr/learn/courses/30/lessons/92341) 16 | 17 | - 구현, 시뮬레이션 18 | 19 | ### 5. [덧칠하기](https://school.programmers.co.kr/learn/courses/30/lessons/161989) 20 | 21 | - 그리디 22 | 23 | ### 6. [호텔대실](https://school.programmers.co.kr/learn/courses/30/lessons/155651) 24 | 25 | - 정렬, 구현 26 | -------------------------------------------------------------------------------- /alsrb0504/20230321/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [이진트리](https://www.acmicpc.net/problem/13325) 4 | 5 | - 트리, DP 6 | 7 | ### 2. [이중 우선 순위 큐](https://school.programmers.co.kr/learn/courses/30/lessons/42628) 8 | 9 | - 힙 10 | 11 | ### 3. [N-Queen](https://school.programmers.co.kr/learn/courses/30/lessons/12952) 12 | 13 | - DFS, 시뮬레이션 14 | 15 | ### 4. [개인정보 수집 유효기간](https://school.programmers.co.kr/learn/courses/30/lessons/150370) 16 | 17 | - 문자열, 구현 18 | 19 | ### 5. [택배 배달과 수거하기](https://school.programmers.co.kr/learn/courses/30/lessons/150369) 20 | 21 | - 그리디 22 | 23 | ### 6. [미로 탈출](https://school.programmers.co.kr/learn/courses/30/lessons/159993) 24 | 25 | - BFS 26 | -------------------------------------------------------------------------------- /alsrb0504/20230328/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [가희의 고구마 먹방](https://www.acmicpc.net/problem/21772) 4 | 5 | - DFS 6 | 7 | ### 2. [상근이의 여행](https://www.acmicpc.net/problem/9372) 8 | 9 | - 그래프 이론 10 | 11 | ### 3. [등대](https://school.programmers.co.kr/learn/courses/30/lessons/133500) 12 | 13 | - DFS, 트리 14 | 15 | ### 4. [스킬트리](https://school.programmers.co.kr/learn/courses/30/lessons/49993) 16 | 17 | - 문자열, 구현 18 | 19 | ### 5. [자물쇠와 열쇠](https://school.programmers.co.kr/learn/courses/30/lessons/60059) 20 | 21 | - 배열, 브루트포스 22 | -------------------------------------------------------------------------------- /alsrb0504/20230328/등대/등대(dfs 실패).js: -------------------------------------------------------------------------------- 1 | // 구글에 나와있는 풀이 2 | // 테스트 케이스 9 실패 : js 콜스택 초과 3 | function solution(n, lighthouse) { 4 | const graph = Array.from({ length: n + 1 }, () => []); 5 | lighthouse.forEach((val) => { 6 | const [u, v] = val; 7 | graph[u].push(v); 8 | graph[v].push(u); 9 | }); 10 | 11 | let answer = 0; 12 | 13 | const visited = new Array(n + 1).fill(false); 14 | 15 | visited[1] = true; 16 | dfs(1, 0); 17 | return answer; 18 | 19 | function dfs(curr) { 20 | let childTurn = 0; 21 | 22 | for (let child of graph[curr]) { 23 | if (visited[child]) continue; 24 | 25 | visited[child] = true; 26 | childTurn += dfs(child); 27 | visited[child] = false; 28 | } 29 | 30 | if (childTurn === 0) return 1; 31 | 32 | answer++; 33 | return 0; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /alsrb0504/20230328/상근이의 여행/상근이의 여행.js: -------------------------------------------------------------------------------- 1 | const readFileSyncAddress = "/dev/stdin"; 2 | const input = require("fs") 3 | .readFileSync(readFileSyncAddress) 4 | .toString() 5 | .trimEnd() 6 | .split("\n"); 7 | 8 | const tc = Number(input[0]); 9 | const answer = []; 10 | let line = 1; 11 | 12 | // 문제에서 비행 스케쥴이 항상 연결 그래프(=신장 트리)라는 점이 보장 13 | // + 동일한 비행기를 여러번 탑승하는 것은 카운트 횟수가 "1" 14 | // 그러므로, 모든 정점은 이미 연결된 하나의 그래프(=신장 트리)가 보장되기에 답은 N - 1 15 | for (let i = 0; i < tc; i++) { 16 | const [N, M] = input[line].split(" ").map(Number); 17 | 18 | answer.push(N - 1); 19 | line += M + 1; 20 | } 21 | console.log(answer.join("\n")); 22 | -------------------------------------------------------------------------------- /alsrb0504/20230328/스킬트리/스킬트리.js: -------------------------------------------------------------------------------- 1 | function solution(skill, skill_trees) { 2 | let answer = 0; 3 | 4 | for (let i = 0; i < skill_trees.length; i++) { 5 | if (checkSkills(skill_trees[i])) answer++; 6 | } 7 | 8 | return answer; 9 | 10 | function checkSkills(str) { 11 | let cnt = 0; 12 | 13 | // cnt는 skill 트리의 cnt번째 스킬을 의미 14 | // 문자열 str의 원소를 하나씩 확인하며 15 | // 만약, str[j]가 스킬에 포함되어 있을 때, 16 | // 1. skill[cnt] (= 현재 찍어야 하는 스킬)이 str[j]와 같다면 17 | // 다음 스킬 순서로 cnt 증가 18 | // 2. 그렇지 않다면 순서가 틀린 경우 => 실패 19 | for (let j = 0; j < str.length; j++) { 20 | if (skill.includes(str[j])) { 21 | if (str[j] === skill[cnt]) { 22 | cnt++; 23 | } else { 24 | return false; 25 | } 26 | } 27 | } 28 | 29 | return true; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /alsrb0504/20230404/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [광물 캐기](https://school.programmers.co.kr/learn/courses/30/lessons/172927) 4 | 5 | - 시뮬레이션, 구현 6 | 7 | ### 2. [귤 고르기](https://school.programmers.co.kr/learn/courses/30/lessons/138476) 8 | 9 | - 정렬 10 | 11 | ### 3. [그렇고 그런 사이](https://www.acmicpc.net/problem/20921) 12 | 13 | - 그리디, 구성적 14 | 15 | ### 4. [늑대와 올바른 단어](https://www.acmicpc.net/problem/13022) 16 | 17 | - 문자열, 구현 18 | 19 | ### 5. [메뉴 리뉴얼](https://school.programmers.co.kr/learn/courses/30/lessons/72411) 20 | 21 | - 문자열, DFS, 구현 22 | -------------------------------------------------------------------------------- /alsrb0504/20230404/귤 고르기/귤 고르기.js: -------------------------------------------------------------------------------- 1 | function solution(k, tangerine) { 2 | const TOTAL = tangerine.length; 3 | const map = new Map(); 4 | 5 | // Map을 사용하여 귤 크기와 개수를 저장 6 | for (let num of tangerine) { 7 | map.set(num, map.has(num) ? map.get(num) + 1 : 1); 8 | } 9 | 10 | // 개수만을 추출하여 오름차순으로 정렬 11 | const items = [...map.values()].sort((a, b) => a - b); 12 | 13 | let curr_cnt = TOTAL; 14 | let remove_cnt = 0; 15 | 16 | // 현재 남아있는 귤의 수량에서 귤의 크기를 작은 순으로 하나씩 17 | // 뺄 수 있다면 제외한 귤의 종류 수 증가 18 | for (let cnt of items) { 19 | if (curr_cnt - cnt >= k) { 20 | remove_cnt++; 21 | 22 | curr_cnt -= cnt; 23 | } else break; 24 | } 25 | 26 | // 총 귤의 종류 - 제외한 귤의 종류 수 27 | return items.length - remove_cnt; 28 | } 29 | -------------------------------------------------------------------------------- /alsrb0504/20230411/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [감시 피하기](https://www.acmicpc.net/problem/18428) 4 | 5 | - DFS 6 | 7 | ### 2. [과제 진행하기](https://school.programmers.co.kr/learn/courses/30/lessons/176962) 8 | 9 | - 구현, 시뮬레이션, 스택 10 | 11 | ### 3. [성격 유형 검사하기](https://school.programmers.co.kr/learn/courses/30/lessons/118666) 12 | 13 | - 구현 14 | 15 | ### 4. [표현 가능한 이진트리](https://school.programmers.co.kr/learn/courses/30/lessons/150367) 16 | 17 | - 트리, DFS 18 | 19 | ### 5. [프렌즈4블록](https://school.programmers.co.kr/learn/courses/30/lessons/17679) 20 | 21 | - 구현, 시뮬레이션 22 | -------------------------------------------------------------------------------- /alsrb0504/20230418/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [등산 경로 정하기](https://school.programmers.co.kr/learn/courses/30/lessons/118669) 4 | 5 | - 다익스트라, 구현 6 | 7 | ### 2. [디펜스 게임](https://school.programmers.co.kr/learn/courses/30/lessons/142085) 8 | 9 | - 힙 10 | 11 | ### 3. [양과 늑대](https://school.programmers.co.kr/learn/courses/30/lessons/92343) 12 | 13 | - DFS, 비트마스킹 14 | 15 | ### 4. [욕심쟁이 판다](https://www.acmicpc.net/problem/1937) 16 | 17 | - DFS, DP 18 | 19 | ### 5. [택배상자](https://school.programmers.co.kr/learn/courses/30/lessons/131704) 20 | 21 | - 스택 22 | -------------------------------------------------------------------------------- /alsrb0504/20230418/택배상자/택배상자.js: -------------------------------------------------------------------------------- 1 | function solution(order) { 2 | const stack = []; 3 | let answer = 0; 4 | let curr = 1; 5 | 6 | // 택배를 담을 수 없다면 종료 7 | order.some((item) => { 8 | // 현재 담을 아이템보다 컨테이너 벨트 아이템이 작다면 9 | // stack에 push 10 | while (curr < item) { 11 | stack.push(curr++); 12 | } 13 | 14 | // 현재 담을 아이템과 컨테이너 벨트 아이템이 다르다면 15 | // 1. stack의 top에 다음 아이템이 있다면 그대로 진행. 16 | // 2. stack의 top이 현재 담을 아이템과 다르다면 종료 17 | if (curr !== item) { 18 | if (stack.at(-1) === item) stack.pop(); 19 | else return true; 20 | } else { 21 | // 현재 다음 아이템과 컨테이너 벨트 아이템이 같다면 22 | // 컨테이너 벨트 아이템 번호 증가 23 | curr++; 24 | } 25 | 26 | answer++; 27 | }); 28 | 29 | return answer; 30 | } 31 | 32 | const order = [3, 2, 1, 4, 5]; 33 | 34 | console.log(solution(order)); 35 | -------------------------------------------------------------------------------- /alsrb0504/20230425/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [미로 탈출 명령어](https://school.programmers.co.kr/learn/courses/30/lessons/150365) 4 | 5 | - 그리디 6 | 7 | ### 2. [롤케이크 자르기](https://school.programmers.co.kr/learn/courses/30/lessons/132265) 8 | 9 | - 구현, 시뮬레이션, 자료구조(Map, Set) 10 | 11 | ### 3. [목장 건설하기](https://www.acmicpc.net/problem/14925) 12 | 13 | - DP 14 | 15 | ### 4. [숫자 블록](https://school.programmers.co.kr/learn/courses/30/lessons/12923) 16 | 17 | - 수학 18 | 19 | ### 5. [오픈채팅방](https://school.programmers.co.kr/learn/courses/30/lessons/42888) 20 | 21 | - 문자열, 구현 22 | -------------------------------------------------------------------------------- /alsrb0504/20230502/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [최고의 집합](https://school.programmers.co.kr/learn/courses/30/lessons/12938) 4 | 5 | - 수학 6 | 7 | ### 2. [2개 이하로 다른 비트](https://school.programmers.co.kr/learn/courses/30/lessons/77885) 8 | 9 | - 수학, 비트마스킹 10 | 11 | ### 3. [알약](https://www.acmicpc.net/problem/4811) 12 | 13 | - DP 14 | 15 | ### 4. [이모티콘 할인행사](https://school.programmers.co.kr/learn/courses/30/lessons/150368) 16 | 17 | - 문자열, 구현, 시뮬레이션 18 | 19 | ### 5. [블록 이동하기](https://school.programmers.co.kr/learn/courses/30/lessons/60063) 20 | 21 | - BFS, 구현, 시뮬레이션 22 | -------------------------------------------------------------------------------- /alsrb0504/20230509/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [숫자 변환하기](https://school.programmers.co.kr/learn/courses/30/lessons/154538) 4 | 5 | - BFS 6 | 7 | ### 2. [삼각 달팽이](https://school.programmers.co.kr/learn/courses/30/lessons/68645) 8 | 9 | - 구현, 시뮬레이션 10 | 11 | ### 3. [순위 검색](https://school.programmers.co.kr/learn/courses/30/lessons/72412) 12 | 13 | - 문자열, 구현, 이분 탐색 14 | 15 | ### 4. [타겟 넘버](https://school.programmers.co.kr/learn/courses/30/lessons/43165) 16 | 17 | - DFS 18 | 19 | ### 5. [테이블 해시 함수](https://school.programmers.co.kr/learn/courses/30/lessons/147354) 20 | 21 | - 구현 22 | -------------------------------------------------------------------------------- /alsrb0504/20230509/타겟 넘버/타겟 넘버.js: -------------------------------------------------------------------------------- 1 | function solution(numbers, target) { 2 | let answer = 0; 3 | const SIZE = numbers.length; 4 | 5 | dfs(0, 0); 6 | 7 | // 매 numbers[cnt]의 값을 +, - 하며 최종 결과가 8 | // target과 같을 때, answer값을 증가 9 | function dfs(cnt, sum) { 10 | if (cnt === SIZE) { 11 | if (sum === target) answer++; 12 | return; 13 | } 14 | 15 | dfs(cnt + 1, sum + numbers[cnt]); 16 | 17 | dfs(cnt + 1, sum - numbers[cnt]); 18 | } 19 | 20 | return answer; 21 | } 22 | 23 | const [numbers, target] = [[1, 1, 1, 1, 1], 3]; 24 | 25 | console.log(solution(numbers, target)); 26 | -------------------------------------------------------------------------------- /alsrb0504/20230516/124 나라의 숫자/124 나라의 숫자.js: -------------------------------------------------------------------------------- 1 | // 규칙 2 | // n을 소인수 분해 할 때, 3 | // 나머지가 0이면 => 몫의 값을 -1 하고 '4'를 정답 배열에 push 4 | // 그렇지 않은 경우 => 정답 배열에 나머지 push 5 | function solution(n) { 6 | const answer = []; 7 | 8 | while (n > 0) { 9 | const rest = n % 3; 10 | n = Math.floor(n / 3); 11 | 12 | if (rest === 0) { 13 | answer.push(4); 14 | n--; 15 | } else { 16 | answer.push(rest); 17 | } 18 | } 19 | 20 | return answer.reverse().join(""); 21 | } 22 | 23 | const n = 39; 24 | 25 | console.log(solution(n)); 26 | -------------------------------------------------------------------------------- /alsrb0504/20230516/n^2 배열 나누기/n^2 배열 나누기.js: -------------------------------------------------------------------------------- 1 | function solution(n, left, right) { 2 | const answer = []; 3 | 4 | for (let i = left; i <= right; i++) { 5 | // 몫과 나머지 6 | const quotient = Math.floor(i / n); 7 | const reminder = i % n; 8 | 9 | // 4 * 4 10 | // [ 1, 2, 3, 4] 11 | // [ 2, 2, 3, 4] 12 | // [ 3, 3, 3, 4] 13 | // [ 4, 4, 4, 4] 14 | // 규칙 : 나머지 + 1 <= 몫 보다 작은 경우는 몫 + 1. 15 | // 그렇지 않은 경우는 나머지 + 1 16 | if (reminder + 1 <= quotient) { 17 | answer.push(1 + quotient); 18 | } else { 19 | answer.push(reminder + 1); 20 | } 21 | } 22 | 23 | return answer; 24 | } 25 | 26 | const [n, left, right] = [4, 0, 15]; 27 | // answer : [ 1, 2, 3, 4, 2, 2, 3, 4, 3, 3, 3, 4, 4, 4, 4, 4 ] 28 | 29 | console.log(solution(n, left, right)); 30 | -------------------------------------------------------------------------------- /alsrb0504/20230516/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [야근 지수](https://school.programmers.co.kr/learn/courses/30/lessons/12927) 4 | 5 | - 구현, 시뮬레이션 6 | 7 | ### 2. [n^2 배열 나누기](https://school.programmers.co.kr/learn/courses/30/lessons/87390) 8 | 9 | - 구현 10 | 11 | ### 3. [당구 연습](https://school.programmers.co.kr/learn/courses/30/lessons/169198) 12 | 13 | - 수학, 시뮬레이션 14 | 15 | ### 4. [124 나라의 숫자](https://school.programmers.co.kr/learn/courses/30/lessons/12899) 16 | 17 | - 수학 18 | 19 | ### 5. [점프 게임](https://www.acmicpc.net/problem/15558) 20 | 21 | - BFS 22 | -------------------------------------------------------------------------------- /alsrb0504/20230523/problems.md: -------------------------------------------------------------------------------- 1 | ## 이번주 문제 2 | 3 | ### 1. [인구이동](https://www.acmicpc.net/problem/16234) 4 | 5 | ### 2. [카잉 달력](https://www.acmicpc.net/problem/6064) 6 | 7 | ### 3. [컨베이어 벨트 위의 로봇](https://www.acmicpc.net/problem/20055) 8 | 9 | ### 4. [혼자 놀기의 달인](https://school.programmers.co.kr/learn/courses/30/lessons/131130) 10 | 11 | ### 5. [파일명 정렬](https://school.programmers.co.kr/learn/courses/30/lessons/17686) 12 | -------------------------------------------------------------------------------- /hyosin-Jang/230314/11058.js: -------------------------------------------------------------------------------- 1 | // 하나의 값을 입력받을 때 사용 2 | let fs = require('fs'); 3 | const input = fs.readFileSync('/dev/stdin').toString().trim(); 4 | 5 | // 숫자로 변환 6 | let n = +input; 7 | 8 | let dp = new Array(n).fill(0); 9 | 10 | // (전체선택 + 복사 + 붙여넣기)를 한 후, 버퍼에 있는 값을 쭉 붙여넣기만 한 것이 (전체선택 + 복사 + 붙여넣기)를 한번 더 해준 것보다 항상 큼 11 | for (let i = 1; i <= n; i++) { 12 | // A를 한번 입력하는 경우 13 | dp[i] = dp[i - 1] + 1; 14 | 15 | // (i-j)번째 앞에 있는 값을 (j-1)번 붙여넣기할 수 있음 16 | for (let j = 3; j < i; j++) { 17 | dp[i] = Math.max(dp[i], dp[i - j] * (j - 1)); 18 | } 19 | } 20 | 21 | console.log(dp[n]); 22 | -------------------------------------------------------------------------------- /hyosin-Jang/230314/README.md: -------------------------------------------------------------------------------- 1 | ✅ 1. [programmers.호텔대실](https://school.programmers.co.kr/learn/courses/30/lessons/155651) 2 | ✅ 2. [programmers.주차요금계산](https://school.programmers.co.kr/learn/courses/30/lessons/92341) 3 | ✅ 3. [boj11058번.크리보드](https://www.acmicpc.net/problem/11058) 4 | -------------------------------------------------------------------------------- /hyosin-Jang/230321/README.md: -------------------------------------------------------------------------------- 1 | ✅ 1. [programmers.이중우선순위큐](https://school.programmers.co.kr/learn/courses/30/lessons/42628) 2 | ✅ 2. [programmers.N-Queen](https://school.programmers.co.kr/learn/courses/30/lessons/12952) 3 | ✅ 3. [programmers.개인정보 수집 유효기간](https://school.programmers.co.kr/learn/courses/30/lessons/150370) 4 | ✅ 4. [programmers.미로 탈출](https://school.programmers.co.kr/learn/courses/30/lessons/159993) 5 | -------------------------------------------------------------------------------- /hyosin-Jang/230321/개인정보 수집 유효기간.js: -------------------------------------------------------------------------------- 1 | function solution(today, terms, privacies) { 2 | var answer = []; 3 | // 타입별 유효기간 map에 저장 4 | var map = new Map(); 5 | 6 | terms.forEach((t) => { 7 | let [type, duration] = t.split(' '); 8 | map.set(type, parseInt(duration)); 9 | }); 10 | 11 | // 날짜 연산 편하게 하기 위해 Date 객체 사용 12 | const Datetoday = new Date(today); 13 | 14 | privacies.forEach((p, i) => { 15 | let [date, type] = p.split(' '); 16 | 17 | const validDate = new Date(date); 18 | 19 | // Date의 메서드인 setMonth를 이용해 현재 달 + 타입의 기간을 더한 값 구하기 20 | validDate.setMonth(validDate.getMonth() + map.get(type)); 21 | if (validDate <= Datetoday) answer.push(i + 1); 22 | }); 23 | answer.sort((a, b) => a - b); 24 | 25 | return answer; 26 | } 27 | -------------------------------------------------------------------------------- /hyosin-Jang/230321/이중우선순위큐.js: -------------------------------------------------------------------------------- 1 | function solution(operations) { 2 | const pq = []; 3 | 4 | operations.forEach((op) => { 5 | let [command, data] = op.split(' '); 6 | data = parseInt(data); // 문자열 -> 숫자 타입변환 7 | switch (command) { 8 | case 'I': 9 | pq.unshift(data); 10 | break; 11 | case 'D': // 삭제 12 | if (pq.length === 0) break; 13 | if (data === 1) { 14 | // 최댓값 삭제 15 | pq.sort((a, b) => a - b); 16 | } else if (data === -1) { 17 | pq.sort((a, b) => b - a); // 오름차순 18 | } 19 | pq.pop(); 20 | break; 21 | } 22 | }); 23 | if (!pq.length) return [0, 0]; 24 | pq.sort((a, b) => b - a); 25 | return [pq[0], pq[pq.length - 1]]; 26 | } 27 | -------------------------------------------------------------------------------- /hyosin-Jang/230327/9372.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs'); 2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n'); 3 | let result = []; 4 | 5 | let T = input.shift(); 6 | 7 | input = input.map((i) => i.split(' ').map(Number)); 8 | 9 | for (let i = 0; i < T; i++) { 10 | const [n, m] = input[0]; 11 | input.shift(); // 제일 앞에 있는거 삭제 12 | for (let j = 0; j < m; j++) { 13 | input.shift(); 14 | } 15 | // 시간초과 나서 수정 16 | result.push(n - 1); 17 | } 18 | 19 | console.log(result.join('\n')); 20 | -------------------------------------------------------------------------------- /hyosin-Jang/230327/README.md: -------------------------------------------------------------------------------- 1 | ✅ 1. [자물쇠와 열쇠](https://school.programmers.co.kr/learn/courses/30/lessons/60059) 2 | ✅ 2. [스킬트리](https://school.programmers.co.kr/learn/courses/30/lessons/49993) 3 | ✅ 3. [상근이의 여행](https://www.acmicpc.net/problem/9372) 4 | ✅ 4. [가희의 고구마 먹방](https://www.acmicpc.net/problem/21772) 5 | -------------------------------------------------------------------------------- /hyosin-Jang/230327/test.js: -------------------------------------------------------------------------------- 1 | const test = 'abced'; 2 | 3 | console.log(test.split('')); 4 | -------------------------------------------------------------------------------- /hyosin-Jang/230404/README.md: -------------------------------------------------------------------------------- 1 | 1. 프로그래머스 - 귤 고르기 2 | https://school.programmers.co.kr/learn/courses/30/lessons/138476 3 | 4 | 2. 프로그래머스 - 메뉴 리뉴얼 5 | https://school.programmers.co.kr/learn/courses/30/lessons/72411 6 | 7 | 3. 늑대와 올바른 단어 8 | https://www.acmicpc.net/problem/13022 9 | 10 | 4. 광물캐기 11 | https://school.programmers.co.kr/learn/courses/30/lessons/172927 12 | 13 | 5. 그렇고 그런 사이 14 | https://www.acmicpc.net/problem/20921 15 | -------------------------------------------------------------------------------- /hyosin-Jang/230404/귤고르기.js: -------------------------------------------------------------------------------- 1 | function solution(k, tangerine) { 2 | var answer = 0; 3 | const map = new Map(); 4 | tangerine.forEach((item) => { 5 | map.set(item, map.has(item) ? map.get(item) + 1 : 1); 6 | }); 7 | 8 | // 귤 개수에 따라 내림차순 정렬 9 | const sortedTangerine = [...map].sort((a, b) => b[1] - a[1]); 10 | 11 | sortedTangerine.forEach((tangerine) => { 12 | // 담을 개수가 0보다 클 때만 담는다 13 | if (k > 0) { 14 | k -= tangerine[1]; 15 | answer++; 16 | } 17 | }); 18 | 19 | return answer; 20 | } 21 | 22 | // k = 6; 23 | // tangerine = [1, 3, 2, 5, 4, 5, 2, 3]; 24 | // console.log(solution(k, tangerine)); 25 | -------------------------------------------------------------------------------- /hyosin-Jang/230404/그렇고그런사이.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs'); 2 | let [n, k] = fs 3 | .readFileSync('/dev/stdin') 4 | .toString() 5 | .trim() 6 | .split(' ') 7 | .map(Number); 8 | 9 | // 원래의 배열 생성 10 | let arr = Array.from({length: n}).map((_, i) => i + 1); 11 | 12 | let result = Array.from({length: n}).fill(0); 13 | 14 | let changed_num = 0; 15 | 16 | for (let i = n - 1; i > 0; i--) { 17 | if (k >= i) { 18 | k -= i; 19 | arr[i] = -1; 20 | result[changed_num++] = i + 1; 21 | } 22 | } 23 | // 배열 result를 앞에서부터 출력 24 | // 이때 배열 original에서 -1이 아닌 원소를 changed에 차례대로 옮긴다 25 | 26 | for (let i = 0; i < n; i++) { 27 | // 남은거 옮겨주기 28 | if (arr[i] >= 0) { 29 | result[changed_num++] = arr[i]; 30 | } 31 | } 32 | 33 | console.log(result.join(' ')); 34 | -------------------------------------------------------------------------------- /hyosin-Jang/230411/README.md: -------------------------------------------------------------------------------- 1 | 1. [골드 5] 감시 피하기 2 | https://www.acmicpc.net/problem/18428 3 | 4 | 2. [레벨 3] - 표현 가능한 이진트리 5 | https://school.programmers.co.kr/learn/courses/30/lessons/150367 6 | 7 | 3. [Lv. 2] 과제 진행하기 8 | https://school.programmers.co.kr/learn/courses/30/lessons/176962 9 | 10 | 4. [Lv. 1] 성격유형 검사하기 11 | https://school.programmers.co.kr/learn/courses/30/lessons/118666 12 | 13 | 5. [Lv. 2] 프렌즈블록 14 | https://school.programmers.co.kr/learn/courses/30/lessons/17679 15 | -------------------------------------------------------------------------------- /hyosin-Jang/230418/README.md: -------------------------------------------------------------------------------- 1 | 1. Lv3. 등산코스 정하기 2 | https://school.programmers.co.kr/learn/courses/30/lessons/118669 3 | 4 | 2. Lv3. 양과 늑대 5 | https://school.programmers.co.kr/learn/courses/30/lessons/92343 6 | 7 | 3. 골드 3 - 욕심쟁이 판다 8 | https://www.acmicpc.net/problem/1937 9 | 10 | 4. 택배상자 - lv2 11 | https://school.programmers.co.kr/learn/courses/30/lessons/131704 12 | 13 | 5. [Lv.2] 디펜스 게임 14 | https://school.programmers.co.kr/learn/courses/30/lessons/142085 15 | -------------------------------------------------------------------------------- /hyosin-Jang/230418/택배상자.js: -------------------------------------------------------------------------------- 1 | function solution(order) { 2 | let answer = 0; 3 | const stack = []; 4 | let idx = 0; 5 | 6 | for (let i = 1; i <= order.length; i++) { 7 | // 반복문: 컨베이어 벨트(1~5까지) 8 | // 앞에 지나간 거는 스택에 있으니까, while문 돌아서, 조건 만족하면 계속 pop해주고 9 | // 컨베이어 벨트에서는 앞에 지나간거는 볼 필요 없으니까 for문 돌 때 자기 차례에 한번만 검사하기 10 | 11 | if (order[idx] !== i) { 12 | // 컨베이어 벨트에서 order[idx]를 찾고 싶은데 없다면 13 | stack.push(i); // 스택에 상자 넣기 14 | } else { 15 | idx++; // 찾았다면 idx, 정답 증가 16 | answer++; 17 | } 18 | 19 | while (stack.length !== 0 && stack.at(-1) === order[idx]) { 20 | stack.pop(); 21 | idx++; 22 | answer++; 23 | } 24 | } 25 | return answer; 26 | } 27 | -------------------------------------------------------------------------------- /hyosin-Jang/230425/README.md: -------------------------------------------------------------------------------- 1 | 1. [Lv .3] 미로 탈출 명령어 (x) 2 | https://school.programmers.co.kr/learn/courses/30/lessons/150365 3 | 4 | 2. [Lv. 2] 롤케이크 자르기 5 | https://school.programmers.co.kr/learn/courses/30/lessons/132265 6 | 7 | 3. [골드 4] 목장 건설하기 (x) 8 | https://www.acmicpc.net/problem/14925 9 | 10 | 4. [Lv.2] 숫자 블록 11 | https://school.programmers.co.kr/learn/courses/30/lessons/12923 12 | 13 | 5. [Lv.2] 오픈 채팅방 14 | https://school.programmers.co.kr/learn/courses/30/lessons/42888 15 | -------------------------------------------------------------------------------- /hyosin-Jang/230502/2개이하로다른비트.js: -------------------------------------------------------------------------------- 1 | const getMinDifferentBit = (number) => { 2 | if (number % 2) { 3 | // 홀수인 경우 맨 뒤에서부터 처음으로 나오는 0을 1로 바꾸고, 그 다음 비트를 0으로 바꿔준다. 4 | let bit = '0' + number.toString(2); 5 | 6 | // 뒤에서부터 처음으로 등장하는 0의 인덱스를 구한다. 7 | let idx = bit.lastIndexOf('0'); 8 | 9 | return parseInt(`${bit.slice(0, idx)}10${bit.slice(idx + 2)}`, 2); 10 | } 11 | // 짝수인 경우 0으로 끝나므로 맨 마지막 0을 1로 바꿔준다 => number + 1 반환한다. 12 | return number + 1; 13 | }; 14 | 15 | function solution(numbers) { 16 | let answer = []; 17 | 18 | answer = numbers.map((number) => getMinDifferentBit(number)); 19 | 20 | return answer; 21 | } 22 | 23 | const numbers = [5, 6, 7, 8, 9]; 24 | solution(numbers); 25 | -------------------------------------------------------------------------------- /hyosin-Jang/230502/최고의집합.js: -------------------------------------------------------------------------------- 1 | function solution(n, s) { 2 | const quote = Math.floor(s / n); 3 | 4 | // 0인 경우 -1을 반환한다. 5 | if (!quote) return [-1]; 6 | 7 | // 나머지는 다시 몫에 배분할 수 있다. 8 | const remainder = s % n; 9 | const answer = new Array(n).fill(quote); 10 | 11 | // 남은 나머지만큼 반복을 돌면서 1을 더해준다. 12 | for (let i = 0; i < remainder; i++) { 13 | answer[i]++; 14 | } 15 | 16 | return answer.sort(); 17 | } 18 | 19 | n = 2; 20 | s = 9; 21 | 22 | solution(n, s); 23 | -------------------------------------------------------------------------------- /hyosin-Jang/230509/숫자변환하기.js: -------------------------------------------------------------------------------- 1 | function solution(x, y, n) { 2 | if (x == y) return 0; 3 | 4 | const dp = Array.from({length: y + 1}, () => Infinity); 5 | 6 | dp[x] = 0; 7 | 8 | for (let i = x; i <= y; i++) { 9 | if (i + n <= y) { 10 | dp[i + n] = Math.min(dp[i + n], dp[i] + 1); 11 | } 12 | if (i * 2 <= y) { 13 | dp[i * 2] = Math.min(dp[i * 2], dp[i] + 1); 14 | } 15 | if (i * 3 <= y) { 16 | dp[i * 3] = Math.min(dp[i * 3], dp[i] + 1); 17 | } 18 | } 19 | 20 | return dp[y] === Infinity ? -1 : dp[y]; 21 | } 22 | 23 | console.log(solution(2, 5, 4)); 24 | -------------------------------------------------------------------------------- /hyosin-Jang/230509/타겟넘버.js: -------------------------------------------------------------------------------- 1 | function solution(numbers, target) { 2 | let cnt = 0; 3 | 4 | // idx: 현재 탐색 중인 idx, result: 계산 결과 5 | const dfs = (idx, result) => { 6 | if (idx === numbers.length) { 7 | // 만약 만들어진 단어가 target과 같다면 cnt를 증가시킨다. 8 | if (result === target) cnt++; 9 | return; 10 | } 11 | 12 | dfs(idx + 1, result + numbers[idx]); 13 | dfs(idx + 1, result - numbers[idx]); 14 | }; 15 | 16 | dfs(0, 0); 17 | 18 | return cnt; 19 | } 20 | 21 | const numbers = [4, 1, 2, 1]; 22 | target = 4; 23 | solution(numbers, target); 24 | -------------------------------------------------------------------------------- /hyosin-Jang/230509/테이블해시함수.js: -------------------------------------------------------------------------------- 1 | function solution(data, col, row_begin, row_end) { 2 | data.sort((a, b) => { 3 | if (a[col - 1] === b[col - 1]) { 4 | return b[0] - a[0]; 5 | } 6 | return a[col - 1] - b[col - 1]; 7 | }); 8 | 9 | let S_i = 0; 10 | for (let i = row_begin; i <= row_end; i++) { 11 | S_i ^= data[i - 1].reduce((acc, cur) => acc + (cur % i), 0); 12 | } 13 | 14 | return S_i; 15 | } 16 | -------------------------------------------------------------------------------- /stakbucks/230606/p_12985_예상대진표.js: -------------------------------------------------------------------------------- 1 | function solution(n, a, b) { 2 | let count = 0; //라운드 진행 횟수 3 | while (1) { 4 | count++; 5 | a = Math.ceil(a / 2); //다음 라운드 a의 번호 6 | b = Math.ceil(b / 2); // 다음 라운드에서 b의 번호 7 | if (a === b) { 8 | // 두 번호가 겹치면 만났다는 뜻 9 | break; 10 | } 11 | } 12 | return count; 13 | } 14 | -------------------------------------------------------------------------------- /stakbucks/230606/p_42883_큰수만들기.js: -------------------------------------------------------------------------------- 1 | // 스택의 탑에 있는 수 보다 큰 수 a가 들어오면, a보다 큰 수가 탑에 올 때까지 스택을 pop 해준다. 2 | 3 | function solution(number, k) { 4 | let removeCnt = 0; // 제거한 횟수 5 | const stack = []; 6 | 7 | stack.push(number[0]); 8 | for (let i = 1; i < number.length; i++) { 9 | while (stack[stack.length - 1] < number[i] && removeCnt < k) { 10 | stack.pop(); 11 | removeCnt++; 12 | } 13 | stack.push(number[i]); 14 | } 15 | 16 | //[4,3,2,1]같이 스택에 내림차순으로 들어가있는 경우에 removeCnt가 k보다 작을 수 있음 17 | //k가 될때까지 스택을 pop해주면 된다 18 | while (removeCnt < k) { 19 | stack.pop(); 20 | removeCnt++; 21 | } 22 | 23 | return stack.join(''); 24 | } 25 | -------------------------------------------------------------------------------- /stakbucks/230613/p_12913_땅따먹기.js: -------------------------------------------------------------------------------- 1 | function solution(land) { 2 | for (let i = 1; i < land.length; i++) { 3 | land[i][0] += Math.max(land[i - 1][1], land[i - 1][2], land[i - 1][3]); 4 | land[i][1] += Math.max(land[i - 1][0], land[i - 1][2], land[i - 1][3]); 5 | land[i][2] += Math.max(land[i - 1][0], land[i - 1][1], land[i - 1][3]); 6 | land[i][3] += Math.max(land[i - 1][0], land[i - 1][1], land[i - 1][2]); 7 | } 8 | return Math.max(...land.at(-1)); 9 | } 10 | -------------------------------------------------------------------------------- /stakbucks/230613/p_140107_점찍기.js: -------------------------------------------------------------------------------- 1 | function solution(k, d) { 2 | let count = 0; 3 | 4 | for (let i = 0; i <= d; i = i + k) { 5 | // a^2=r^2-b^2 활용 6 | // 각 행에서 가능한 최대 정수 구하기 7 | // 0 부터 해당정수 사이에 가능한 k의 배수 + 1(0포함해야 돼서) 8 | count += Math.floor(Math.floor(Math.sqrt(d ** 2 - i ** 2)) / k) + 1; 9 | } 10 | return count; 11 | } 12 | -------------------------------------------------------------------------------- /stakbucks/230613/p_178871_달리기경주.js: -------------------------------------------------------------------------------- 1 | function solution(players, callings) { 2 | const map = new Map(); 3 | for (let i = 0; i < players.length; i++) { 4 | map.set(players[i], i); 5 | } 6 | for (const name of callings) { 7 | const currentRank = map.get(name); 8 | const 앞사람 = players[currentRank - 1]; 9 | 10 | //players 배열에서 앞사람과 위치 바꾸기 11 | players[currentRank] = 앞사람; 12 | players[currentRank - 1] = name; 13 | 14 | //map에서 위치 바꾸기 15 | map.set(name, currentRank - 1); 16 | map.set(앞사람, currentRank); 17 | } 18 | return [...map].sort((a, b) => a[1] - b[1]).map((i) => i[0]); 19 | } 20 | -------------------------------------------------------------------------------- /stakbucks/230620/README.md: -------------------------------------------------------------------------------- 1 | 2. [실버1] 곱셈 https://www.acmicpc.net/problem/1629 2 | 3 | 3. [실버2] 랜선 자르기 https://www.acmicpc.net/problem/1654 4 | 5 | 4. [Lv 2] 디펜스게임 https://school.programmers.co.kr/learn/courses/30/lessons/142085 6 | 7 | 5. [Lv 2] 후보키 https://school.programmers.co.kr/learn/courses/30/lessons/42890 8 | 9 | 6. [Lv 2] 124나라의숫자 https://school.programmers.co.kr/learn/courses/30/lessons/12899 10 | -------------------------------------------------------------------------------- /stakbucks/230620/b_1629_곱셈/app.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; 3 | let input = fs.readFileSync(filePath).toString().split(' '); 4 | 5 | function solution(input) { 6 | let [a, b, c] = input.map(BigInt); 7 | 8 | const power = (a, b) => { 9 | // 0 제곱하면 1 10 | if (b === 0n) return BigInt(1); 11 | 12 | // a^b=a^(b/2)*a^(b/2) 이용 13 | const half = power(a, BigInt(parseInt(b / BigInt(2)))); 14 | if (b % 2n) { 15 | // b가 홀수인 경우 16 | return (half * half * (a % c)) % c; 17 | } 18 | // b가 짝수인 경우 19 | return (half * half) % c; 20 | }; 21 | return console.log(parseInt(power(a, b))); 22 | } 23 | 24 | solution(input); 25 | -------------------------------------------------------------------------------- /stakbucks/230620/b_1629_곱셈/input.txt: -------------------------------------------------------------------------------- 1 | 10 11 12 -------------------------------------------------------------------------------- /stakbucks/230620/b_1654_랜선자르기/input.txt: -------------------------------------------------------------------------------- 1 | 4 4 2 | 802 3 | 743 4 | 457 5 | 539 -------------------------------------------------------------------------------- /stakbucks/230620/p_12899_124나라의숫자.js: -------------------------------------------------------------------------------- 1 | function solution(n) { 2 | // 자연수를 124나라 방식으로 변환하는 함수 3 | const convert = (num) => { 4 | if (num === 0) return ''; 5 | if (num === 1) return '1'; 6 | if (num === 2) return '2'; 7 | if (num === 3) return '4'; 8 | }; 9 | 10 | const go = (num) => { 11 | let quot = Math.floor(num / 3); 12 | let mod = num % 3; 13 | if (mod === 0) { 14 | quot--; 15 | mod = 3; 16 | } 17 | 18 | if (quot > 3) { 19 | //몫이 3보다 작아질 때까지 계속 3으로 나눠준다 20 | return go(quot) + convert(mod); 21 | } 22 | 23 | return convert(quot) + convert(mod); 24 | }; 25 | 26 | return go(n); 27 | } 28 | -------------------------------------------------------------------------------- /stakbucks/230627/README.md: -------------------------------------------------------------------------------- 1 | 1. [[ 골드 5 ] 리모컨] https://www.acmicpc.net/problem/1107 2 | 2. [[ Lv.2 ] 하노이의 탑] https://school.programmers.co.kr/learn/courses/30/lessons/12946 3 | 3. [[ Lv.2 ] 두 큐 합 같게 만들기] : https://school.programmers.co.kr/learn/courses/30/lessons/118667 4 | 4. [[ 골드 4 ] 주사위 굴리기] : https://www.acmicpc.net/problem/14499 5 | 5. [[ 골드 4 ] 테트로미노] : https://www.acmicpc.net/problem/14500 6 | -------------------------------------------------------------------------------- /stakbucks/230627/b_1107_리모컨/input.txt: -------------------------------------------------------------------------------- 1 | 50 2 | 10 3 | 0 1 2 3 4 5 6 7 8 9 -------------------------------------------------------------------------------- /stakbucks/230627/b_14499_주사위굴리기/input.txt: -------------------------------------------------------------------------------- 1 | 3 3 0 0 16 2 | 0 1 2 3 | 3 4 5 4 | 6 7 8 5 | 4 4 1 1 3 3 2 2 4 4 1 1 3 3 2 2 -------------------------------------------------------------------------------- /stakbucks/230627/b_14500_테트로미노/input.txt: -------------------------------------------------------------------------------- 1 | 5 5 2 | 1 2 3 4 5 3 | 5 4 3 2 1 4 | 2 3 4 5 6 5 | 6 5 4 3 2 6 | 1 2 1 2 1 -------------------------------------------------------------------------------- /stakbucks/230627/p_12946_하노이의탑.js: -------------------------------------------------------------------------------- 1 | // 2개를 1->3으로 옮기기 2 | // 1개를 1->2로 옮기기 + 1개를 1->3으로 옮기기 3 | // 1개를 2->3으로 옮기기 4 | 5 | function solution(n) { 6 | let result = []; 7 | const arr = [1, 2, 3]; 8 | const go = (n, from, to) => { 9 | const newTo = arr.filter((v) => v !== from && v !== to)[0]; 10 | if (n === 1) { 11 | result.push([from, to]); 12 | return; 13 | } 14 | 15 | go(n - 1, from, newTo); 16 | go(1, from, to); 17 | go(n - 1, newTo, to); 18 | }; 19 | 20 | go(n, 1, 3); 21 | return result; 22 | } 23 | -------------------------------------------------------------------------------- /stakbucks/230704/README.md: -------------------------------------------------------------------------------- 1 | 1. [[실버1] 스타트링크] https://www.acmicpc.net/problem/5014 2 | 2. [[실버2] 골드바흐의 추측] https://www.acmicpc.net/problem/9020 3 | 3. [[ Lv.2 ] 삼각 달팽이] https://school.programmers.co.kr/learn/courses/30/lessons/68645 4 | 4. [[ Lv.1 ] 공원 산책] https://school.programmers.co.kr/learn/courses/30/lessons/172928 5 | 5. [[ Lv.2 ] n진수 게임] https://school.programmers.co.kr/learn/courses/30/lessons/17687 6 | -------------------------------------------------------------------------------- /stakbucks/230704/b_5014_스타트링크/input.txt: -------------------------------------------------------------------------------- 1 | 100 2 1 1 0 -------------------------------------------------------------------------------- /stakbucks/230704/b_9020_골드바흐의추측/input.txt: -------------------------------------------------------------------------------- 1 | 3 2 | 8 3 | 10 4 | 16 -------------------------------------------------------------------------------- /stakbucks/230704/p_17687_n진수게임.js: -------------------------------------------------------------------------------- 1 | function solution(n, t, m, p) { 2 | const digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'].slice(0, n); 3 | const dp = Array(t * m + p + 1).fill(''); 4 | 5 | for (let i = 0; i < t * m + p; i++) { 6 | if (i >= digits.length) { 7 | const quotient = Math.floor(i / digits.length); 8 | const mod = i % digits.length; 9 | dp[i] = dp[quotient] + dp[mod]; 10 | } else dp[i] = digits[i]; 11 | } 12 | 13 | let answer = ''; 14 | let i = 0; 15 | while (answer.length < t) { 16 | if ((i % m) + 1 === p) { 17 | answer += dp.join('')[i]; 18 | } 19 | i++; 20 | } 21 | return answer; 22 | } 23 | -------------------------------------------------------------------------------- /stakbucks/230711/README.md: -------------------------------------------------------------------------------- 1 | 1. [[LV2]] 미로 탈출 https://school.programmers.co.kr/learn/courses/30/lessons/159993 2 | 2. [[LV2]] 유사 칸토어 비트열 https://school.programmers.co.kr/learn/courses/30/lessons/148652 3 | 3. [[Lv2]] 타겟 넘버 https://school.programmers.co.kr/learn/courses/30/lessons/43165 4 | 4. [[Lv2]] 모음사전 https://school.programmers.co.kr/learn/courses/30/lessons/84512 5 | 5. [[실버1]] IOIOI https://www.acmicpc.net/problem/5525 6 | -------------------------------------------------------------------------------- /stakbucks/230711/b_5525_IOIOI/input.txt: -------------------------------------------------------------------------------- 1 | 2 2 | 13 3 | OOIOIOIOIIOII -------------------------------------------------------------------------------- /stakbucks/230711/p_43165_타겟넘버.js: -------------------------------------------------------------------------------- 1 | function solution(numbers, target) { 2 | let count = 0; 3 | const DFS = (idx, sum) => { 4 | if (idx === numbers.length - 1) { 5 | if (target === sum + numbers[idx]) { 6 | count++; 7 | } 8 | if (target === sum - numbers[idx]) { 9 | count++; 10 | } 11 | return; 12 | } 13 | DFS(idx + 1, sum + numbers[idx]); 14 | DFS(idx + 1, sum - numbers[idx]); 15 | return; 16 | }; 17 | 18 | DFS(1, numbers[0]); 19 | DFS(1, -numbers[0]); 20 | return count; 21 | } 22 | -------------------------------------------------------------------------------- /stakbucks/230718/README.md: -------------------------------------------------------------------------------- 1 | 1. [[실버1] 후보 추천하기](https://www.acmicpc.net/problem/1713) 2 | 2. [[골드5] 숨바꼭질3](https://www.acmicpc.net/problem/13549) 3 | 3. [[LV2] 양궁대회](https://school.programmers.co.kr/learn/courses/30/lessons/92342) 4 | 4. [[골드5] Contact](https://www.acmicpc.net/problem/1013) 5 | 5. [[Lv2] 거리두기 확인하기](https://school.programmers.co.kr/learn/courses/30/lessons/81302) 6 | -------------------------------------------------------------------------------- /stakbucks/230718/b_1013_Contact/input.txt: -------------------------------------------------------------------------------- 1 | 3 2 | 10010111 3 | 011000100110001 4 | 0110001011001 -------------------------------------------------------------------------------- /stakbucks/230718/b_13549_숨바꼭질3/input.txt: -------------------------------------------------------------------------------- 1 | 5 17 -------------------------------------------------------------------------------- /stakbucks/230718/b_1713_후보추천하기/input.txt: -------------------------------------------------------------------------------- 1 | 3 2 | 9 3 | 2 1 4 4 5 6 6 7 2 -------------------------------------------------------------------------------- /stakbucks/230725/README.md: -------------------------------------------------------------------------------- 1 | 1. [[LV2] 이모티콘 할인행사](https://school.programmers.co.kr/learn/courses/30/lessons/150368) 2 | 2. [[LV2] 순위검색](https://school.programmers.co.kr/learn/courses/30/lessons/72412) 3 | 3. [[LV2] 오픈채팅방](https://school.programmers.co.kr/learn/courses/30/lessons/42888) 4 | 4. [[LV2] 게임 맵 최단거리](https://school.programmers.co.kr/learn/courses/30/lessons/1844) 5 | 5. [[LV2] 프로세스](https://school.programmers.co.kr/learn/courses/30/lessons/42587) 6 | -------------------------------------------------------------------------------- /stakbucks/230725/p_42888_오픈채팅방.js: -------------------------------------------------------------------------------- 1 | function solution(record) { 2 | const users = new Map(); 3 | 4 | const messages = []; 5 | 6 | for (const r of record) { 7 | const [act, id, nickname] = r.split(' '); 8 | if (act === 'Enter') { 9 | users.set(id, nickname); 10 | messages.push(id + '님이 들어왔습니다.'); 11 | } 12 | if (act === 'Leave') { 13 | messages.push(id + '님이 나갔습니다.'); 14 | } 15 | if (act === 'Change') { 16 | users.set(id, nickname); 17 | } 18 | } 19 | 20 | const answer = []; 21 | messages.forEach((v, i) => { 22 | const [id, rest] = v.split('님'); 23 | const nickname = users.get(id); 24 | answer.push(nickname + '님' + rest); 25 | }); 26 | 27 | return answer; 28 | } 29 | -------------------------------------------------------------------------------- /stakbucks/230801/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드 5] 내려가기](https://www.acmicpc.net/problem/2096) 2 | 2. [[실버 1] 카드 구매하기2](https://www.acmicpc.net/problem/16194) 3 | 3. [[Lv 2] 2개 이하로 다른 비트](https://school.programmers.co.kr/learn/courses/30/lessons/77885) 4 | 4. [[Lv 2] 괄호 변환](https://school.programmers.co.kr/learn/courses/30/lessons/60058) 5 | 5. [[Lv 2] 방문 길이](https://school.programmers.co.kr/learn/courses/30/lessons/49994) 6 | -------------------------------------------------------------------------------- /stakbucks/230801/b_16194_카드구매하기/app.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; 3 | let input = fs.readFileSync(filePath).toString().trim().split('\n'); 4 | 5 | function solution(input) { 6 | const N = Number(input[0]); 7 | const P = input[1].split(' ').map(Number); 8 | P.unshift(0); 9 | const dp = [...P]; 10 | 11 | for (let i = 1; i <= N; i++) { 12 | for (let j = i - 1; j > 0; j--) { 13 | dp[i] = Math.min(dp[i], dp[j] + dp[i - j]); 14 | } 15 | } 16 | console.log(dp[N]); 17 | } 18 | 19 | solution(input); 20 | 21 | // 1개 사는데 1원 22 | // 2개 사는데 1원 23 | // 3개 사는데 2원 24 | // 4개 사는데 3원 25 | // 5개 사는데 5원 26 | -------------------------------------------------------------------------------- /stakbucks/230801/b_16194_카드구매하기/input.txt: -------------------------------------------------------------------------------- 1 | 10 2 | 5 10 11 12 13 30 35 40 45 47 -------------------------------------------------------------------------------- /stakbucks/230801/b_2096_내려가기/input.txt: -------------------------------------------------------------------------------- 1 | 3 2 | 1 2 3 3 | 4 5 6 4 | 4 9 0 -------------------------------------------------------------------------------- /stakbucks/230808/README.md: -------------------------------------------------------------------------------- 1 | 1. [[LV 2] 메뉴 리뉴얼](https://school.programmers.co.kr/learn/courses/30/lessons/72411) 2 | 2. [[LV 2] JadenCase 문자열 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/12951) 3 | 3. [[골드 5] 숨바꼭질3](https://www.acmicpc.net/problem/13549) 4 | 4. [[Lv 2] 의상](https://school.programmers.co.kr/learn/courses/30/lessons/42578) 5 | 5. [[Lv 2] 할인행사](https://school.programmers.co.kr/learn/courses/30/lessons/131127) 6 | -------------------------------------------------------------------------------- /stakbucks/230808/b_13549_숨바꼭질3/input.txt: -------------------------------------------------------------------------------- 1 | 5 17 -------------------------------------------------------------------------------- /stakbucks/230808/p_12951_JadenCase문자열만들기.js: -------------------------------------------------------------------------------- 1 | function solution(s) { 2 | const answer = []; 3 | for (const word of s.split(' ')) { 4 | if (!word.length) { 5 | // 만약에 공백문자가 3개 연속으로 나오면 그대로 3개로 출력해야 하는지?? 6 | // 공백 문자 그대로 출력하면 오답이던데 문제 요구사항이 명확하지 않은 거 같음 7 | answer.push(''); 8 | continue; 9 | } 10 | const newWord = [...word]; 11 | newWord[0] = word[0].toUpperCase(); 12 | for (let i = 1; i < newWord.length; i++) { 13 | newWord[i] = word[i].toLowerCase(); 14 | } 15 | answer.push(newWord.join('')); 16 | } 17 | return answer.join(' '); 18 | } 19 | -------------------------------------------------------------------------------- /stakbucks/230808/p_42578_의상.js: -------------------------------------------------------------------------------- 1 | function solution(clothes) { 2 | const map = new Map(); 3 | for (const [name, type] of clothes) { 4 | if (map.has(type)) { 5 | const value = map.get(type); 6 | value.push(name); 7 | map.set(type, value); 8 | } else { 9 | map.set(type, [name]); 10 | } 11 | } 12 | let sum = 0; 13 | for (const type of map.keys()) { 14 | const value = map.get(type); 15 | if (!sum) { 16 | sum = value.length + 1; 17 | } else { 18 | sum *= value.length + 1; 19 | } 20 | } 21 | // 최소 하나는 입어야 되기 때문에 하나도 안 입는 경우 -1 22 | return sum - 1; 23 | } 24 | -------------------------------------------------------------------------------- /stakbucks/230815/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드 5] 전깃줄](https://www.acmicpc.net/problem/2565) 2 | 2. [[LV 2] 주차 요금 계산](https://school.programmers.co.kr/learn/courses/30/lessons/92341) 3 | 3. [[LV 2]전화번호 목록](https://school.programmers.co.kr/learn/courses/30/lessons/42577) 4 | 4. [[LV 2] 더 맵게](https://school.programmers.co.kr/learn/courses/30/lessons/42626) 5 | 5. [[LV 2] 주식가격](https://school.programmers.co.kr/learn/courses/30/lessons/42584) 6 | -------------------------------------------------------------------------------- /stakbucks/230815/b_2565_전깃줄/input.txt: -------------------------------------------------------------------------------- 1 | 8 2 | 1 8 3 | 3 9 4 | 2 2 5 | 4 1 6 | 6 4 7 | 10 10 8 | 9 7 9 | 7 6 -------------------------------------------------------------------------------- /stakbucks/230815/p_42577_전화번호목록.js: -------------------------------------------------------------------------------- 1 | function solution(phone_book) { 2 | phone_book.sort(); // 정렬하면 그 다음 전화번호만 확인하면 됨 3 | // ex) 119, 97674223, 1195524421 정렬시 4 | // -> 119 1195524421 9764223 5 | for (let i = 0; i < phone_book.length; i++) { 6 | const number = phone_book[i]; 7 | if (i !== phone_book.length - 1 && phone_book[i + 1].startsWith(number)) { 8 | return false; 9 | } 10 | } 11 | return true; 12 | } 13 | -------------------------------------------------------------------------------- /stakbucks/230815/p_42584_주식가격.js: -------------------------------------------------------------------------------- 1 | function solution(prices) { 2 | const stack = []; 3 | const answer = Array(prices.length).fill(-1); 4 | 5 | // prices 순회 6 | for (let i = 0; i < prices.length; i++) { 7 | while (stack.length && stack.at(-1)[0] > prices[i]) { 8 | const [value, index] = stack.pop(); 9 | answer[index] = i - index; 10 | } 11 | stack.push([prices[i], i]); 12 | } 13 | 14 | // prices 순회 후 스택에 남아있는 원소 처리 15 | while (stack.length) { 16 | const [value, index] = stack.pop(); 17 | answer[index] = prices.length - index - 1; 18 | } 19 | return answer; 20 | } 21 | -------------------------------------------------------------------------------- /stakbucks/230822/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드 5] 동전](https://www.acmicpc.net/problem/9084) 2 | 2. [[LV 2] 전력망을 둘로 나누기](https://school.programmers.co.kr/learn/courses/30/lessons/86971) 3 | 3. [[Lv2] 뉴스 클러스터링](https://school.programmers.co.kr/learn/courses/30/lessons/17677) 4 | 4. [[Lv2] 압축](https://school.programmers.co.kr/learn/courses/30/lessons/17684) 5 | 5. [[골드 5] 4연산](https://www.acmicpc.net/problem/14395) 6 | -------------------------------------------------------------------------------- /stakbucks/230822/b_14395_4연산/input.txt: -------------------------------------------------------------------------------- 1 | 7 392 -------------------------------------------------------------------------------- /stakbucks/230822/b_9084_동전/input.txt: -------------------------------------------------------------------------------- 1 | 3 2 | 2 3 | 1 2 4 | 1000 5 | 3 6 | 1 5 10 7 | 100 8 | 2 9 | 5 7 10 | 22 -------------------------------------------------------------------------------- /stakbucks/230822/p_17684_압축.js: -------------------------------------------------------------------------------- 1 | function solution(msg) { 2 | const msgArr = [...msg]; 3 | const dictionary = new Map(); 4 | for (let i = 1; i <= 26; i++) { 5 | dictionary.set(String.fromCharCode(i + 64), i); 6 | } 7 | 8 | let temp = ''; // 사전등록 여부 검사할 문자열 9 | const answer = []; 10 | while (msgArr.length) { 11 | temp += msgArr[0]; 12 | if (!dictionary.has(temp)) { 13 | const currentSize = dictionary.size; 14 | // 사전 추가 15 | dictionary.set(temp, currentSize + 1); 16 | // 정답 추가 17 | answer.push(dictionary.get(temp.slice(0, -1))); 18 | // temp 초기화 19 | temp = ''; 20 | } else { 21 | msgArr.shift(); 22 | } 23 | } 24 | answer.push(dictionary.get(temp)); 25 | return answer; 26 | } 27 | -------------------------------------------------------------------------------- /stakbucks/230829/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드5] 회문](https://www.acmicpc.net/problem/17609) 2 | 2. [[골드5] 풍선 맞추기](https://www.acmicpc.net/problem/11509) 3 | 3. [[Lv2] 롤케이크 자르기](https://school.programmers.co.kr/learn/courses/30/lessons/132265) 4 | 4. [[Lv2] 택배상자](https://school.programmers.co.kr/learn/courses/30/lessons/131704) 5 | 5. [[골드5] 평범한 배낭](https://www.acmicpc.net/problem/12865) 6 | -------------------------------------------------------------------------------- /stakbucks/230829/b_11509_풍선맞추기/app.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; 3 | let input = fs.readFileSync(filePath).toString().trim().split('\n'); 4 | 5 | function solution(input) { 6 | const balloons = input[1].split(' ').map(Number); 7 | const arrows = []; 8 | for (const height of balloons) { 9 | // 해당 높이의 풍선을 터뜨릴 수 있는 화살이 존재하는지 체크 10 | const idx = arrows.indexOf(height); 11 | if (idx !== -1) { 12 | // 존재하면 해당 화살의 높이 -1 13 | arrows[idx]--; 14 | } else { 15 | // 존재하지 않으면 새로운 화살 추가 16 | arrows.push(height - 1); 17 | } 18 | } 19 | console.log(arrows.length); 20 | } 21 | solution(input); 22 | -------------------------------------------------------------------------------- /stakbucks/230829/b_11509_풍선맞추기/input.txt: -------------------------------------------------------------------------------- 1 | 5 2 | 1 2 3 4 5 -------------------------------------------------------------------------------- /stakbucks/230829/b_12865_배낭/app.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; 3 | let input = fs.readFileSync(filePath).toString().trim().split('\n'); 4 | 5 | function solution(input) { 6 | const [N, K] = input.shift().split(' ').map(Number); 7 | const arr = Array.from({length: N}, (v, i) => input[i].split(' ').map(Number)); 8 | const dp = Array(K + 1).fill(0); // 무게별로 최대 가치 기록 9 | 10 | for (const [W, V] of arr) { 11 | for (let i = K; i >= W; i--) { 12 | dp[i] = Math.max(dp[i], dp[i - W] + V); 13 | } 14 | } 15 | console.log(dp[K]); 16 | } 17 | 18 | solution(input); 19 | -------------------------------------------------------------------------------- /stakbucks/230829/b_12865_배낭/input.txt: -------------------------------------------------------------------------------- 1 | 4 7 2 | 6 13 3 | 4 8 4 | 3 6 5 | 5 12 -------------------------------------------------------------------------------- /stakbucks/230829/b_17609_회문/input.txt: -------------------------------------------------------------------------------- 1 | 7 2 | abba 3 | summuus 4 | xabba 5 | xabbay 6 | comcom 7 | comwwmoc 8 | comwwtmoc -------------------------------------------------------------------------------- /stakbucks/230829/p_132265_롤케이크자르기.js: -------------------------------------------------------------------------------- 1 | function solution(topping) { 2 | let answer = 0; 3 | const setFront = new Set(); 4 | const arrFront = Array(topping.length + 1).fill(0); 5 | const setBack = new Set(); 6 | const arrBack = Array(topping.length + 1).fill(0); 7 | for (let i = 0; i < topping.length; i++) { 8 | // 앞에서 하나씩 추가 9 | setFront.add(topping[i]); 10 | arrFront[i] = setFront.size; 11 | 12 | // 뒤에서 하나씩 추가 13 | setBack.add(topping[topping.length - 1 - i]); 14 | arrBack[i] = setBack.size; 15 | } 16 | for (let i = 0; i < topping.length; i++) { 17 | // 인덱스 i에서 자르는 경우 18 | if (arrFront[i] === arrBack[topping.length - 1 - (i + 1)]) { 19 | answer++; 20 | } 21 | } 22 | return answer; 23 | } 24 | -------------------------------------------------------------------------------- /stakbucks/230905/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드1] k번째 수](https://www.acmicpc.net/problem/1300) 2 | 2. [[골드4] 알파벳](https://www.acmicpc.net/problem/1987) 3 | 3. [[골드4] 스도쿠](https://www.acmicpc.net/problem/2239) 4 | 4. [[골드5] 수나누기게임](https://www.acmicpc.net/problem/27172) 5 | 5. [[LV2] 혼자 놀기의 달인](https://school.programmers.co.kr/learn/courses/30/lessons/131130) 6 | -------------------------------------------------------------------------------- /stakbucks/230905/b_1300_K번째수/input.txt: -------------------------------------------------------------------------------- 1 | 3 2 | 7 -------------------------------------------------------------------------------- /stakbucks/230905/b_1987_알파벳/input.txt: -------------------------------------------------------------------------------- 1 | 3 6 2 | HFDFFB 3 | AJHGDH 4 | DGAGEH -------------------------------------------------------------------------------- /stakbucks/230905/b_2239_스두쿠/input.txt: -------------------------------------------------------------------------------- 1 | 103000509 2 | 002109400 3 | 000704000 4 | 300502006 5 | 060000050 6 | 700803004 7 | 000401000 8 | 009205800 9 | 804000107 -------------------------------------------------------------------------------- /stakbucks/230905/b_27172_수나누기게임/input.txt: -------------------------------------------------------------------------------- 1 | 3 2 | 3 4 12 -------------------------------------------------------------------------------- /stakbucks/230912/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드5] 숫자 고르기](https://www.acmicpc.net/problem/2668) 2 | 2. [[골드5] 적록색약](https://www.acmicpc.net/problem/10026) 3 | 3. [[골드4] 뱀](https://www.acmicpc.net/problem/3190) 4 | 4. [[LV2] 행렬 테두리 회전하기](https://school.programmers.co.kr/learn/courses/30/lessons/77485) 5 | 5. [[LV2] 파일명 정렬](https://school.programmers.co.kr/learn/courses/30/lessons/17686) 6 | -------------------------------------------------------------------------------- /stakbucks/230912/b_10026_적록색약/input.txt: -------------------------------------------------------------------------------- 1 | 5 2 | RRRBB 3 | GGBBB 4 | BBBRR 5 | BBRRR 6 | RRRRR -------------------------------------------------------------------------------- /stakbucks/230912/b_2668_숫자고르기/input.txt: -------------------------------------------------------------------------------- 1 | 7 2 | 3 3 | 1 4 | 1 5 | 5 6 | 5 7 | 4 8 | 6 -------------------------------------------------------------------------------- /stakbucks/230912/b_3190_뱀/input.txt: -------------------------------------------------------------------------------- 1 | 10 2 | 5 3 | 1 5 4 | 1 3 5 | 1 2 6 | 1 6 7 | 1 7 8 | 4 9 | 8 D 10 | 10 D 11 | 11 D 12 | 13 L -------------------------------------------------------------------------------- /stakbucks/230919/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드4] 함께 블록쌓기](https://www.acmicpc.net/problem/18427) 2 | 2. [[Lv2] 땅따먹기](https://school.programmers.co.kr/learn/courses/30/lessons/12913) 3 | 3. [[Lv2] 리코쳇 로봇](https://school.programmers.co.kr/learn/courses/30/lessons/169199) 4 | 4. [[Lv2] 시소 짝꿍](https://school.programmers.co.kr/learn/courses/30/lessons/152996) 5 | 5. [[LV2] 멀리 뛰기](https://school.programmers.co.kr/learn/courses/30/lessons/12914) 6 | -------------------------------------------------------------------------------- /stakbucks/230919/b_18427_함께블록쌓기/input.txt: -------------------------------------------------------------------------------- 1 | 3 3 5 2 | 2 3 5 3 | 3 5 4 | 1 2 3 -------------------------------------------------------------------------------- /stakbucks/230919/p_12913_땅따먹기.js: -------------------------------------------------------------------------------- 1 | function solution(land) { 2 | for (let i = 1; i < land.length; i++) { 3 | land[i][0] += Math.max(...land[i - 1].filter((_, i) => i !== 0)); 4 | land[i][1] += Math.max(...land[i - 1].filter((_, i) => i !== 1)); 5 | land[i][2] += Math.max(...land[i - 1].filter((_, i) => i !== 2)); 6 | land[i][3] += Math.max(...land[i - 1].filter((_, i) => i !== 3)); 7 | } 8 | return Math.max(...land.at(-1)); 9 | } 10 | -------------------------------------------------------------------------------- /stakbucks/230919/p_12914_멀리뛰기.js: -------------------------------------------------------------------------------- 1 | const DIVIDE_NUM = 1234567; 2 | 3 | function solution(n) { 4 | const dp = Array(n + 1).fill(0); 5 | dp[0] = 1; 6 | const jumps = [1, 2]; 7 | for (let i = 1; i <= n; i++) { 8 | for (let jump of jumps) { 9 | if (i >= jump) dp[i] += dp[i - jump]; 10 | } 11 | dp[i] %= DIVIDE_NUM; 12 | } 13 | return dp[n]; 14 | } 15 | -------------------------------------------------------------------------------- /stakbucks/230919/p_152996_시소짝꿍.js: -------------------------------------------------------------------------------- 1 | function solution(weights) { 2 | const ratios = [1, 2 / 3, 2 / 4, 3 / 4]; 3 | const map = new Map(); 4 | let count = 0; 5 | 6 | weights = weights.sort((a, b) => a - b); // 가벼운 무게들 부터 기록해야 7 | 8 | for (const weight of weights) { 9 | for (const ratio of ratios) { 10 | if (map.has(weight * ratio)) { 11 | count += map.get(weight * ratio); 12 | } 13 | } 14 | map.set(weight, (map.get(weight) || 0) + 1); 15 | } 16 | return count; 17 | } 18 | -------------------------------------------------------------------------------- /stakbucks/230926/README.md: -------------------------------------------------------------------------------- 1 | 1. [[Lv 2] 방금그곡](https://school.programmers.co.kr/learn/courses/30/lessons/17683) 2 | 2. [[Lv 2] 스킬트리](https://school.programmers.co.kr/learn/courses/30/lessons/49993) 3 | 3. [[LV2] 순위 정렬](https://school.programmers.co.kr/learn/courses/30/lessons/72412) 4 | 4. [[Lv.2] 숫자 변환하기](https://school.programmers.co.kr/learn/courses/30/lessons/154538) 5 | 5. [[Lv.2] 테이블 해시 함수](https://school.programmers.co.kr/learn/courses/30/lessons/147354) 6 | -------------------------------------------------------------------------------- /stakbucks/230926/p_147354_테이블해시함수.js: -------------------------------------------------------------------------------- 1 | function solution(data, col, row_begin, row_end) { 2 | // 튜플 정렬 3 | data = data.sort((a, b) => { 4 | if (a[col - 1] === b[col - 1]) { 5 | return b[0] - a[0]; 6 | } 7 | return a[col - 1] - b[col - 1]; 8 | }); 9 | 10 | let answer; 11 | for (let i = row_begin; i <= row_end; i++) { 12 | const S_i = data[i - 1].reduce((prev, cur) => prev + (cur % i), 0); 13 | if (!answer) { 14 | answer = S_i; 15 | } else { 16 | answer ^= S_i; 17 | } 18 | } 19 | return answer; 20 | } 21 | -------------------------------------------------------------------------------- /stakbucks/230926/p_49993_스킬트리.js: -------------------------------------------------------------------------------- 1 | function solution(skill, skill_trees) { 2 | const map = new Map(); 3 | [...skill].forEach((v, i) => map.set(v, i)); // 인덱스를 value로 Map에 저장 4 | let count = 0; 5 | for (const skillTree of skill_trees) { 6 | let expectedVal = 0; // 스킬 순서상 필요한 값 7 | let flag = true; 8 | for (const skill of skillTree) { 9 | if (map.has(skill)) { 10 | if (map.get(skill) !== expectedVal) { 11 | flag = false; 12 | break; 13 | } else { 14 | expectedVal++; 15 | } 16 | } 17 | } 18 | if (flag) { 19 | count++; 20 | } 21 | } 22 | return count; 23 | } 24 | -------------------------------------------------------------------------------- /stakbucks/231003/README.md: -------------------------------------------------------------------------------- 1 | 1. [[Lv2] 점 찍기](https://school.programmers.co.kr/learn/courses/30/lessons/140107) 2 | 2. [[Lv 2] 우박수열 정적분](https://school.programmers.co.kr/learn/courses/30/lessons/134239) 3 | 3. [[Lv 2] 혼자 놀기의 달인](https://school.programmers.co.kr/learn/courses/30/lessons/131130) 4 | 4. [[골드4] 줄세우기](https://www.acmicpc.net/problem/2631) 5 | 5. [[골드4] 연구소](https://www.acmicpc.net/problem/14502) 6 | -------------------------------------------------------------------------------- /stakbucks/231003/b_14502_연구소/input.txt: -------------------------------------------------------------------------------- 1 | 7 7 2 | 2 0 0 0 1 1 0 3 | 0 0 1 0 1 2 0 4 | 0 1 1 0 1 0 0 5 | 0 1 0 0 0 0 0 6 | 0 0 0 0 0 1 1 7 | 0 1 0 0 0 0 0 8 | 0 1 0 0 0 0 0 -------------------------------------------------------------------------------- /stakbucks/231003/b_2631_줄세우기/input.txt: -------------------------------------------------------------------------------- 1 | 7 2 | 3 3 | 2 4 | 5 5 | 7 6 | 6 7 | 1 8 | 4 9 | 10 | -------------------------------------------------------------------------------- /stakbucks/231003/p_131130_혼자놀기의달인.js: -------------------------------------------------------------------------------- 1 | function solution(cards) { 2 | let groupLengths = []; // 그룹별로 길이만 저장 3 | const usedCards = new Set(); // 사용된 카드 인덱스로 기록 4 | 5 | for (let i = 0; i < cards.length; i++) { 6 | const count = DFS(i, 0); 7 | groupLengths.push(count); 8 | } 9 | 10 | groupLengths.sort((a, b) => b - a); 11 | 12 | return groupLengths.length >= 2 ? groupLengths[0] * groupLengths[1] : -1; 13 | 14 | // DFS로 하나의 그룹 길이 구하기 15 | function DFS(idx, count) { 16 | if (usedCards.has(idx)) { 17 | return count; 18 | } 19 | usedCards.add(idx); 20 | return DFS(cards[idx] - 1, count + 1); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /stakbucks/231003/p_140107_점찍기.js: -------------------------------------------------------------------------------- 1 | function solution(k, d) { 2 | let count = 0; 3 | 4 | for (let i = 0; i <= d; i = i + k) { 5 | count += Math.floor(Math.floor(Math.sqrt(d ** 2 - i ** 2)) / k) + 1; 6 | } 7 | return count; 8 | } 9 | -------------------------------------------------------------------------------- /stakbucks/231010/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드5] 트리와 쿼리](https://www.acmicpc.net/problem/15681) 2 | 2. [[Lv2] 교점에 별 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/87377) 3 | 3. [[Lv2] 과제 진행하기](https://school.programmers.co.kr/learn/courses/30/lessons/176962) 4 | 4. [[골드 V] 전깃줄](https://www.acmicpc.net/problem/2565) 5 | 5. [[Lv.2] 숫자 카드 나누기](https://school.programmers.co.kr/learn/courses/30/lessons/135807) 6 | -------------------------------------------------------------------------------- /stakbucks/231010/b_15681_트리와쿼리/input.txt: -------------------------------------------------------------------------------- 1 | 9 5 3 2 | 1 3 3 | 4 3 4 | 5 4 5 | 5 6 6 | 6 7 7 | 2 3 8 | 9 6 9 | 6 8 10 | 5 11 | 4 12 | 8 -------------------------------------------------------------------------------- /stakbucks/231010/b_2656_전깃줄/input.txt: -------------------------------------------------------------------------------- 1 | 8 2 | 1 8 3 | 3 9 4 | 2 2 5 | 4 1 6 | 6 4 7 | 10 10 8 | 9 7 9 | 7 6 -------------------------------------------------------------------------------- /stakbucks/231017/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드5] 톱니바퀴](https://www.acmicpc.net/problem/14891) 2 | 2. [[Lv2] 수식 최대화](https://school.programmers.co.kr/learn/courses/30/lessons/67257) 3 | 3. [[Lv2] 멀쩡한 사각형](https://school.programmers.co.kr/learn/courses/30/lessons/62048) 4 | 4. [[Lv.2] 무인도 여행](https://school.programmers.co.kr/learn/courses/30/lessons/154540) 5 | 5. [[Lv.2] 더 맵게](https://school.programmers.co.kr/learn/courses/30/lessons/42626) 6 | -------------------------------------------------------------------------------- /stakbucks/231017/b_14891_톱니바퀴/input.txt: -------------------------------------------------------------------------------- 1 | 11111111 2 | 11111111 3 | 11111111 4 | 11111111 5 | 3 6 | 1 1 7 | 2 1 8 | 3 1 -------------------------------------------------------------------------------- /stakbucks/231017/p_62048_멀쩡한사각형.js: -------------------------------------------------------------------------------- 1 | function getMax(w, h, n) { 2 | return Math.floor((-h / w) * n + h); 3 | } 4 | 5 | function solution(w, h) { 6 | let count = 0; 7 | for (let i = 1; i < w; i++) { 8 | count += getMax(w, h, i); 9 | } 10 | return 2 * count; 11 | } 12 | -------------------------------------------------------------------------------- /stakbucks/231024/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드 4] 미세먼지 안녕!](https://www.acmicpc.net/problem/17144) 2 | 2. [[골드5] 1학년](https://www.acmicpc.net/problem/5557) 3 | 3. [[골드4] 괄호](https://www.acmicpc.net/problem/10422) 4 | 4. [[Lv2] 다리를 지나는 트럭](https://school.programmers.co.kr/learn/courses/30/lessons/42583) 5 | 5. [[Lv2] 쿼드압축 후 개수 세기](https://school.programmers.co.kr/learn/courses/30/lessons/68936) 6 | -------------------------------------------------------------------------------- /stakbucks/231024/b_10422_괄호/input.txt: -------------------------------------------------------------------------------- 1 | 3 2 | 1 3 | 2 4 | 4 -------------------------------------------------------------------------------- /stakbucks/231024/b_17144_미세먼지안녕!/input.txt: -------------------------------------------------------------------------------- 1 | 7 8 20 2 | 0 0 0 0 0 0 0 9 3 | 0 0 0 0 3 0 0 8 4 | -1 0 5 0 0 0 22 0 5 | -1 8 0 0 0 0 0 0 6 | 0 0 0 0 0 10 43 0 7 | 0 0 5 0 15 0 0 0 8 | 0 0 40 0 0 0 20 0 -------------------------------------------------------------------------------- /stakbucks/231024/b_5557_1학년/input.txt: -------------------------------------------------------------------------------- 1 | 40 2 | 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 -------------------------------------------------------------------------------- /stakbucks/231031/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드4] 타일 채우기](https://www.acmicpc.net/problem/2133) 2 | 2. [[골드5] 파이프 옮기기1](https://www.acmicpc.net/problem/17070) 3 | 3. [[골드5] 배열 돌리기](https://www.acmicpc.net/problem/16935) 4 | 4. [[Lv2] 배달](https://school.programmers.co.kr/learn/courses/30/lessons/12978) 5 | 5. [[Lv2] 줄 서는 방법](https://school.programmers.co.kr/learn/courses/30/lessons/12936) 6 | -------------------------------------------------------------------------------- /stakbucks/231031/b_16935_배열돌리기/input.txt: -------------------------------------------------------------------------------- 1 | 6 8 6 2 | 3 2 6 3 1 2 9 7 3 | 9 7 8 2 1 4 5 3 4 | 5 9 2 1 9 6 1 8 5 | 2 1 3 8 6 3 9 2 6 | 1 3 2 8 7 9 2 1 7 | 4 5 1 9 8 2 1 3 8 | 1 2 3 4 5 6 -------------------------------------------------------------------------------- /stakbucks/231031/b_17070_파이프옮기기1/input.txt: -------------------------------------------------------------------------------- 1 | 6 2 | 0 0 0 0 0 0 3 | 0 1 0 0 0 0 4 | 0 0 0 0 0 0 5 | 0 0 0 0 0 0 6 | 0 0 0 0 0 0 7 | 0 0 0 0 0 0 -------------------------------------------------------------------------------- /stakbucks/231031/b_2133_타일채우기/app.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; 3 | let input = fs.readFileSync(filePath).toString().trim(); 4 | 5 | function solution(input) { 6 | const N = Number(input); 7 | 8 | const dp = Array(N + 1).fill(0); 9 | 10 | dp[0] = 1; 11 | dp[2] = 3; 12 | 13 | for (let i = 4; i <= N; i += 2) { 14 | dp[i] += dp[i - 2] * dp[2]; 15 | for (let j = 4; j <= i; j += 2) { 16 | dp[i] += dp[i - j] * 2; 17 | } 18 | } 19 | console.log(dp[N]); 20 | } 21 | solution(input); 22 | 23 | // dp[2]=3 24 | // dp[4]=dp[2]*dp[2] 25 | // dp[6]=dp[4]*3 + dp[2]*2 26 | // ... 27 | // dp[N]= dp[N-2]*dp[2] + dp[N-4]*2 + dp[N-6]*2 + dp[N-8]*2 + ... 28 | -------------------------------------------------------------------------------- /stakbucks/231031/b_2133_타일채우기/input.txt: -------------------------------------------------------------------------------- 1 | 4 -------------------------------------------------------------------------------- /stakbucks/231031/p_12987_배달.js: -------------------------------------------------------------------------------- 1 | function solution(N, road, K) { 2 | // 그래프 3 | const graph = Array.from({length: N + 1}, () => []); 4 | 5 | for (const [a, b, c] of road) { 6 | graph[a].push([b, c]); 7 | graph[b].push([a, c]); 8 | } 9 | 10 | // 최단 경로의 길이 기록 11 | const visited = new Set(); 12 | 13 | DFS(1, 0); 14 | 15 | function DFS(idx, curTime) { 16 | visited[idx] = Math.min(visited[idx], curTime); 17 | 18 | graph[idx].forEach(([nextIdx, time]) => { 19 | const nextTime = curTime + time; 20 | if (visited[nextIdx] > nextTime && nextTime <= K) DFS(nextIdx, nextTime); 21 | }); 22 | } 23 | 24 | // Infinity가 아닌 개수 count 25 | return visited.reduce((acc, cur) => (cur !== Infinity ? acc + 1 : acc), 0); 26 | } 27 | -------------------------------------------------------------------------------- /stakbucks/231107/README.md: -------------------------------------------------------------------------------- 1 | 1. [[골드 4] 단어 수학](https://www.acmicpc.net/problem/1339) 2 | 2. [[실버 5] 누울 자리를 찾아라](https://www.acmicpc.net/problem/1652) 3 | 3. [[Lv 2] 조이스틱](https://school.programmers.co.kr/learn/courses/30/lessons/42860) 4 | 4. [[골드5] 다음 팰린드롬 수](https://www.acmicpc.net/problem/1334) 5 | 5. [[골드5] 행복 유치원](https://www.acmicpc.net/problem/13164) 6 | -------------------------------------------------------------------------------- /stakbucks/231107/b_13164_행복유치원/app.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; 3 | let input = fs 4 | .readFileSync(filePath) 5 | .toString() 6 | .trim() 7 | .split('\n') 8 | .map((v) => v.split(' ').map(Number)); 9 | 10 | function solution(input) { 11 | const [N, K] = input.shift(); 12 | const students = input.pop(); 13 | const difference = []; 14 | 15 | for (let i = 1; i < students.length; i++) { 16 | difference.push(students[i] - students[i - 1]); 17 | } 18 | 19 | difference.sort((a, b) => a - b); 20 | console.log(difference.slice(0, N - K).reduce((acc, cur) => acc + cur, 0)); 21 | return; 22 | } 23 | solution(input); 24 | -------------------------------------------------------------------------------- /stakbucks/231107/b_13164_행복유치원/input.txt: -------------------------------------------------------------------------------- 1 | 5 3 2 | 1 3 5 6 10 -------------------------------------------------------------------------------- /stakbucks/231107/b_1334_다음팰린드롬수/input.txt: -------------------------------------------------------------------------------- 1 | 9999 -------------------------------------------------------------------------------- /stakbucks/231107/b_1339_단어수학/input.txt: -------------------------------------------------------------------------------- 1 | 10 2 | ABB 3 | BC 4 | BC 5 | BC 6 | BC 7 | BC 8 | BC 9 | BC 10 | BC 11 | BC -------------------------------------------------------------------------------- /stakbucks/231107/b_1652_누울자리를찾아라/input.txt: -------------------------------------------------------------------------------- 1 | 1 2 | X -------------------------------------------------------------------------------- /stakbucks/231121/README.md: -------------------------------------------------------------------------------- 1 | 1. [[Lv 2] 뒤에 있는 큰 수 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/154539) 2 | 2. [[Lv 2] 가장 큰 정사각형 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/12905) 3 | 3. [[Lv.2] 연속 부분 수열 합의 개수](https://school.programmers.co.kr/learn/courses/30/lessons/131701) 4 | 4. [[Lv.2] 게임맵 최단거리](https://school.programmers.co.kr/learn/courses/30/lessons/1844) 5 | 5. [[골드5] 사과나무](https://www.acmicpc.net/problem/19539) 6 | -------------------------------------------------------------------------------- /stakbucks/231121/b_19539_사과나무/app.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; 3 | let input = fs 4 | .readFileSync(filePath) 5 | .toString() 6 | .trim() 7 | .split('\n') 8 | .map((v) => v.split(' ').map(Number)); 9 | 10 | function solution(input) { 11 | const totalDays = input[1].reduce((acc, cur) => acc + cur, 0) / 3; 12 | 13 | // 모든 숫자들의 합이 반드시 3의 배수여야 한다. 14 | if (totalDays % 1) return console.log('NO'); 15 | 16 | let twoCnt = 0; 17 | input[1].forEach((height) => { 18 | twoCnt += Math.floor(height / 2); // 2로 나눈 몫 19 | }); 20 | 21 | // 2를 사용한 횟수가 반드시 총 totalDays 보다 커야 한다 22 | if (twoCnt < totalDays) console.log('NO'); 23 | else console.log('YES'); 24 | } 25 | 26 | solution(input); 27 | -------------------------------------------------------------------------------- /stakbucks/231121/b_19539_사과나무/input.txt: -------------------------------------------------------------------------------- 1 | 5 2 | 1 3 1 3 1 -------------------------------------------------------------------------------- /stakbucks/231121/p_12905_가장큰정사각형찾기.js: -------------------------------------------------------------------------------- 1 | function solution(board) { 2 | const dp = Array.from({length: board.length}, () => Array(board[0].length).fill(0)); 3 | 4 | let max = 0; 5 | 6 | for (let i = 0; i < board.length; i++) { 7 | for (let j = 0; j < board[0].length; j++) { 8 | if (board[i][j] === 1) { 9 | if (i >= 1 && j >= 1) { 10 | // 왼쪽 대각선, 위, 옆 dp 값이 1이 아니면 그 중 최솟값 +1 11 | const min = Math.min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]); 12 | dp[i][j] = min + 1; 13 | } else { 14 | dp[i][j] = 1; 15 | } 16 | max = Math.max(max, dp[i][j]); 17 | } 18 | } 19 | } 20 | return max ** 2; 21 | } 22 | 23 | // 0, 1, 1, 1 24 | // 1, 1, 2, 2 25 | // 1, 2, 2, 3 26 | -------------------------------------------------------------------------------- /stakbucks/231121/p_131701_연속부분수열합의개수.js: -------------------------------------------------------------------------------- 1 | function solution(elements) { 2 | // 결과 값 중복없이 저장 3 | const set = new Set(); 4 | 5 | const dp = Array.from({length: elements.length}, () => Array(elements.length).fill(0)); 6 | dp[0] = [...elements]; 7 | elements.forEach((element) => { 8 | set.add(element); 9 | }); 10 | 11 | for (let i = 1; i < elements.length; i++) { 12 | // 원형 형태로 만들기 13 | const circular = [...elements].concat(elements.slice(0, i)); 14 | 15 | for (let j = 0; j < elements.length; j++) { 16 | dp[i][j] = dp[i - 1][j] + circular[j + i]; 17 | set.add(dp[i][j]); 18 | } 19 | } 20 | return set.size; 21 | } 22 | 23 | // 7,9,1,1,4 24 | // 16, 10, 2, 5, 11 25 | // 17, 11, 6, 12, 13 26 | // ... 27 | -------------------------------------------------------------------------------- /stakbucks/231121/p_154539_뒤에있는큰수찾기.js: -------------------------------------------------------------------------------- 1 | function solution(numbers) { 2 | const stack = []; // [숫자, 인덱스] 3 | const answer = Array(numbers.length).fill(-1); 4 | 5 | for (let i = 0; i < numbers.length; i++) { 6 | const number = numbers[i]; 7 | while (stack.length && stack.at(-1)[0] < number) { 8 | answer[stack.pop()[1]] = number; 9 | } 10 | stack.push([number, i]); 11 | } 12 | 13 | return answer; 14 | } 15 | 16 | // 17 | -------------------------------------------------------------------------------- /stakbucks/231128/README.md: -------------------------------------------------------------------------------- 1 | 1. [[Lv2] k진수에서 소수 개수 구하기](https://school.programmers.co.kr/learn/courses/30/lessons/92335) 2 | 2. [[실버 4] 균형잡힌 세상](https://www.acmicpc.net/problem/4949) 3 | 3. [[LV 2] 호텔 대실](https://school.programmers.co.kr/learn/courses/30/lessons/155651) 4 | -------------------------------------------------------------------------------- /stakbucks/231128/b_4949_균형잡힌세상/input.txt: -------------------------------------------------------------------------------- 1 | So when I die (the [first] I will see in (heaven) is a score list). 2 | [ first in ] ( first out ). 3 | Half Moon tonight (At least it is better than no Moon at all]. 4 | A rope may form )( a trail in a maze. 5 | Help( I[m being held prisoner in a fortune cookie factory)]. 6 | ([ (([( [ ] ) ( ) (( ))] )) ]). 7 | . 8 | . -------------------------------------------------------------------------------- /stakbucks/231128/p_92335_k진수에서소수개수구하기.js: -------------------------------------------------------------------------------- 1 | function solution(n, k) { 2 | let answer = 0; 3 | const convertedN = n.toString(k); 4 | 5 | let temp = ''; // 0이 나올 때까지 저장 6 | 7 | for (let i = 0; i < convertedN.length; i++) { 8 | if (convertedN[i] === '0') { 9 | if (temp.length && isPrime(+temp, k)) { 10 | answer++; 11 | } 12 | temp = ''; 13 | } else { 14 | temp += convertedN[i]; 15 | } 16 | } 17 | 18 | // 마지막 남은 temp 처리 19 | if (temp.length && isPrime(+temp, k)) { 20 | answer++; 21 | } 22 | 23 | // 소수 여부 판별 24 | function isPrime(n) { 25 | if (n === 1) return false; 26 | for (let i = 2; i <= ~~Math.sqrt(n); i++) { 27 | if (n % i === 0) return false; 28 | } 29 | return true; 30 | } 31 | 32 | return answer; 33 | } 34 | -------------------------------------------------------------------------------- /stakbucks/231205/README.md: -------------------------------------------------------------------------------- 1 | 1. [문자열 압축](https://school.programmers.co.kr/learn/courses/30/lessons/60057) 2 | 2. [택배 배달과 수거하기](https://school.programmers.co.kr/learn/courses/30/lessons/150369) 3 | 3. [석유 시추](https://school.programmers.co.kr/learn/courses/30/lessons/250136) 4 | 4. [신고 결과 받기](https://school.programmers.co.kr/learn/courses/30/lessons/92334) 5 | 5. [큰 수 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/42883) 6 | -------------------------------------------------------------------------------- /stakbucks/231205/p_42883_큰수만들기.js: -------------------------------------------------------------------------------- 1 | function solution(number, k) { 2 | const stack = []; 3 | const removedCnt = 0; // 제거한 숫자 개수 4 | 5 | number.split('').forEach((num) => { 6 | while (stack.at(-1) < num && removedCnt < k) { 7 | stack.pop(); 8 | removedCnt++; 9 | } 10 | stack.push(num); 11 | }); 12 | 13 | while (removedCnt < k) { 14 | stack.pop(); 15 | removedCnt++; 16 | } 17 | 18 | return stack.join(''); 19 | } 20 | -------------------------------------------------------------------------------- /stakbucks/231212/README.md: -------------------------------------------------------------------------------- 1 | 1. [양과 늑대](https://school.programmers.co.kr/learn/courses/30/lessons/92343) 2 | 2. [성격 유형 검사하기](https://school.programmers.co.kr/learn/courses/30/lessons/118666) 3 | 3. [이모티콘 할인행사](https://school.programmers.co.kr/learn/courses/30/lessons/150368) 4 | 4. [파일명 정렬](https://school.programmers.co.kr/learn/courses/30/lessons/17686) 5 | -------------------------------------------------------------------------------- /stakbucks/231212/p_17686_파일명정렬.js: -------------------------------------------------------------------------------- 1 | function solution(files) { 2 | const strRegex = /\D+/; 3 | const numRegex = /\d+/; 4 | 5 | return files.sort((a, b) => { 6 | const [aHead, aNumber] = [a.match(strRegex)[0].toLowerCase(), +a.match(numRegex)[0].replace(/^0+/, '')]; 7 | const [bHead, bNumber] = [b.match(strRegex)[0].toLowerCase(), +b.match(numRegex)[0].replace(/^0+/, '')]; 8 | 9 | if (aHead === bHead) { 10 | if (aNumber === bNumber) return 1; 11 | 12 | return aNumber - bNumber; 13 | } 14 | 15 | if (aHead > bHead) return 1; 16 | return -1; 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /stakbucks/231219/README.md: -------------------------------------------------------------------------------- 1 | 1. [기둥과 보 설치](https://school.programmers.co.kr/learn/courses/30/lessons/60061) 2 | 2. [광물 캐기](https://school.programmers.co.kr/learn/courses/30/lessons/172927) 3 | 3. [풍선 터뜨리기](https://www.acmicpc.net/problem/2346) 4 | 4. [DFS와 BFS](https://www.acmicpc.net/problem/1260) 5 | 5. [단지 번호 붙이기](https://www.acmicpc.net/problem/2667) 6 | -------------------------------------------------------------------------------- /stakbucks/231219/b_1260_DFS와BFS/input.txt: -------------------------------------------------------------------------------- 1 | 5 5 3 2 | 5 4 3 | 5 2 4 | 1 2 5 | 3 4 6 | 3 1 -------------------------------------------------------------------------------- /stakbucks/231219/b_2346_풍선터뜨리기/input.txt: -------------------------------------------------------------------------------- 1 | 5 2 | 3 2 1 -3 -1 -------------------------------------------------------------------------------- /stakbucks/231219/b_2667_단지번호붙이기/input.txt: -------------------------------------------------------------------------------- 1 | 5 2 | 01111 3 | 11111 4 | 11111 5 | 11111 6 | 11110 -------------------------------------------------------------------------------- /stakbucks/231226/README.md: -------------------------------------------------------------------------------- 1 | 1. [유기농 배추](https://www.acmicpc.net/problem/1012) 2 | 2. [01타일](https://www.acmicpc.net/problem/1904) 3 | 3. [미로 탈출 명령어](https://school.programmers.co.kr/learn/courses/30/lessons/150365) 4 | 4. [프렌즈 4블록](https://school.programmers.co.kr/learn/courses/30/lessons/17679) 5 | 5. [귤 고르기](https://school.programmers.co.kr/learn/courses/30/lessons/138476) 6 | -------------------------------------------------------------------------------- /stakbucks/231226/b_1012_유기농배추/input.txt: -------------------------------------------------------------------------------- 1 | 1 2 | 5 3 6 3 | 0 2 4 | 1 2 5 | 2 2 6 | 3 2 7 | 4 2 8 | 4 0 -------------------------------------------------------------------------------- /stakbucks/231226/b_1904_01타일/app.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt'; 3 | let input = +fs.readFileSync(filePath).toString().trim(); 4 | 5 | const DIVIDE_NUM = 15746; 6 | 7 | function solution(input) { 8 | const dp = Array(input + 1).fill(0); 9 | dp[1] = 1; 10 | dp[2] = 2; 11 | 12 | for (let i = 3; i <= input; i++) { 13 | dp[i] = (dp[i - 2] + dp[i - 1]) % DIVIDE_NUM; 14 | } 15 | 16 | console.log(dp[input]); 17 | } 18 | solution(input); 19 | -------------------------------------------------------------------------------- /stakbucks/231226/b_1904_01타일/input.txt: -------------------------------------------------------------------------------- 1 | 4 -------------------------------------------------------------------------------- /stakbucks/231226/p_138476_귤고르기.js: -------------------------------------------------------------------------------- 1 | function solution(k, tangerine) { 2 | const map = new Map(); 3 | 4 | tangerine.forEach((v) => { 5 | map.set(v, map.get(v) + 1 || 1); 6 | }); 7 | const sorted = Array.from(map).sort((a, b) => b[1] - a[1]); 8 | 9 | let count = 0; // 누적 귤 개수 카운트 10 | let result = 0; // 정답 11 | 12 | while (1) { 13 | if (count >= k) return result; 14 | count += sorted[result++][1]; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /youngduck/20230829/b_11509_풍선맞추기/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JS-Algorithm/JS_ALGORITHM_STUDY/246dadd48051a0458530de19f9a8926c0a88cc07/youngduck/20230829/b_11509_풍선맞추기/app.js -------------------------------------------------------------------------------- /youngduck/20230829/b_11509_풍선맞추기/input.txt: -------------------------------------------------------------------------------- 1 | 5 2 | 2 1 5 4 3 -------------------------------------------------------------------------------- /youngduck/20230829/b_12865_평범한배낭/app.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | -------------------------------------------------------------------------------- /youngduck/20230829/b_12865_평범한배낭/input.txt: -------------------------------------------------------------------------------- 1 | 4 7 2 | 6 13 3 | 4 8 4 | 3 6 5 | 5 12 -------------------------------------------------------------------------------- /youngduck/20230829/b_17609_회문/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JS-Algorithm/JS_ALGORITHM_STUDY/246dadd48051a0458530de19f9a8926c0a88cc07/youngduck/20230829/b_17609_회문/app.js -------------------------------------------------------------------------------- /youngduck/20230829/b_17609_회문/input.txt: -------------------------------------------------------------------------------- 1 | 4 7 2 | 6 13 3 | 4 8 4 | 3 6 5 | 5 12 -------------------------------------------------------------------------------- /youngduck/20230829/p_121704_택배상자.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JS-Algorithm/JS_ALGORITHM_STUDY/246dadd48051a0458530de19f9a8926c0a88cc07/youngduck/20230829/p_121704_택배상자.js -------------------------------------------------------------------------------- /youngduck/20230829/p_132265_롤케이크자르기.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JS-Algorithm/JS_ALGORITHM_STUDY/246dadd48051a0458530de19f9a8926c0a88cc07/youngduck/20230829/p_132265_롤케이크자르기.js --------------------------------------------------------------------------------