All
74 posts
[우아한테크코스] 글쓰기 미션 - 우아한테크코스 한 달 생활기

우아한테크코스 한 달 생활기 레벨 1 글쓰기 미션( ~ )으로 진행한 우아한테크코스 한 달 생활기입니다. 우아한테크코스 한 달 생활기 ✅ 나는 초짜니까 “나는 초짜니까” 슬램덩크에서 나온, 최근 본 영화 중에서 나에게 가장 어울리는 대사였다. 나는 자바를 시작한 지 얼마 되지 않았다. 아니, 정확하게는 자바를 제대로 시작한 지 얼마 되지 않았다. 프리코스를 시작할 때도 남들보다 서툴렀고, 합격한 후에도 많은 걱정을 가지고 우테코 생활을 시작했다. “나는 초짜니까…” 남들보다 자바를 잘하지도 못하고, 스프링도 잘 모르기 때문에 걱정과 두려움을 가지고 있었다. 특히 페어 프로그래밍에 대한 걱정이 제일 컸다. 다른 사람과 같이 코드를 짠다면 내가 부족한 부분이 상대에게 낱낱이 드러날 것이라 생각했고, 그게 무서웠다… 게다가 엄청난 경쟁률을 뚫고 온 크루들은 다 천재일 거라고 당연하게 생각했다. 하지만 역시 직접 부딪혀 보기 전에는 모르는 일이었다. 생각한 것처럼 무서운 일은 생기지 않…

April 20, 2023
우테코
[우아한테크코스] 학습 로그 - 요구사항과 확장성은 어디까지 고려해야 할까

PROLOG - 요구사항과 확장성은 어디까지 고려해야 할까 서론 미션을 진행하면서 요구사항 지키기는 필수다. 요구사항을 기준으로 기능을 나누고, 기능을 구현하고, 리팩토링 해야 한다. 그렇다면 요구사항만 지키면 끝일까? 우리는 사용자 친화적인 서비스를 만들기 위해 학습하고, 미션을 진행하고 있다. 서비스는 항상 변화하고, 그렇기 때문에 확장성에 신경을 써야 한다. 이런 경우 확장성은 어디까지 고려해야 할까. 사다리 미션에서 이번 미션에서 사다리를 이동시키고 출력하는 방법은 사람마다 다를 것이다. 요구사항을 보고 어떻게 구현하면 좋을지 고민하다가 3가지의 방식을 떠올렸다. 사다리 생성 후 → Users를 전부 사다리 이동해서 매핑하고, 원하는 검색이 들어오면 해당하는 결과 값 찾아서 출력하는 방식 사다리 생성 후 → 원하는 검색이 들어오면, 그 때 해당하는 만 사다리 이동하고 바로 출력하는 방식 사다리 생성 후 → 원하는 검색이 들어오면, 매핑에서 값이 있는지 확인하고 (캐…

April 19, 2023
우테코
[우아한테크코스] Level 1 - 사다리 타기 회고

🎞 1단계 - 사다리 생성 1단계 PR 🚀 1단계 기능 요구 사항 정리 사람 이름 입력받을 수 있다. 최대5글자까지 부여할 수 있다. 사람 이름은 쉼표(,)를 기준으로 구분한다. 영문만 입력받을 수 있다. 출력 형식에 맞게 변환하여 저장한다. 길이 제한에 따라 빈칸을 추가해 저장한다. 사다리 게임 사다리 높이를 입력받을 수 있다. 높이는 숫자여야 한다. 숫자 제한: 음이 아닌 정수 라인을 추가할 수 있다. 추가되는 라인의 위치는 랜덤으로 결정된다. 인접한 라인은 서로 겹치지 않도록 해야 한다. ex) |-----|-----| 모양과 같이 가로 라인이 겹치는 경우 폭을 조정할 수 있다. 이름 길이 제한 기준을 따른다. ex) 최대 5글자까지 부여 가능할 때, 사다리 폭은 5이다. 출력할 수 있다. 사람 이름도 같이 출력한다. 🚀 1단계 리팩토링 요구 사항 정리 DTO 사용 User 생성에 대한 예외 처리 문구 출력하도록 변경 createLadder() 메서드 -> Ladder 생성자…

April 19, 2023
우테코
[우아한테크코스] Level 1 - 자동차 경주 회고

우테코를 시작한지 한 달.. 드디어 여유가 생겼다. 생각보다 빠르게 한 달이 지나갔다. 미션 회고도 쓰고 여러 블로그 글도 쓰고 싶었지만, 미션 진행하고 우테코 생활 적응하는 것만으로도 바빠서 못하고 있었다. 사실 글 쓸 때 쓰고 지우고 고민하느라 시간이 많이 걸리는 게 한 몫 했다ㅎ,, 이미 미션과 미션을 끝내고 미션을 진행하고 있지만 늦게나마 지난 미션들을 회고해보려 한다. 자동차 경주 미션은 우테코에 들어와서 진행한 첫 미션이다. 모든 미션은 2개의 단계로 나뉘는데, 1단계는 페어 프로그래밍으로 진행하고 2단계는 혼자서 진행한다. 각 단계가 끝나면 리뷰어에게 코드 리뷰를 받고, 피드백을 반영하여 머지 되면 다음 단계를 진행하는 방식으로 한다. 사실 처음 미션을 시작하기 전에는 페어 프로그래밍이 무서웠다. 하나의 노트북으로 같이 페어 프로그래밍을 진행하면 내 실력이 낱낱이 드러날까봐 그게 무서웠다. 물론 지금도 어떤 페어와 매칭이 될지 미션이 시작하기 전에는 떨리긴 하지만…

March 18, 2023
우테코
[우아한테크코스] 우테코 최종 코딩 테스트 후기

우테코 프리코스 그리고 최종 코테가 끝난지도 한달이 지났다. 다시 한 달 전의 기억을 살려서 최종 코딩 테스트 후기를 써보려고 한다. 지금까지 썼던 회고와는 다르게 일기 느낌으로다가,, 👏 프리코스가 끝나고 최종 코테까지 11월 23일. 4주 동안의 프리코스 과정이 끝났다. 프리코스가 끝나고 바로 들었던 생각은 ‘떨어져도 괜찮을 것 같다’였다. 자바를 싫어하고 자바에 대해서 1학년 수준의 기초 밖에 모르는 상태에서 시작했던 프리코스였기 때문에 이미 이 4주 동안의 프리코스 과정만으로도 많은 것들을 배웠다는 생각이 들었다. 게다가 프리코스를 진행하면서 각 주차가 끝나고 다른 사람들의 코드를 봤을 때, 나랑은 완전 차원이 다르게 잘하는 사람이 많구나라고 생각했다. 각 주차가 끝나고 쓰는 소감문도 정말 간단하게 해당 주차에 새롭게 배운 핵심 내용들만 적었던 나로서는 ‘나보다 더 간절한 사람이 붙겠지’라는 생각만 들었다. 그리고 12월 14일 1차 심사 결과가 나왔다. 그렇게 큰 기대를…

January 18, 2023
우테코
[우아한테크코스] 우테코 프리코스 4주차 회고

프리코스 끝난지 한달 됐는데 아직 회고 쓰는 사람이 있다..?! 그게 나야 사실 3주차 회고를 쓰는 중에 프리코스 결과가 발표났다. 하나도 기대 안하고 있다가 발표 났다는 소식을 듣고 확인했는데, 어떻게 된 건지는 몰라도 됐다,,, 엄청 당황했지만 바로 힘들게 기차 표 예매하고, 최종 코테 대비하고, 토요일에 최종 코테 치러 서울 갔다 오고 하다 보니 시간이 바쁘게 빠르게 지나갔다,,, 그리고 솔직히 말하면 프리코스 결과 발표는 하나도 기대 안했지만, 최종 코테는 정말 이게 올해 마지막이라는 마음에 간절해졌었다. 그러다보니 회고 쓰려고 프리코스 다시 보면 최종 코테에서 못한 것들이 생각나고 집중이 안돼서 회고는 최종 코테 발표날 때까지 넣어두고 다른 일들부터 했다. 한 달 뒤에 쓰는 회고도 그 때 생각을 다시 떠올리고, 그 때 생각 못했던 것들도 다시 떠올릴 수 있어서 나름 괜찮은 것 같다. 이번 4주차 미션도 저번 주차 미션보다 기능 요구 사항과 프로그래밍 요구 사항이 많아졌다…

December 28, 2022
우테코
[우아한테크코스] 우테코 프리코스 3주차 회고

프리코스가 끝나자마자 바로 회고를 작성하려고 했는데 다른 일들을 하다 보니 생각보다 늦어졌다. 예전 프로젝트 회고를 작성하면서도 느꼈지만 블로그 글 쓰는 것부터가 아직 서툴고 회고를 쓰는 데 생각보다 시간이 오래 걸리는 것 같다,, 많이 쓰다 보면 나아지겠지 2주차 미션이 끝나고 바로 3주차 미션이 시작되었다. 3주차 미션은 로또 게임 구현으로 이전 미션보다 기능 요구 사항이 많아졌고, 프로그래밍 요구 사항도 많아졌다. 또한, 2주차 미션에서 추가로 다음과 같은 2가지 목표가 추가되었다. 클래스(객체)를 분리하는 연습 도메인 로직에 대한 단위 테스트를 작성하는 연습 🎞 3주차 미션 소개 3주차 미션 소개 🚀 기능 요구 사항 로또 게임 기능을 구현해야 한다. 로또 게임은 아래와 같은 규칙으로 진행된다. 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다. 로또 1장의 가격은 1,000원이다. 당첨 번호와 보너스 번호를 입력받는다. 사용자가 구매한 로또 번호와…

December 12, 2022
우테코
[우아한테크코스] 우테코 프리코스 2주차 회고

지난 10월 26일부터 우테코 프리코스를 시작했다. 우아한테크코스 5기에 최종 합격하는 것을 목표로 지원했지만, 아직 자바에 익숙하지 않은 나로서는 프리코스만으로도 많은 것들을 얻어갈 수 있을 거라 생각했다. 1주차와 2주차를 진행하는 시기에는 다른 면접들이 많이 잡혀있었어서 빠르게 구현만 하고 회고를 쓸 생각은 하지도 못했다. 하지만 3주차 미션을 다 구현하고 나서는 배운 점들을 꼭 회고로 남겨야겠다는 생각이 들었고, 온보딩이었던 1주차를 제외하고 2주차부터 다시 복기해가며 회고록을 써볼 생각이다. 🎞 2주차 미션 소개 2주차 미션 소개 🚀 기능 요구 사항 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. 예) 상대방(컴퓨터)의 수가 425일 때 123을 제시한 경우 :…

November 26, 2022
우테코
[KNUHR] KNUHR 프로젝트 시작 & 설계

학교 멘토링 프로그램으로 카카오 판교 아지트를 방문하고 자극을 받은 뒤, 2학기가 시작하기 직전인 8월 중순 무렵부터 새로운 프로젝트를 시작했다. 주제로 삼은 건 경북대 학생들을 위한 프로젝트/스터디 구인구직 사이트. 이미 우리 과에서는 7월 쯤부터 노션을 통해 학부생들을 위해 서비스를 제공하고 있었지만, 노션으로 사용하기에는 불편함을 느껴 웹으로 만들어보고 싶다는 욕심이 생겼다. 그렇게 새로운 프로젝트를 시작했고, 지금까지 진행한 프로젝트 진행 상황과 앞으로 있을 프로젝트 진행 상황에 대해서 포스팅 해볼 예정이다. 🧾 요구사항 정의 및 기능 설계 우선 사용자 요구사항 정의서를 작성하면서 프로젝트에 필요한 기능들을 생각했다. 회원가입/로그인 부분은 전체 서비스가 경북대 학생들을 위한 서비스이기 때문에 메일 인증을 거쳐서 회원가입을 하고 로그인 할 수 있도록 기능을 설계했다. 그 다음에는 서비스에서 가장 중요하고 없어서는 안되는 기능인 모임 CRUD와 참가 기능을 넣었다. 모임에…

October 23, 2022
Project
[Carbon-Tracker] Carbon-Tracker 프로젝트 회고

마지막 포스팅 이후 거의 세달 만에 다시 돌아왔다,, 자소서 쓰고 코테 치고 이것 저것 공부하다 보니 바빠서 블로그 관리할 생각을 못하고 있었다. 하지만 취준을 하다보니 지난 프로젝트를 되돌아보고 정리할 필요성을 느껴서 끝난지 조금 지난 프로젝트지만 늦게나마 정리해보려고 한다. (블로그도 다시 써야지) 🎞 프로젝트 소개 https://github.com/Go-Jaecheol/Carbon-Tracker Carbon-Tracker는 라는 주제의 프로젝트로, 종합설계프로젝트2 과목을 수강하면서 진행한 산학 협력 프로젝트다. 22.03 ~ 22.06 기간 동안 4명의 팀원이 크게 React를 사용한 프론트엔드 2명 / Spring Boot를 사용한 백엔드 2명으로 나뉘어 진행했고, 그 중 백엔드 파트를 담당했다. 프로젝트는 국토 교통부에서 제공하는 공공데이터 API를 활용해 데이터를 수집하고, Elastic Stack을 사용해 데이터 처리/시각화하는 과정으로 진행했다. 또한 기상청에서…

October 14, 2022
Project
[일상] 4학년 1학기 회고

벌써 22년도 절반이 지나가고 있고, 4학년 1학기를 마무리하며 지난 1학기를 되돌아보려 합니다. 4학년 1학기는 바쁘게 아주 빠르게 지나갔네요. 19학점을 들으면서 취업 준비를 위한 준비도 하다보니 시간 가는 줄 모를 정도였습니다^^,, 백엔드로 진로를 정하고 처음으로 프로젝트도 2개나 진행해보고, 처음으로 코테도 치고 면접 경험도 하면서 많은 경험을 할 수 있었던 학기였습니다. 🎞 프로젝트 우선, 이번 학기 프로젝트는 2개를 진행했는데 종합설계프로젝트2와 모바일앱프로그래밍2 과목을 들으면서 각각 프로젝트를 진행했습니다. [종프2] Carbon-Tracker 종프2는 작년 종프1이랑은 다르게 Elastic Stack, Kafka 등을 사용하면서 더 제대로 된 프로젝트를 할 수 있었고, 그래서 시작할 때부터 많은 기대와 흥미를 느끼며 시작했습니다. 추후에 프로젝트 회고도 올릴 예정이어서 프로젝트에 대한 자세한 설명은 거기서 하고, 아무튼 처음으로 Spring을 사용해서 다른 사람…

July 13, 2022
일상
[Programmers] 17683번: 방금그곡 (Python)

[2018 KAKAO BLIND RECRUITMENT 3차] 문제 https://programmers.co.kr/learn/courses/30/lessons/17683 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 ‘방금그곡’ 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다. 네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고 한다. 다음과 같은 가…

May 29, 2022
Algorithm
[Programmers] 17679번: 프렌즈4블록 (Python)

[2018 KAKAO BLIND RECRUITMENT 1차] 문제 https://programmers.co.kr/learn/courses/30/lessons/17679 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 “프렌즈4블록”. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다. 만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다. 블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다. 만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다. 위 초기 배치를 문자로 표시하면 아래와 같다. 각 문자는 라이언(R…

May 22, 2022
Algorithm
[Programmers] 17680번: 캐시 (Python)

[2018 KAKAO BLIND RECRUITMENT 1차] 문제 https://programmers.co.kr/learn/courses/30/lessons/17680 지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다. 이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다. 어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다. 어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오. 입력 형식 캐시 크기()와 도시이름 배열(…

May 22, 2022
Algorithm
[Programmers] 17678번: 셔틀버스 (Python)

[2018 KAKAO BLIND RECRUITMENT 1차] 문제 https://programmers.co.kr/learn/courses/30/lessons/17678 카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 ‘크루’라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다. 이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자. 셔틀은 부터 총 회 분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 명의 승객이 탈 수 있다. 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 에 도착한 셔틀은 자리가 있다면 에 줄을 선 크루도 탈 수 있다. 일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 …

May 22, 2022
Algorithm
[Programmers] 17677번: 뉴스 클러스터링 (Python)

[2018 KAKAO BLIND RECRUITMENT 1차] 문제 https://programmers.co.kr/learn/courses/30/lessons/17677 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브는 사용자들이 편리하게 다양한 뉴스를 찾아볼 수 있도록 문제점을 개선하는 업무를 맡게 되었다. 개발의 방향을 잡기 위해 튜브는 우선 최근 화제가 되고 있는 “카카오 신입 개발자 공채” 관련 기사를 검색해보았다. 카카오 첫 공채..’블라인드’ 방식 채용 카카오, 합병 후 첫 공채.. 블라인드 전형으로 개발자 채용 카카오, 블라인드 전형으로 신입 개발자 공채 카카오 공채, 신입 개발자 코딩 능력만 본다 카카오, 신입 공채.. “코딩 실력만 본다” 카카오 “코딩 능력만으로 2018 신입 개발자 뽑는다” 기사의 제목을 기준으로 “블라인드 전형”에 주목하…

May 22, 2022
Algorithm
[Programmers] 17676번: 추석 트래픽 (Python)

[2018 KAKAO BLIND RECRUITMENT 1차] 문제 https://programmers.co.kr/learn/courses/30/lessons/17676 이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다. 입력 형식 함수에 전달되는 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다. 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 형식으로 되어 있다. 처리시간 T는 , , 와 같이 최대 소수점 셋째 자리까지 기록하며 …

May 22, 2022
Algorithm
[BOJ] 1083번: 소트 (Python)

문제 https://www.acmicpc.net/problem/1083 크기가 N인 배열 A가 있다. 배열에 있는 모든 수는 서로 다르다. 이 배열을 소트할 때, 연속된 두 개의 원소만 교환할 수 있다. 그리고, 교환은 많아봐야 S번 할 수 있다. 이때, 소트한 결과가 사전순으로 가장 뒷서는 것을 출력한다. 입력 첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 원소가 차례대로 주어진다. 이 값은 1000000보다 작거나 같은 자연수이다. 마지막 줄에는 S가 주어진다. S는 1000000보다 작거나 같은 음이 아닌 정수이다. 출력 첫째 줄에 문제의 정답을 출력한다. 🔍 Algorithm Bubble Sort 💻 Logic S번 교환하면서 가장 내림차순이 되도록 만들기 현재 위치()에서 최대로 교환 가능한 위치()까지 최댓값 구하고, 최댓값과 최댓값의 인덱스를 저장해둔다. 구한 최댓값이 현재 위치로 오도록 Bubble Sort 진행하고, 값은 그만큼…

May 16, 2022
Algorithm
[BOJ] 16472번: 고냥이 (Python)

문제 https://www.acmicpc.net/problem/16472 고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고양이의 언어로, 고양이의 언어를 사람의 언어로 바꾸어 주는 희대의 발명품이 될 것이다. 현재 고양이말 번역기의 베타버전이 나왔다. 그러나 이 베타버전은 완전 엉망진창이다. 베타버전의 번역기는 문자열을 주면 그 중에서 최대 N개의 종류의 알파벳을 가진 연속된 문자열밖에 인식하지 못한다. 굉장히 별로지만 그나마 이게 최선이라고 사람들은 생각했다. 그리고 문자열이 주어졌을 때 이 번역기가 인식할 수 있는 최대 문자열의 길이는 얼마인지가 궁금해졌다. 고양이와 소통할 수 있도록 우리도 함께 노력해보자. 입력 첫째 줄에는 인식할 수 있는 알파벳의 종류의 최대 개수 N이 입력된다. (1 < N ≤ 26) 둘째 줄에는 문자열이 주어진다. (1…

May 16, 2022
Algorithm
[Programmers] 64062번: 징검다리 건너기 (Python)

[2019 카카오 개발자 겨울 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/64062 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 카카오 초등학교의 “니니즈 친구들”이 “라이언” 선생님과 함께 가을 소풍을 가는 중에 징검다리가 있는 개울을 만나서 건너편으로 건너려고 합니다. “라이언” 선생님은 “니니즈 친구들”이 무사히 징검다리를 건널 수 있도록 다음과 같이 규칙을 만들었습니다. 징검다리는 일렬로 놓여 있고 각 징검다리의 디딤돌에는 모두 숫자가 적혀 있으며 디딤돌의 숫자는 한 번 밟을 때마다 1씩 줄어듭니다. 디딤돌의 숫자가 0이 되면 더 이상 밟을 수 없으며 이때는 그 다음 디딤돌로 한번에 여러 칸을 건너 뛸 수 있습니다. 단, 다음으로 밟을 수 있는 디딤돌이 여러 개인 경우 무조건 가장 가까운 디딤돌로만 건너뛸 수 있습니다. “니니즈 친구들”은 개울의 왼쪽에 있으며, 개울의 오른쪽 건너편에 도착…

May 16, 2022
Algorithm
[Programmers] 64063번: 호텔 방 배정 (Python)

[2019 카카오 개발자 겨울 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/64063 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] “스노우타운”에서 호텔을 운영하고 있는 “스카피”는 호텔에 투숙하려는 고객들에게 방을 배정하려 합니다. 호텔에는 방이 총 k개 있으며, 각각의 방은 1번부터 k번까지 번호로 구분하고 있습니다. 처음에는 모든 방이 비어 있으며 “스카피”는 다음과 같은 규칙에 따라 고객에게 방을 배정하려고 합니다. 한 번에 한 명씩 신청한 순서대로 방을 배정합니다. 고객은 투숙하기 원하는 방 번호를 제출합니다. 고객이 원하는 방이 비어 있다면 즉시 배정합니다. 고객이 원하는 방이 이미 배정되어 있으면 원하는 방보다 번호가 크면서 비어있는 방 중 가장 번호가 작은 방을 배정합니다. 예를 들어, 방이 총 10개이고, 고객들이 원하는 방 번호가 순서대로 [1, 3, 4, 1, 3, 1] 일 경우…

May 16, 2022
Algorithm
[Programmers] 64064번: 불량 사용자 (Python)

[2019 카카오 개발자 겨울 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/64064 개발팀 내에서 이벤트 개발을 담당하고 있는 “무지”는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량 사용자라는 이름으로 목록을 만들어서 당첨 처리 시 제외하도록 이벤트 당첨자 담당자인 “프로도” 에게 전달하려고 합니다. 이 때 개인정보 보호을 위해 사용자 아이디 중 일부 문자를 ’’ 문자로 가려서 전달했습니다. 가리고자 하는 문자 하나에 ’’ 문자 하나를 사용하였고 아이디 당 최소 하나 이상의 ’*’ 문자를 사용하였습니다. “무지”와 “프로도”는 불량 사용자 목록에 매핑된 응모자 아이디를 제재 아이디 라고 부르기로 하였습니다. 예를 들어, 이벤트에 응모한 전체 사용자 아이디 목록이 다음과 같다면 응모자 아이디 frodo fradi crodo abc123 f…

May 16, 2022
Algorithm
[Programmers] 81305번: 시험장 나누기 (Python)

[2021 카카오 채용연계형 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/81305 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 카카오 인턴을 선발하는 코딩 테스트 시험장이 하나의 이진 트리 형태로 연결되어 있습니다. 아래 그림은 12개의 시험장이 연결된 예시입니다. 하나의 노드는 하나의 시험장을 나타냅니다. 검은 바탕의 흰 숫자는 해당 시험장의 고유 번호(ID)를 나타냅니다. 2-1. 시험장이 n개 있다면, 시험장의 고유 번호는 0부터 n-1까지 부여됩니다. 노드 안의 빨간 숫자는, 해당 시험장의 응시자 수를 나타냅니다. 3-1. 위의 그림에서, 9번 시험장에는 10명, 4번 시험장에는 8명, 6번 시험장에는 20명의 응시자가 시험을 볼 예정입니다. 노드 사이의 간선은 해당 시험장이 연결되어 있음을 의미합니다. 4-1. 위의 그림에서, 9번 시험장은 7번 시험장과, 7번 시험장은 6번 시험장과 …

May 09, 2022
Algorithm
[Programmers] 81304번: 미로 탈출 (Python)

[2021 카카오 채용연계형 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/81304 신규 게임 ‘카카오 미로 탈출’이 출시되어, 라이언이 베타테스터로 참가했습니다. 위 예시 그림은 카카오 미로 탈출의 초기 상태를 나타냅니다. 1번부터 3번까지 번호가 붙어있는 3개의 방이 있고, 방과 방 사이를 연결하는 길에는 이동하는데 걸리는 시간이 표시되어 있습니다. 길은 화살표가 가리키는 방향으로만 이동할 수 있습니다. 미로에는 함정이 존재하며, 함정으로 이동하면, 이동한 함정과 연결된 모든 화살표의 방향이 바뀝니다. 출발지점인 번 방에서 탈출이 가능한 번 방까지 이동해야 합니다. 탈출하는데 걸리는 최소 시간을 구하려고 합니다. 그림의 원은 방을 나타내며 원 안의 숫자는 방 번호를 나타냅니다. 방이 개일 때, 방 번호는 1부터 까지 사용됩니다. 화살표에 표시된 숫자는 방과 방 사이를 이동할 때 걸리는 시간을 나타냅니다. 화살표가 가…

May 09, 2022
Algorithm
[Programmers] 81303번: 표 편집 (Python)

[2021 카카오 채용연계형 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/81303 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 업무용 소프트웨어를 개발하는 니니즈웍스의 인턴인 앙몬드는 명령어 기반으로 표의 행을 선택, 삭제, 복구하는 프로그램을 작성하는 과제를 맡았습니다. 세부 요구 사항은 다음과 같습니다 위 그림에서 파란색으로 칠해진 칸은 현재 선택된 행을 나타냅니다. 단, 한 번에 한 행만 선택할 수 있으며, 표의 범위(0행 ~ 마지막 행)를 벗어날 수 없습니다. 이때, 다음과 같은 명령어를 이용하여 표를 편집합니다. : 현재 선택된 행에서 X칸 위에 있는 행을 선택합니다. : 현재 선택된 행에서 X칸 아래에 있는 행을 선택합니다. : 현재 선택된 행을 삭제한 후, 바로 아래 행을 선택합니다. 단, 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다. : 가장 최근에 삭제된 …

May 09, 2022
Algorithm
[Programmers] 81302번: 거리두기 확인하기 (Python)

[2021 카카오 채용연계형 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/81302 개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다. 코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼 아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다. 대기실은 5개이며, 각 대기실은 5x5 크기입니다. 거리두기를 위하여 응시자들 끼리는 맨해튼 거리가 2 이하로 앉지 말아 주세요. 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다. 5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 re…

May 09, 2022
Algorithm
[Programmers] 81301번: 숫자 문자열과 영단어 (Python)

[2021 카카오 채용연계형 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/81301 네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다. 1478 → “one4seveneight” 234567 → “23four5six7” 10203 → “1zerotwozero3” 이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 가 매개변수로 주어집니다. 가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요. 참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다. 숫자 영단어 0 zero 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 9 nine 제한사항 1 …

May 09, 2022
Algorithm
[Programmers] 67260번: 동굴 탐험 (Python)

[2020 카카오 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/67260 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 오지 탐험가인 프로도는 탐험 도중 n개의 방으로 이루어진 지하 동굴을 탐험하게 되었습니다. 모든 방에는 0부터 n - 1 까지 번호가 붙어있고, 이 동굴에 들어갈 수 있는 유일한 입구는 0번 방과 연결되어 있습니다. 각 방들은 양방향으로 통행이 가능한 통로로 서로 연결되어 있는데, 서로 다른 두 방을 직접 연결하는 통로는 오직 하나입니다. 임의의 서로 다른 두 방 사이의 최단경로는 딱 한 가지만 있으며, 또한 임의의 두 방 사이에 이동이 불가능한 경우는 없습니다. 탐험에 앞서 이 지하 동굴의 지도를 손에 넣은 프로도는 다음과 같이 탐험 계획을 세웠습니다. 모든 방을 적어도 한 번은 방문해야 합니다. 특정 방은 방문하기 전에 반드시 먼저 방문할 방이 정해져 있습니다. 2-1. 이는 A…

May 02, 2022
Algorithm
[Programmers] 67259번: 경주로 건설 (Python)

[2020 카카오 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/67259 건설회사의 설계사인 죠르디는 고객사로부터 자동차 경주로 건설에 필요한 견적을 의뢰받았습니다. 제공된 경주로 설계 도면에 따르면 경주로 부지는 크기의 정사각형 격자 형태이며 각 격자는 크기입니다. 설계 도면에는 각 격자의 칸은 또는 로 채워져 있으며, 은 칸이 비어 있음을 은 해당 칸이 벽으로 채워져 있음을 나타냅니다. 경주로의 출발점은 (0, 0) 칸(좌측 상단)이며, 도착점은 (N-1, N-1) 칸(우측 하단)입니다. 죠르디는 출발점인 (0, 0) 칸에서 출발한 자동차가 도착점인 (N-1, N-1) 칸까지 무사히 도달할 수 있게 중간에 끊기지 않도록 경주로를 건설해야 합니다. 경주로는 상, 하, 좌, 우로 인접한 두 빈 칸을 연결하여 건설할 수 있으며, 벽이 있는 칸에는 경주로를 건설할 수 없습니다. 이때, 인접한 두 빈 칸을 상하 또는 좌…

May 02, 2022
Algorithm
[Programmers] 67258번: 보석 쇼핑 (Python)

[2020 카카오 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/67258 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 개발자 출신으로 세계 최고의 갑부가 된 어피치는 스트레스를 받을 때면 이를 풀기 위해 오프라인 매장에 쇼핑을 하러 가곤 합니다. 어피치는 쇼핑을 할 때면 매장 진열대의 특정 범위의 물건들을 모두 싹쓸이 구매하는 습관이 있습니다. 어느 날 스트레스를 풀기 위해 보석 매장에 쇼핑을 하러 간 어피치는 이전처럼 진열대의 특정 범위의 보석을 모두 구매하되 특별히 아래 목적을 달성하고 싶었습니다. 예를 들어 아래 진열대는 4종류의 보석(RUBY, DIA, EMERALD, SAPPHIRE) 8개가 진열된 예시입니다. 진열대 번호 1 2 3 4 5 6 7 8 보석 이름 DIA RUBY RUBY DIA DIA EMERALD SAPPHIRE DIA 진열대의 3번부터 7번까지 5개의 보석을 구매하면 …

May 01, 2022
Algorithm
[Programmers] 67257번: 수식 최대화 (Python)

[2020 카카오 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/67257 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 같은 방식으로 결정하려고 합니다. 해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 3가지의 연산문자() 만으로 이루어진 연산 수식이 전달되며, 참가자의 미션은 전달받은 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출하는 것입니다. 단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다. 즉, > > 또는 > > 등과 같이 연산자 우선순위를 정의할 수 있으나 > 또는 > 처럼 2개 이상의 연산자가 동일한 순위를 가지도록 연산자 우선순위를 정의할 수는 없습니다. 수식에 포함된 연산자가 2…

April 28, 2022
Algorithm
[Programmers] 67256번: 키패드 누르기 (Python)

[2020 카카오 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/67256 스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다. 이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄지손가락은 키패드에 오른손 엄지손가락은 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다. 왼쪽 열의 3개의 숫자 , , 을 입력할 때는 왼손 엄지손가락을 사용합니다. 오른쪽 열의 3개의 숫자 , , 를 입력할 때는 오른손 엄지손가락을 사용합니다. 가운데 열의 4개의 숫자 , , , 을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다. 4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, …

April 28, 2022
Algorithm
[Spring Boot] JPA Specification을 이용한 쿼리 조건 처리

Spring Boot에서는 기본적인 CRUD가 가능하도록 JpaRepository 인터페이스를 제공하는데 여기서 findByName 같은 형식으로 쿼리 메서드를 만들어서 조건에 맞게 검색할 수 있다. 하지만 조건이 다양해지면 그만큼 쿼리 메서드도 많이 필요하고, 코드도 복잡해지는 문제점이 생긴다. 다음은 실제 스프링을 이용한 프로젝트에서 쿼리 메서드가 많아지면서 복잡해진 수정 전 코드다. 스프링으로 하는 첫 프로젝트여서 기본적인 쿼리 메서드 사용 방법만 알고 있는 상태로 조건 처리를 하려고 했는데, 조건이 복잡해지면서 코드도 복잡해졌고 실행에는 문제가 없지만 그냥 봐도 리팩토링이 필요한 코드라는 생각이 들었다. 그래서 더 간단하게 코드를 짜는 방법이 있을 거라고 생각하면서 구글링을 한 결과, JPA Specification을 활용하면 보다 간단하게 구현할 수 있다는 것을 알게 되었다. JpaSpecificationExecutor 상속 우선 JPA Specification을 사용하기…

April 24, 2022
Spring
[Programmers] 64065번: 튜플 (Python)

[2019 카카오 개발자 겨울 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/64065 셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다. (a1, a2, a3, …, an) 튜플은 다음과 같은 성질을 가지고 있습니다. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2) 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2) 튜플의 원소 개수는 유한합니다. 원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, …, an)이 주어질 때(단, a1, a2, …, an은 자연수), 이는 다음과 같이 집합 기호 ’{’, ’}‘를 이용해 표현할 수 있습니다. {{a1}, {a1, a…

April 16, 2022
Algorithm
[Programmers] 64061번: 크레인 인형뽑기 게임 (Python)

[2019 카카오 개발자 겨울 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/64061 게임개발자인 “죠르디”는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다. “죠르디”는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다. 게임 화면은 “1 x 1” 크기의 칸들로 이루어진 “N x N” 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 “5 x 5” 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 “1 x 1” 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순…

April 16, 2022
Algorithm
[Programmers] 42861번: 섬 연결하기 (Python)

문제 https://programmers.co.kr/learn/courses/30/lessons/42861 n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요. 다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다. 제한사항 섬의 개수 n은 1 이상 100 이하입니다. costs의 길이는 이하입니다. 임의의 i에 대해, costs[i][0] 와 costs[i][1]에는 다리가 연결되는 두 섬의 번호가 들어있고, costs[i][2]에는 이 두 섬을 연결하는 다리를 건설할 때 드는 비용입니다. 같은 연결은 두 번 주어지지 않습니다. 또한 순서가 바뀌더라도 같은 연결로 봅니다. 즉 0과 1 사이를 연결하…

April 12, 2022
Algorithm
[Elastic] Elastic Stack + 공공데이터 api 활용

1. 공공데이터 api 준비 일단 먼저 원하는 공공데이터 api를 공공데이터 포털에서 확인할 수 있다. 여기서 자신이 원하는 다양한 공공데이터를 찾을 수 있고, csv 형태의 파일 데이터나 api 형식으로 제공받을 수 있는데 이 포스트에서는 실제 프로젝트 진행 중에 사용했던 공공데이터 api를 기준으로 설명할 것이다. 국토교통부_공동주택 에너지 사용 정보 api로 api를 호출하면 xml 형태의 데이터를 반환해준다. 2. 데이터 전처리 Filebeat가 파일을 읽어서 logstash로 보낼 때, 보통 csv 파일을 읽도록 하는 것이 편하기 때문에 Spring 환경에서 api를 호출하면서 xml 형태의 호출 결과를 csv 파일 형식으로 저장하도록 설정했다. (Xml filter plugin을 사용해서 Logstash에서 filter 설정을 하는 방법도 있다.) 공공데이터 api 호출 방법은 국토교통부_공동주택 에너지 사용 정보 하단에 샘플 코드를 제공하고 있어서 이를 활용해서 api…

April 09, 2022
Database
[Elastic] Elastic Stack(ELK Stack) - Mac OS 설치 방법

1. Homebrew 설치 Homebrew 설치가 되어있지 않으면 터미널에서 위 명령어를 입력하여 설치할 수 있다. 2. elastic tap 저장소 추가 터미널에서 위 명령어를 통해 elastic 패키지 저장소를 추가할 수 있다. 3. Elasticsearch 설치 및 실행 위 명령어로 Elasticsearch를 설치할 수 있고 설치 완료 후에는 명령어를 통해 Elasticsearch를 실행할 수 있다. 백그라운드에서 실행하고 싶으면 명령어 대신 다음과 같은 명령어로 실행할 수도 있다. (중단할 경우에는 대신에 사용) 실행 후에는 http://localhost:9200 에 접속하여 제대로 실행되었는지 확인할 수 있다. 다음과 같은 화면이 보이면 제대로 실행중인 경우 4. Kibana 설치 및 실행 kibana 또한 위 명령어로 kibana를 설치할 수 있고 설치 완료 후에는 명령어를 통해 실행할 수 있고, 다음과 같은 명령어로 백그라운드에서 실행할 수도 있다. 실행 후…

April 06, 2022
Database
[Elastic] Elastic Stack(ELK Stack) 소개

Elastic 공식 페이지 문서를 참고하여 작성하였습니다. Elastic Stack ?? 모든 유형의 데이터를 실시간으로 검색, 분석 및 시각화할 수 있는 Elastic의 오픈소스 프로젝트들을 하나로 묶어서 Elastic Stack이라고 한다. 원래는 검색 및 분석 엔진인 Elasticsearch, 수집 파이프라인인 Logstash, 시각화 도구인 Kibana의 앞글자만 따서 ELK Stack이라고 불렀으나 파일 추적을 위한 Beats를 추가하면서 Elastic Stack으로 이름이 바뀌었다. https://www.elastic.co/kr/what-is/elk-stack Elastic Stack 구조 elk-stack-elkb-diagram.svg SQL Elastic 설명 column field row document table index schema X SQL의 schema와 비슷한 기능을 따로 제공하지 X 1. Beats [경량 데이터 수집기] Beats는 단일 목적의 …

April 06, 2022
Database
[Programmers] 42885번: 구명보트 (Python)

문제 https://programmers.co.kr/learn/courses/30/lessons/42885 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다. 구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다. 사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요. 제한사항 무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다. 각 사람의 몸…

April 01, 2022
Algorithm
[Programmers] 42883번: 큰 수 만들기 (Python)

문제 https://programmers.co.kr/learn/courses/30/lessons/42883 어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다. 예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다. 문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요. 제한사항 number는 1자리 이상, 1,000,000자리 이하인 숫자입니다. k는 1 이상 number의 자릿수 미만인 자연수입니다. 입출력 예 number k return “1924” 2 “94” “1231234” 3 “3234” “4177252841” 4 “775841” 🔍 Alg…

March 28, 2022
Algorithm
[Programmers] 42862번: 체육복 (Python)

문제 https://programmers.co.kr/learn/courses/30/lessons/42862 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요. 제한사항 전체 학생의 수는 2명 이상 30명 이하입니다. 체육복을 도…

March 24, 2022
Algorithm
[BOJ] 17472번: 다리 만들기 2 (Python)

문제 https://www.acmicpc.net/problem/17472 섬으로 이루어진 나라가 있고, 모든 섬을 다리로 연결하려고 한다. 이 나라의 지도는 N×M 크기의 이차원 격자로 나타낼 수 있고, 격자의 각 칸은 땅이거나 바다이다. 섬은 연결된 땅이 상하좌우로 붙어있는 덩어리를 말하고, 아래 그림은 네 개의 섬으로 이루어진 나라이다. 색칠되어있는 칸은 땅이다. 다리는 바다에만 건설할 수 있고, 다리의 길이는 다리가 격자에서 차지하는 칸의 수이다. 다리를 연결해서 모든 섬을 연결하려고 한다. 섬 A에서 다리를 통해 섬 B로 갈 수 있을 때, 섬 A와 B를 연결되었다고 한다. 다리의 양 끝은 섬과 인접한 바다 위에 있어야 하고, 한 다리의 방향이 중간에 바뀌면 안된다. 또, 다리의 길이는 2 이상이어야 한다. 다리의 방향이 중간에 바뀌면 안되기 때문에, 다리의 방향은 가로 또는 세로가 될 수 밖에 없다. 방향이 가로인 다리는 다리의 양 끝이 가로 방향으로 섬과 인접해야 하고,…

March 24, 2022
Algorithm
[Database] Basic SQL Queries

🔍 기본 검색 Query SELECT 문 데이터베이스에서 정보 검색을 하는데 가장 기본이 되는 구문으로, 형태가 기본적인 형태다. relational algebra에서 selection과는 다름 ex) Aliasing / Renaming 두 개 이상의 attribute들이 서로 이름이 같은 경우에는 다음과 같이 이름을 바꾸거나 명시해 표현할 수 있다. SQL 질의는 데이터를 검색할 때, “어떻게” 가 아닌 “어떤” 데이터를 검색하기 원하는지 기술하기 때문에 비절차적(non-procedural) 이고, 선언적(declarative) 이다. 📦 SQL 집합 연산자 SQL은 중복된 튜플을 제거하지 않는다. 중복 제거는 비용이 많이 든다. 사용자가 쿼리 결과에서 중복 튜플을 보기 원할 수도 있다. 집계 함수(sum, avg, max, distinct, …)를 사용할 때 대부분 중복 제거를 원하지 않는다. 중복 제거를 원한다면 다음과 같이 를 사용할 수 있다. Set 연산자 UNION (…

March 16, 2022
Database
[BOJ] 17136번: 색종이 붙이기 (Python)

문제 https://www.acmicpc.net/problem/17136 <그림 1>과 같이 정사각형 모양을 한 다섯 종류의 색종이가 있다. 색종이의 크기는 1×1, 2×2, 3×3, 4×4, 5×5로 총 다섯 종류가 있으며, 각 종류의 색종이는 5개씩 가지고 있다. 색종이를 크기가 10×10인 종이 위에 붙이려고 한다. 종이는 1×1 크기의 칸으로 나누어져 있으며, 각각의 칸에는 0 또는 1이 적혀 있다. 1이 적힌 칸은 모두 색종이로 덮여져야 한다. 색종이를 붙일 때는 종이의 경계 밖으로 나가서는 안되고, 겹쳐도 안 된다. 또, 칸의 경계와 일치하게 붙여야 한다. 0이 적힌 칸에는 색종이가 있으면 안 된다. 종이가 주어졌을 때, 1이 적힌 모든 칸을 붙이는데 필요한 색종이의 최소 개수를 구해보자. 입력 총 10개의 줄에 종이의 각 칸에 적힌 수가 주어진다. 출력 모든 1을 덮는데 필요한 색종이의 최소 개수를 출력한다. 1을 모두 덮는 것이 불가능한 경우에는 -1을 출력한다. …

March 15, 2022
Algorithm
[BOJ] 16637번: 괄호 추가하기 (Python)

문제 https://www.acmicpc.net/problem/16637 길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순서대로 계산해야 한다. 예를 들어, 3+8×7-9×2의 결과는 136이다. 수식에 괄호를 추가하면, 괄호 안에 들어있는 식은 먼저 계산해야 한다. 단, 괄호 안에는 연산자가 하나만 들어 있어야 한다. 예를 들어, 3+8×7-9×2에 괄호를 3+(8×7)-(9×2)와 같이 추가했으면, 식의 결과는 41이 된다. 하지만, 중첩된 괄호는 사용할 수 없다. 즉, 3+((8×7)-9)×2, 3+((8×7)-(9×2))은 모두 괄호 안에 괄호가 있기 때문에, 올바른 식이 아니다. 수식이 주어졌을 때, 괄호를 적절히 추가해 만들 수 있는 식의 결과의 최댓값을 구하는 프로그램을 작성하시오. 추가하는 괄호 개수의 제한은 없으며, …

March 06, 2022
Algorithm
[BOJ] 17135번: 캐슬 디펜스 (Python)

문제 https://www.acmicpc.net/problem/17135 캐슬 디펜스는 성을 향해 몰려오는 적을 잡는 턴 방식의 게임이다. 게임이 진행되는 곳은 크기가 N×M인 격자판으로 나타낼 수 있다. 격자판은 1×1 크기의 칸으로 나누어져 있고, 각 칸에 포함된 적의 수는 최대 하나이다. 격자판의 N번행의 바로 아래(N+1번 행)의 모든 칸에는 성이 있다. 성을 적에게서 지키기 위해 궁수 3명을 배치하려고 한다. 궁수는 성이 있는 칸에 배치할 수 있고, 하나의 칸에는 최대 1명의 궁수만 있을 수 있다. 각각의 턴마다 궁수는 적 하나를 공격할 수 있고, 모든 궁수는 동시에 공격한다. 궁수가 공격하는 적은 거리가 D이하인 적 중에서 가장 가까운 적이고, 그러한 적이 여럿일 경우에는 가장 왼쪽에 있는 적을 공격한다. 같은 적이 여러 궁수에게 공격당할 수 있다. 공격받은 적은 게임에서 제외된다. 궁수의 공격이 끝나면, 적이 이동한다. 적은 아래로 한 칸 이동하며, 성이 있는 칸으로 …

March 02, 2022
Algorithm
[BOJ] 17406번: 배열 돌리기 4 (Python)

문제 https://www.acmicpc.net/problem/2252 크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의 값은 4이다. 배열은 회전 연산을 수행할 수 있다. 회전 연산은 세 정수 (r, c, s)로 이루어져 있고, 가장 왼쪽 윗 칸이 (r-s, c-s), 가장 오른쪽 아랫 칸이 (r+s, c+s)인 정사각형을 시계 방향으로 한 칸씩 돌린다는 의미이다. 배열의 칸 (r, c)는 r행 c열을 의미한다. 예를 들어, 배열 A의 크기가 6×6이고, 회전 연산이 (3, 4, 2)인 경우에는 아래 그림과 같이 회전하게 된다. 회전 연산이 두 개 이상이면, 연산을 수행한 순서에 따라 최종 배열이 다르다. 다음은 배열 A의 크기가 5×6이고, 회전 연산이 (3, 4, 2), (4, 2, 1)인 경우의 예시이다. …

February 25, 2022
Algorithm
[BOJ] 17281번: ⚾ (Python)

문제 https://www.acmicpc.net/problem/17281 ⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종료되고, 두 팀이 공격과 수비를 서로 바꾼다. 두 팀은 경기가 시작하기 전까지 타순(타자가 타석에 서는 순서)을 정해야 하고, 경기 중에는 타순을 변경할 수 없다. 9번 타자까지 공을 쳤는데 3아웃이 발생하지 않은 상태면 이닝은 끝나지 않고, 1번 타자가 다시 타석에 선다. 타순은 이닝이 변경되어도 순서를 유지해야 한다. 예를 들어, 2이닝에 6번 타자가 마지막 타자였다면, 3이닝은 7번 타자부터 타석에 선다. 공격은 투수가 던진 공을 타석에 있는 타자가 치는 것이다. 공격 팀의 선수가 1루, 2루, 3루를 거쳐서 홈에 도착하면 1점을 득점한다. 타자가 홈에 도착하지 못하고 1루, 2루, 3루 중 하나에 머물러있을 수 있…

February 22, 2022
Algorithm
[BOJ] 1005번: ACM Craft (Python)

문제 https://www.acmicpc.net/problem/1005 서기 2012년! 드디어 2년간 수많은 국민들을 기다리게 한 게임 ACM Craft (Association of Construction Manager Craft)가 발매되었다. 이 게임은 지금까지 나온 게임들과는 다르게 ACM크래프트는 다이나믹한 게임 진행을 위해 건물을 짓는 순서가 정해져 있지 않다. 즉, 첫 번째 게임과 두 번째 게임이 건물을 짓는 순서가 다를 수도 있다. 매 게임시작 시 건물을 짓는 순서가 주어진다. 또한 모든 건물은 각각 건설을 시작하여 완성이 될 때까지 Delay가 존재한다. 위의 예시를 보자. 이번 게임에서는 다음과 같이 건설 순서 규칙이 주어졌다. 1번 건물의 건설이 완료된다면 2번과 3번의 건설을 시작할수 있다. (동시에 진행이 가능하다) 그리고 4번 건물을 짓기 위해서는 2번과 3번 건물이 모두 건설 완료되어야지만 4번건물의 건설을 시작할수 있다. 따라서 4번건물의 건설을 완료…

February 10, 2022
Algorithm
[BOJ] 1516번: 게임 개발 (Python)

문제 https://www.acmicpc.net/problem/1516 숌 회사에서 이번에 새로운 전략 시뮬레이션 게임 세준 크래프트를 개발하기로 하였다. 핵심적인 부분은 개발이 끝난 상태고, 종족별 균형과 전체 게임 시간 등을 조절하는 부분만 남아 있었다. 게임 플레이에 들어가는 시간은 상황에 따라 다를 수 있기 때문에, 모든 건물을 짓는데 걸리는 최소의 시간을 이용하여 근사하기로 하였다. 물론, 어떤 건물을 짓기 위해서 다른 건물을 먼저 지어야 할 수도 있기 때문에 문제가 단순하지만은 않을 수도 있다. 예를 들면 스타크래프트에서 벙커를 짓기 위해서는 배럭을 먼저 지어야 하기 때문에, 배럭을 먼저 지은 뒤 벙커를 지어야 한다. 여러 개의 건물을 동시에 지을 수 있다. 편의상 자원은 무한히 많이 가지고 있고, 건물을 짓는 명령을 내리기까지는 시간이 걸리지 않는다고 가정하자. 입력 첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데…

February 06, 2022
Algorithm
[BOJ] 3665번: 최종 순위 (Python)

문제 https://www.acmicpc.net/problem/3665 올해 ACM-ICPC 대전 인터넷 예선에는 총 n개의 팀이 참가했다. 팀은 1번부터 n번까지 번호가 매겨져 있다. 놀랍게도 올해 참가하는 팀은 작년에 참가했던 팀과 동일하다. 올해는 인터넷 예선 본부에서는 최종 순위를 발표하지 않기로 했다. 그 대신에 작년에 비해서 상대적인 순위가 바뀐 팀의 목록만 발표하려고 한다. (작년에는 순위를 발표했다) 예를 들어, 작년에 팀 13이 팀 6 보다 순위가 높았는데, 올해 팀 6이 팀 13보다 순위가 높다면, (6, 13)을 발표할 것이다. 창영이는 이 정보만을 가지고 올해 최종 순위를 만들어보려고 한다. 작년 순위와 상대적인 순위가 바뀐 모든 팀의 목록이 주어졌을 때, 올해 순위를 만드는 프로그램을 작성하시오. 하지만, 본부에서 발표한 정보를 가지고 확실한 올해 순위를 만들 수 없는 경우가 있을 수도 있고, 일관성이 없는 잘못된 정보일 수도 있다. 이 두 경우도 모두 찾아…

February 06, 2022
Algorithm
[일상] 설

새해가 밝았습니다! 22년이 된 지는 한달이 넘었지만 이제 설도 지났겠다 오랜만에 근황 한번 올려봅니다. 22년 되고 1월 한달은 개인적으로 정말 마음에 드는 한달이었네요. 아직 어떤 분야로 가야 될지 못정하고 있었는데 일단 백엔드도 공부해보자 마음먹고 스프링 공부를 시작했고, 친구들이랑 이라는 책을 가지고 스터디도 시작했고, 예전부터 하던 알고 스터디도 계속 진행하면서 술도 꾸준히 마셔주는 아주 밸런스 있는 한달이었습니다. 1박2일로 아주 잠깐 갔다온 홍천 비발디파크. 홍천은 내가 없어도 잘 살고 있었고, 전부 다는 못갔지만 그래도 4년만에 슼기 모임 닉값 할 수 있었던 이틀이었네요. 다음에 다 같이 가면 그 때는 금잔디 별명 지울 예정ㅎ.. 공부도 공부지만 노는 것도 중요하다는 주의여서 아마 앞으로도 공부만 하면서 살진 않고, 밸런스 있게 놀 땐 놀면서 지낼 예정입니다. 물론 가면 갈수록 노는 비중은 줄여나가겠죠^^.. 이렇게 할 수 있는 것도 주변에 같이 놀아주는 친구들이…

February 03, 2022
일상
[BOJ] 2623번: 음악프로그램 (Python)

문제 https://www.acmicpc.net/problem/2623 인터넷 방송 KOI(Korea Open Internet)의 음악 프로그램 PD인 남일이는 자기가 맡은 프로그램 ‘뮤직 KOI’에서 가수의 출연 순서를 정하는 일을 매우 골치 아파한다. 순서를 정하기 위해서는 많은 조건을 따져야 한다. 그래서 오늘 출연 예정인 여섯 팀의 가수에 대해서 남일이가 보조 PD 세 명에게 각자 담당한 가수의 출연 순서를 정해오게 하였다. 보조 PD들이 가져온 것은 아래와 같다. 1 4 3 6 2 5 4 2 3 첫 번째 보조 PD는 1번 가수가 먼저, 다음에 4번 가수, 다음에 3번 가수가 출연하기로 순서를 정했다. 두 번째 보조 PD는 6번, 2번, 5번, 4번 순으로 자기 담당 가수들의 순서를 정했다. 한 가수를 여러 보조 PD가 담당할 수도 있다. 마지막으로, 세 번째 보조 PD는 2번 먼저, 다음에 3번으로 정했다. 남일이가 할 일은 이 순서들을 모아서 전체 가수의 순서를 정하는 …

February 02, 2022
Algorithm
[BOJ] 1766번: 문제집 (Python)

문제 https://www.acmicpc.net/problem/1766 민오는 1번부터 N번까지 총 N개의 문제로 되어 있는 문제집을 풀려고 한다. 문제는 난이도 순서로 출제되어 있다. 즉 1번 문제가 가장 쉬운 문제이고 N번 문제가 가장 어려운 문제가 된다. 어떤 문제부터 풀까 고민하면서 문제를 훑어보던 민오는, 몇몇 문제들 사이에는 ‘먼저 푸는 것이 좋은 문제’가 있다는 것을 알게 되었다. 예를 들어 1번 문제를 풀고 나면 4번 문제가 쉽게 풀린다거나 하는 식이다. 민오는 다음의 세 가지 조건에 따라 문제를 풀 순서를 정하기로 하였다. N개의 문제는 모두 풀어야 한다. 먼저 푸는 것이 좋은 문제가 있는 문제는, 먼저 푸는 것이 좋은 문제를 반드시 먼저 풀어야 한다. 가능하면 쉬운 문제부터 풀어야 한다. 예를 들어서 네 개의 문제가 있다고 하자. 4번 문제는 2번 문제보다 먼저 푸는 것이 좋고, 3번 문제는 1번 문제보다 먼저 푸는 것이 좋다고 하자. 만일 4-3-2-1의 순서로…

February 02, 2022
Algorithm
[BOJ] 2252번: 줄 세우기 (Python)

문제 https://www.acmicpc.net/problem/2252 N명의 학생들을 키 순서대로 줄을 세우려고 한다. 각 학생의 키를 직접 재서 정렬하면 간단하겠지만, 마땅한 방법이 없어서 두 학생의 키를 비교하는 방법을 사용하기로 하였다. 그나마도 모든 학생들을 다 비교해 본 것이 아니고, 일부 학생들의 키만을 비교해 보았다. 일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 작성하시오. 입력 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이다. 학생들의 번호는 1번부터 N번이다. 출력 첫째 줄에 학생들을 키 순서대로 줄을 세운 결과를 출력한다. 답이 여러 가지인 경우에는 아무거나 출력한다. 🔍 Algorithm 위상 정렬 💻 Logic 위상 정렬 함수 진입 차수()…

January 30, 2022
Algorithm
[BOJ] 20057번: 마법사 상어와 토네이도 (Python)

문제 https://www.acmicpc.net/problem/20057 마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을 의미한다. 토네이도를 시전하면 격자의 가운데 칸부터 토네이도의 이동이 시작된다. 토네이도는 한 번에 한 칸 이동한다. 다음은 N = 7인 경우 토네이도의 이동이다. 토네이도가 한 칸 이동할 때마다 모래는 다음과 같이 일정한 비율로 흩날리게 된다. 토네이도가 x에서 y로 이동하면, y의 모든 모래가 비율과 α가 적혀있는 칸으로 이동한다. 비율이 적혀있는 칸으로 이동하는 모래의 양은 y에 있는 모래의 해당 비율만큼이고, 계산에서 소수점 아래는 버린다. α로 이동하는 모래의 양은 비율이 적혀있는 칸으로 이동하지 않은 남은 모래의 양과 같다. 모래가 이미 있는 칸으로 모래가 이동하면, 모래의 양은 더해진다…

January 23, 2022
Algorithm
[BOJ] 20056번: 마법사 상어와 파이어볼 (Python)

문제 https://www.acmicpc.net/problem/20056 어른 상어가 마법사가 되었고, 파이어볼을 배웠다. 마법사 상어가 크기가 N×N인 격자에 파이어볼 M개를 발사했다. 가장 처음에 파이어볼은 각자 위치에서 이동을 대기하고 있다. i번 파이어볼의 위치는 (ri, ci), 질량은 mi이고, 방향은 di, 속력은 si이다. 위치 (r, c)는 r행 c열을 의미한다. 격자의 행과 열은 1번부터 N번까지 번호가 매겨져 있고, 1번 행은 N번과 연결되어 있고, 1번 열은 N번 열과 연결되어 있다. 파이어볼의 방향은 어떤 칸과 인접한 8개의 칸의 방향을 의미하며, 정수로는 다음과 같다. 마법사 상어가 모든 파이어볼에게 이동을 명령하면 다음이 일들이 일어난다. 모든 파이어볼이 자신의 방향 di로 속력 si칸 만큼 이동한다. 이동하는 중에는 같은 칸에 여러 개의 파이어볼이 있을 수도 있다. 이동이 모두 끝난 뒤, 2개 이상의 파이어볼이 있는 칸에서는 다음과 같은 일이 일어난다…

January 19, 2022
Algorithm
[BOJ] 19237번: 어른 상어 (Python)

문제 https://www.acmicpc.net/problem/19237 청소년 상어는 더욱 자라 어른 상어가 되었다. 상어가 사는 공간에 더 이상 물고기는 오지 않고 다른 상어들만이 남아있다. 상어에는 1 이상 M 이하의 자연수 번호가 붙어 있고, 모든 번호는 서로 다르다. 상어들은 영역을 사수하기 위해 다른 상어들을 쫓아내려고 하는데, 1의 번호를 가진 어른 상어는 가장 강력해서 나머지 모두를 쫓아낼 수 있다. N×N 크기의 격자 중 M개의 칸에 상어가 한 마리씩 들어 있다. 맨 처음에는 모든 상어가 자신의 위치에 자신의 냄새를 뿌린다. 그 후 1초마다 모든 상어가 동시에 상하좌우로 인접한 칸 중 하나로 이동하고, 자신의 냄새를 그 칸에 뿌린다. 냄새는 상어가 k번 이동하고 나면 사라진다. 각 상어가 이동 방향을 결정할 때는, 먼저 인접한 칸 중 아무 냄새가 없는 칸의 방향으로 잡는다. 그런 칸이 없으면 자신의 냄새가 있는 칸의 방향으로 잡는다. 이때 가능한 칸이 여러 개일 수…

January 16, 2022
Algorithm
[BOJ] 19236번: 청소년 상어 (Python)

문제 https://www.acmicpc.net/problem/19236 아기 상어가 성장해 청소년 상어가 되었다. 4×4크기의 공간이 있고, 크기가 1×1인 정사각형 칸으로 나누어져 있다. 공간의 각 칸은 (x, y)와 같이 표현하며, x는 행의 번호, y는 열의 번호이다. 한 칸에는 물고기가 한 마리 존재한다. 각 물고기는 번호와 방향을 가지고 있다. 번호는 1보다 크거나 같고, 16보다 작거나 같은 자연수이며, 두 물고기가 같은 번호를 갖는 경우는 없다. 방향은 8가지 방향(상하좌우, 대각선) 중 하나이다. 오늘은 청소년 상어가 이 공간에 들어가 물고기를 먹으려고 한다. 청소년 상어는 (0, 0)에 있는 물고기를 먹고, (0, 0)에 들어가게 된다. 상어의 방향은 (0, 0)에 있던 물고기의 방향과 같다. 이후 물고기가 이동한다. 물고기는 번호가 작은 물고기부터 순서대로 이동한다. 물고기는 한 칸을 이동할 수 있고, 이동할 수 있는 칸은 빈 칸과 다른 물고기가 있는 칸, 이동…

January 12, 2022
Algorithm
[BOJ] 17140번: 이차원 배열과 연산 (Python)

문제 https://www.acmicpc.net/problem/17140 크기가 3×3인 배열 A가 있다. 배열의 인덱스는 1부터 시작한다. 1초가 지날때마다 배열에 연산이 적용된다. R 연산: 배열 A의 모든 행에 대해서 정렬을 수행한다. 행의 개수 ≥ 열의 개수인 경우에 적용된다. C 연산: 배열 A의 모든 열에 대해서 정렬을 수행한다. 행의 개수 < 열의 개수인 경우에 적용된다. 한 행 또는 열에 있는 수를 정렬하려면, 각각의 수가 몇 번 나왔는지 알아야 한다. 그 다음, 수의 등장 횟수가 커지는 순으로, 그러한 것이 여러가지면 수가 커지는 순으로 정렬한다. 그 다음에는 배열 A에 정렬된 결과를 다시 넣어야 한다. 정렬된 결과를 배열에 넣을 때는, 수와 등장 횟수를 모두 넣으며, 순서는 수가 먼저이다. 예를 들어, [3, 1, 1]에는 3이 1번, 1가 2번 등장한다. 따라서, 정렬된 결과는 [3, 1, 1, 2]가 된다. 다시 이 배열에는 3이 1번, 1이 2번, 2가 1번…

January 08, 2022
Algorithm
[BOJ] 17144번: 미세먼지 안녕! (Python)

문제 https://www.acmicpc.net/problem/17144 미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 1번 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼지가 있고, (r, c)에 있는 미세먼지의 양은 Ar,c이다. 1초 동안 아래 적힌 일이 순서대로 일어난다. 미세먼지가 확산된다. 확산은 미세먼지가 있는 모든 칸에서 동시에 일어난다. (r, c)에 있는 미세먼지는 인접한 네 방향으로 확산된다. 인접한 방향에 공기청정기가 있거나, 칸이 없으면 그 방향으로는 확산이 일어나지 않는다. 확산되는 양은 Ar,c/5이…

January 08, 2022
Algorithm
[BOJ] 15685번: 드래곤 커브 (Python)

문제 https://www.acmicpc.net/problem/15685 드래곤 커브는 다음과 같은 세 가지 속성으로 이루어져 있으며, 이차원 좌표 평면 위에서 정의된다. 좌표 평면의 x축은 → 방향, y축은 ↓ 방향이다. 시작 점 시작 방향 세대 0세대 드래곤 커브는 아래 그림과 같은 길이가 1인 선분이다. 아래 그림은 (0, 0)에서 시작하고, 시작 방향은 오른쪽인 0세대 드래곤 커브이다. 1세대 드래곤 커브는 0세대 드래곤 커브를 끝 점을 기준으로 시계 방향으로 90도 회전시킨 다음 0세대 드래곤 커브의 끝 점에 붙인 것이다. 끝 점이란 시작 점에서 선분을 타고 이동했을 때, 가장 먼 거리에 있는 점을 의미한다. 2세대 드래곤 커브도 1세대를 만든 방법을 이용해서 만들 수 있다. (파란색 선분은 새로 추가된 선분을 나타낸다) 3세대 드래곤 커브도 2세대 드래곤 커브를 이용해 만들 수 있다. 아래 그림은 3세대 드래곤 커브이다. 즉, K(K > 1)세대 드래곤 커브는 K…

January 03, 2022
Algorithm
[BOJ] 14499번: 주사위 굴리기 (Python)

문제 https://www.acmicpc.net/problem/14499 크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 이 지도의 위에 주사위가 하나 놓여져 있으며, 주사위의 전개도는 아래와 같다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며, 놓여져 있는 곳의 좌표는 (x, y) 이다. 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다. 지도의 각 칸에는 정수가 하나씩 쓰여져 있다. 주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다. 주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위가 이동했을 때 마다 상단에 쓰여 …

January 01, 2022
Algorithm
[BOJ] 3190번: 뱀 (Python)

문제 https://www.acmicpc.net/problem/3190 ‘Dummy’ 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다. - 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다. - 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다. - 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다. 사과의 위치와 뱀의 이동경로가 주어질 때 이 게임이 몇 초에 끝나는지 계산하라. 입력 첫째 줄에 보…

December 29, 2021
Algorithm
[BOJ] 14503번: 로봇 청소기 (Python)

문제 https://www.acmicpc.net/problem/14503 로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음과 같이 작동한다. 현재 위치를 청소한다. 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 인접한 칸을 탐색한다. a. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다. b. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다. c. 네 방향 모두 청소가 이미 되…

December 28, 2021
Algorithm
[BOJ] 17779번: 게리맨더링 2 (Python)

문제 https://www.acmicpc.net/problem/17779 재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름도 재현시로 변경했다. 이번 선거에서는 최대한 공평하게 선거구를 획정하려고 한다. 재현시는 크기가 N×N인 격자로 나타낼 수 있다. 격자의 각 칸은 구역을 의미하고, r행 c열에 있는 구역은 (r, c)로 나타낼 수 있다. 구역을 다섯 개의 선거구로 나눠야 하고, 각 구역은 다섯 선거구 중 하나에 포함되어야 한다. 선거구는 구역을 적어도 하나 포함해야 하고, 한 선거구에 포함되어 있는 구역은 모두 연결되어 있어야 한다. 구역 A에서 인접한 구역을 통해서 구역 B로 갈 수 있을 때, 두 구역은 연결되어 있다고 한다. 중간에 통하는 인접한 구역은 0개 이상이어야 하고, 모두 같은 선거구에 포함된 구역이어야 한다. 선거구를 나누는 방법은…

December 28, 2021
Algorithm
[Database] SQL 기초

📃 SQL Schema & Catalog SQL Schema 데이터베이스라고도 불리며, 같은 데이터베이스에 속해 있는 테이블과 다른 구조들을 그룹짓는 개념이다. Schema name으로 구별된다. 스키마를 소유하는 사용자를 나타내는 authorization identifier와 스키마에 있는 각각 element의 descriptor를 포함한다. Schema element는 table, constraints, views, domains 등을 포함한다. Catalog 스키마의 모임으로, 라고 불리는 특별한 스키마를 항상 가지고 있다. Integrity constraints는 같은 catalog의 스키마들 사이에서만 정의될 수 있다. 같은 catalog에 있는 스키마들은 type/domain과 같은 특정 element를 공유할 수 있다. 📚 CREATE TABLE 새로운 relation R을 정의한다. R에 이름을 주고나서, R의 attributes와 types(domains), 초기…

December 08, 2021
Database
[Database] ER-to-Relational Mapping

🗺 ER-to-Relational Mapping Goals 모든 정보를 보존 최대한 가능한 만큼 제약조건들을 유지 NULL 값들을 최소화 Step 1. Regular Entity Types 기존 엔터티의 attribute를 전부 포함하고, key attributes 중에서 하나를 골라 Primary key로 정한다. 만약, 고른 key가 composite이면 해당하는 attribute들 모두 Primary key로 정한다. Step 2. Weak Entity Types weak 엔터티의 attribute를 전부 포함 owner 엔터티의 Primary key를 Foreign key로 가지고, owner 엔터티의 Primary key와 weak 엔터티의 Partial key를 Primary key로 가진다. Step 3. Binary 1:1 Relation Types 상황에 따라 3가지 방법으로 가능하다. 1. Foreign key approach (2 relations) 주로 한쪽이…

December 07, 2021
Database
[Database] Relational Model

🔗 Relational Model Concepts Relation 집합을 베이스로 한 수학적인 개념으로, table과 같은 역할을 한다. table처럼 여러 row와 column을 가지고 있는데 이때, row를 tuple, column을 attribute라고 부른다. relation은 튜플을 유일하게 식별할 수 있는 key를 가지고, 적합한 key가 없는 경우에는 임의의 key를 추가할 수 있는데 이것을 surrogate key(or artificial key) 라고 부른다. Schema R : relation 이름 A_1, A_2, … , A_n : attribute 리스트 degree of relation R : R의 attribute 수 Tuple 값들이 정렬된 집합으로 <…> 내부에 표현된다. 튜플의 값들은 알맞은 domain으로부터 나와야 한다. attribute의 순서는 무조건 지켜져야 하지만, tuple의 순서는 중요하지 않다. tuple의 모든 값들은 atomic …

December 07, 2021
Database
[Database] Entity-Relationship(ER) Model

🎞 Database Design Process 1. 요구사항 수집 및 분석 2. Conceptual Design 3. Logical Design(or Data model mapping 4. Physical Design 💁‍♀️ Entity-Relationship(ER) model 데이터를 Entity, Relationship, Attribute 로 표현 Entity ER model의 기본 컨셉으로, 구체적인 객체를 의미한다. Entity Type : 비슷한 속성을 가진 entity의 타입 (schema 같은 느낌) ex) EMPLOYEE, COMPANY Weak Entity Type 자기 자신을 위한 key attribute를 갖지 않는 entity type으로 항상 total participation을 맺음 ( ER diagram에서 네모 두 개로 표현 ) partial key : weak entity를 식별할 수 있는 attribute로, owner entity type의 key와 …

December 07, 2021
Database
[Database] Data Model & Schema

Data Model 데이터 추상화를 달성하기 위해 필요한 수단 제공 데이터베이스의 구조(data types, relationships), 이런 구조를 조작하기 위한 연산, 데이터베이스가 가져야 할 제약조건의 집합으로 구성 📚 Data Model 종류 Conceptual data models 다수의 사용자가 데이터를 인식하는 방법과 비슷하게 개념(entity, attribute, relationship 등)을 제공 entity-based or object-based data model이라고도 불림 (ER model) high-level, semantic Physical data models 데이터가 컴퓨터 저장매체에 어떻게 저장되는지에 관한 자세한 정보들을 제공 low-level, internal Implementation data models 개념적 모델을 컴퓨터가 처리할 수 있도록 변환 관계형데이터모델, 네트워크/계층 모델 등이 있음 representational, logical…

December 06, 2021
Database
[Database] DB? DBMS??

DB(database) : 서로 관계있는 데이터들의 집합 DBMS : Database Management System으로 데이터베이스를 만들고 관리할 수 있도록 하는 소프트웨어 / 시스템 💡 DB를 사용하는 이유? 1. Queries (질의) 파일 기반 시스템에서는 자신이 원하는 데이터를 조회하기에 한계가 있다. 하지만 DBMS에서는 DML(Data Manipulation Language) 을 이용해 쉽게 데이터를 조회할 수 있고, Schema를 이용해 데이터 구조(Schema)와 데이터를 분리할 수 있다. DML 종류 High-level or non-procedural languages (ex. SQL) 어떻게 검색할지(how)가 아닌 어떤 데이터를 검색할지(what)을 명시함 -> declarative 레코드 집합으로 검색하고 나서, 이를 하나하나씩 처리 set-at-a-time or set-oriented DML이라고도 불림 Low-level or procedural Lang…

December 06, 2021
Database
[일상] 시작!

드디어..! 블로그 시작하기로 했습니다. 사실 이전에 velog에도 시험 공부하면서 몇 개 정리해두긴 했지만 별로 많이 하진 않았고, 이후에 올해 여름부터 gatsby를 이용해서 제대로 된 블로그를 만드려고 했었지만 디자인부터 다 하려니 막막해서 하다가 그만뒀었습니다..ㅎ 그러다가 갑자기 이번 기말 시험 공부는 어디에 정리할까 고민하다 다시 블로그를 만들어볼까 생각했고, 괜찮은 gatsby 테마를 찾아서 바로 만들어버렸네요. 제주도 갔다와서 조금 변화가 있었던 것 같기도 하고 그냥 시험기간이어서 바로 만들었지 않을까 ^^,, 아무래도 테마없이 노베이스에서 디자인부터 하다가 포기하는 것보다는 괜찮은 테마 골라서 내 입맛대로 바꾸는게 훨씬 도움되는 듯. 일단 블로그는 기술 블로그긴 하지만 이렇게 일상 관련 두서없는 포스트들도 올릴 생각이다. 물론 내 성격상 거의 안올릴 듯 하지만,, 이번 학기 마지막 기말 시험들 디비나 기학개, 데통 등 정리 글들 먼저 올리고 나서 종강하고 이전에 …

December 06, 2021
일상