Kotlin166 [토이프로젝트] KBO 경기 일정 수집하기(3) - 멀티 스레드 기반의 경기 정보 병렬 수집 목차/pages/KBO-경기-일정-수집하기-시리즈병렬 프로세스 생각한 계기KBO 공식 사이트 경기 일정 페이지의 특성 상 한 번에 1개의 시리즈의 한달치 경기 일정만 조회할 수 있습니다. 즉, 1년 전체 일정을 수집하려면 시범경기, 정규시즌, 포스트시즌 각각 1월부터 12월까지 총 36번의 요청이 필요한 것이죠. 이 요청을 동기 방식으로 처리한다면 이전 요청이 끝나야 다음 요청이 실행되기 때문에 36번의 요청을 모두 처리하기 까지 시간이 꽤 많이 걸립니다. 그렇다보니 비동기 요청으로 요청 시간을 줄이면 어떨까 하는 생각이 든거죠. 물론 시범경기는 보통 3월 한달만 진행되고 포스트시즌은 정규시즌이 끝난 후 약 한달 정도만 진행되는 만큼 엄격히 따지면 요청 횟수를 줄일 수 있긴 합니다. 그래도 우선은 코드 .. 2025. 12. 9. [토이프로젝트] KBO 경기 일정 수집하기(2) - Upsert를 통한 중복 데이터 처리 목차/pages/KBO-경기-일정-수집하기-시리즈Upsert의 필요성1편에서 경기 정보를 수집하고 DB에 저장했지만 경기 정보는 매일매일 바뀌게됩니다. 시즌 초에 전체 일정이 나오지만 매일 경기를 진행하면서 경기 정보는 수시로 바뀝니다. 게다가 날씨에 따라 취소 경기가 발생하여 더블헤더 경기가 편성되거나 추후 잔여경기 일정으로 편성될 수도 있죠. 따라서 수집된 경기 목록 중에서 DB에 저장된 경기는 업데이트하고 새로운 경기만 저장하는 Upsert 전략이 필요합니다.Upsert 전략을 구성하자!우선 어떻게 Upsert 전략을 구성할지 생각해봤습니다. KBO 웹사이트에서 경기 정보를 수집하여 파싱하면 경기 정보 엔티티 객체가 모인 리스트가 생성됩니다. 이 경기 정보 객체들과 중복되는 레코드가 DB에 저장되어.. 2025. 12. 1. [토이프로젝트] KBO 경기 일정 수집하기(1) - 데이터 크롤링과 파싱(With 스프링부트 + Playwright) 목차/pages/KBO-경기-일정-수집하기-시리즈계기평소에 야구를 좋아하다 보니 경기 일정이나 결과를 데이터로 뭔가 해보면 어떨까 하는 생각이 들었습니다. 당장 데이터로 뭘 할지는 생각해보지 않았지만 그래도 일단 데이터를 수집해두면 뭐라도 하지 않을까 싶어 내친김에 시도해봤습니다. 처음에는 개발자 센터 같은곳에서 제공하는 API가 있나 찾아봤는데 아무래도 KBO는 개발자 센터나 오픈 API를 제공하지 않는 모양이더라구요. 그래서 KBO 공식 사이트를 크롤링하여 데이터를 수집해봐겠다는 생각을 하게 됐습니다.robots.txt 정책 확인 하기특정 웹사이트를 크롤링하려면 먼저 해당 사이트의 robots.txt 파일을 확인해서 크롤링을 허용하거나 허용하지 않는 경로를 확인해야 한다고 합니다. 물론 robots... 2025. 11. 25. [Kotlin] Kotest를 사용해서 코틀린스러운 테스트 코드를 작성해보자! 목차들어가기 전에보통 자바 + 스프링 환경에서 테스트 코드를 작성할 때는 JUnit을 많이 사용합니다. 스프링부트에서 기본적으로 제공하는 테스트 프레임워크가 JUnit이기도 하고, 오랫동안 사용되다 보니 레퍼런스도 풍부해서 자연스럽게 JUnit을 사용해서 테스트 코드를 작성하는 경우가 많죠. 코틀린을 사용할 때는 코틀린에 특화된 테스트 프레임워크인 Kotest를 사용할 수도 있습니다. Kotest는 더 직관적이고 코틀린스러운 테스트 코드를 작성할 수 있다는 장점이 있죠. 이번 글에서는 Kotest에 대해 정리하겠습니다.Kotest?Kotest는 JUnit을 환경에서 실행되는, 코틀린에 특화된 테스트 프레임워크입니다. 코틀린 전용의 JUnit 확장판이라고도 볼 수 있죠. JUnit과는 달리 어노테이션을 사.. 2025. 7. 7. [Kotlin] 백준 31863 : 내진 설계 문제 링크 : https://www.acmicpc.net/problem/31863문제 해설최초 본진 발생 후 연쇄적으로 여진이 발생합니다. 지진이 끝났을 때 무너진 건물의 개수와 무너지지 않은 건물의 개수를 구해야 합니다. 건물이 파괴되면 새로운 여진이 발생하고 여진까지 모두 끝나야 지진이 끝난다는 점에서 최초 진원지와 건물이 파괴된 좌표들을 저장할 덱을 선언합니다. 그리고 입력에서 진원지의 좌표를 찾아 덱에 저장해줍니다. 그리고 건물의 내구도가 1과 2로 나눠져있기 때문에 각 좌표에 있는 건물의 내구도를 저장할 2차원 배열을 선언해줍니다.val epicenter = ArrayDeque>()val durability = Array(n) { IntArray(m) }var buildingCount = 0va.. 2025. 1. 6. [Kotlin] 백준 22941 : RPG 마스터 오명진 문제 링크 : https://www.acmicpc.net/problem/22941문제 해설주어진 조건에 따라 용사의 승리 여부를 시뮬레이션해야 합니다. 다만 시간 제한이 0.3초밖에 안되고 공격력은 최소가 \(1\)인 반면 HP는 최대 \(2^{31}-1\)이기 때문에 최악의 경우라면 \((2^{31} - 1)\times 2\)번의 연산을 수행해야 해서 시간 초과가 발생합니다. 하지만 문제에서 요구하는 답을 구하려면 용사가 쓰러지기 전에 마왕이 먼저 쓰러지는지의 여부만 확인하면 되기 때문에 단순 수학 계산만으로도 판별할 수 있습니다. 우선 마왕을 쓰러트리기 위해 필요한 용사의 공격 횟수를 구해서 소수점 이하는 올림처리 해줍니다.braveAttackCount = (devilHp + braveAtk - 1).. 2024. 11. 20. [Kotlin] 백준 30704 : 정사각형 연결하기 문제 링크 : https://www.acmicpc.net/problem/30704문제 해설한 변의 길이가 1인 정사각형을 겹치지 않게 나란히 붙여서 둘레가 최소가 되는 다각형을 만들어야 합니다. 격자 형태의 공간에서 한 변의 길이가 1인 정사각형을 배치해서 도형을 만든다는 점에서 이 문제는 넓이가 \(N\)인 다각형 중에서 둘레가 가장 작은 다각형의 둘레를 구하는 것과 같다는 것을 알 수 있습니다. 우선 둘레를 구하기 전에 다각형이 정사각형 또는 직사각형이 아닌 경우에 대해 한번 보겠습니다.\(N\)이 5인 경우에는 위와 같이 정사각형들을 배치할 수 있습니다. 이 경우에 대해 둘레를 구할 때 살짝 비틀어 보면 아래와 같이 둘레가 구해지는 것을 볼 수 있습니다.직사각형에서 움푹 들어간 부분의 변을 바깥으로.. 2024. 10. 15. [Kotlin] 백준 31882 : 근수 문제 링크 : https://www.acmicpc.net/problem/31882문제 해설주어진 문자열에서 연속된 2로만 이뤄진 부분 문자열(이하 근수)들을 추출하여 점수를 구해야합니다. 근수들은 문자열 전체를 순회하면서 현재 숫자가 2라면 현재까지 구해진 부분 문자열에 2를 추가하고, 그 외의 경우에는 현재까지 구해진 부분 문자열을 리스트에 추가한 후 부분 문자열을 초기화하는 방법으로 구할 수 있습니다. 문자열을 모두 순회한 후 구해놓은 부분 문자열이 있다면 리스트에 추가해줍니다.for (num in s) { if (num == '2') { sb.append(2) continue } if (sb.isEmpty()) continue list.add(sb) .. 2024. 8. 22. 이전 1 2 3 4 ··· 21 다음