[트러블슈팅] 공백 입력 테스트코드, NoSuchElementException
·
Develop note
안녕하세요! 이번 글에서는 간단해 보였지만 예상치 못한 곳에서 발목을 잡았던 테스트 코드 트러블슈팅 과정을 공유하고자 합니다.제가 구현하려는 로직은 사용자로부터 입력받은 값이 공백일 경우 IllegalArgumentException을 발생시키는 것이었습니다. 1. 🤔 문제 발생 및 특이점발생한 문제의 코드다음은 두 번째 입력값(시도 횟수)이 빈 문자열("")일 때, 예상 예외인 IllegalArgumentException이 정상적으로 발생하는지를 확인하려던 테스트 코드입니다.@Testvoid 공백_횟수_입력2() { assertSimpleTest(() -> assertThatThrownBy(() -> runException("pobi,java", "")) .isIn..
[Java] Utility class란?
·
Develop note
java를 쓰다보면 Math 함수를 한번쯤을 써봤을겁니다 근데 이런 생각 안해보셨나요?왜 Math는 new로 객체를 만들지 않고,클래스 이름만으로 기능을 사용할 수 있지...? 우테코 프리코스 1주차를 지나오면서 코드를 뜯어보다가 Console을 utility class로 선언한 것을 발견해서, 2주차인 지금 이에 대해서 글을 작성해보려고 합니다!🤔 일반 클래스 vs 유틸리티 클래스가장 큰 차이는 객체를 만드느냐, 안 만드느냐입니다. 일반적인 클래스는 이렇게 씁니다👇Scanner sc = new Scanner(System.in);String input = sc.nextLine();즉, new 키워드로 객체를 만들어야만 그 안의 기능(nextLine)을 사용할 수 있습니다이런 클래스들은 인스턴스마다 독..
[Pattern] 예외 팩토리(Exception Factory) 패턴: 깔끔하고 유연한 예외 처리
·
Develop note
😞 내 코드 구려...코드를 작성하다 보면 필연적으로 예외(Exception) 처리를 마주하게 됩니다.그런데 new 키워드로 직접 예외를 생성하고 메시지를 일일이 작성하다 보면, 코드가 점점 복잡해지고 일관성이 깨지는 경험을 해본 적 있을 겁니다. 우테코 프리코스 1주차에 코드를 짜면서 제가 직면했던 문제인데요...new로 throw 해주고, try catch문으로 감싸고...이런 방식을 예외마다 사용해주다보니, 로직 코드인데, 코드의 절반이 try catch문으로 변하더군요... 1주차가 끝나고 나서 이를 어떻게 하면 해결할 수 있을까 찾아보다가 예외 팩토리 패턴 이라는 것을 발견해서 공유해드립니다!🤔 기본 개념: 예외 생성 맡기기예외 팩토리 패턴은 예외 객체를 생성하는 로직을 별도의 팩토리 클래스..
[Git] Git alias 설정은 어떻게 돌아가는가?
·
Develop note
Git에는 명령어 단축어를 지정하는 alias가 가능합니다.예를 들어git commit -m '커밋메시지' 이런 간단한 커밋 명령어가 있다고 해봅시다.커밋 수가 올라가다 보면 commit을 친 다음에 -를 치려고 손가락이 가는 이 동작이 매우매우 귀찮게 느껴질껍니다. 이런 귀차니즘에 찌들은 자들을 위해 alias 기능이 있습니다.alias를 설정하면 위의 커밋 명령어가 아래처럼 줄어듭니다. g cm '커밋 메세지'이를 적용하는 방법은 너무너무 잘 설명해주는 글이 있기 때문에 따로 작성하지 않겠습니다👇 적용법은 아래 글을 참고하세요!https://velog.io/@somy-john/Git-Alias-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-mac-os Git Alias 설정하기 ..
[Git] Hooks 적용으로 커밋 메세지 형식 강제하기
·
Develop note
https://velog.io/@jihwankim128/%ED%94%84%EB%A6%AC%EC%BD%94%EC%8A%A4-%EC%BB%A8%EB%B2%A4%EC%85%98-%ED%86%B5%EC%9D%BC 프리코스 컨벤션 통일프리코스는 커밋 컨벤션, 코드 컨벤션 규약이 있습니다!4.2 블럭 들여쓰기: +4 스페이스새 블록 또는 블록과 유사한 구조(block-like construct)가 열릴 때마다 들여쓰기가 네 칸씩 증가합니다. 블록이velog.io우아한 테크코스 프리코스를 진행중이신 한 분의 글을 보다가 왜 깃허브 컨벤션이 막히는걸까 싶어서 공부를 좀 해보았습니다!🤔 기본 동작 확인하기https://git-scm.com/book/ko/v2/Git%EB%A7%9E%EC%B6%A4-Git-Hooks G..
[백준 2618] 경찰차 (kotlin)
·
Algorithm
🏆 문제 난이도- Platinum IV🔗 문제 링크https://www.acmicpc.net/problem/2618📝 문제 분석 & 접근이런 유형의 문제는 단순히 현재 사건에 대해 두 경찰차 중 더 가까운 차를 보내는 탐욕적(Greedy) 접근으로는 최적의 해를 찾을 수 없습니다.왜냐하면 당장 가까운 차를 보냈을 때, 다음 사건을 처리할 때 더 큰 손해를 볼 수 있기 때문입니다.따라서 동적 계획법을 이용해야 합니다.현재의 선택이 미래의 결과에 영향을 미치므로, 과거의 상태를 기억하고 최적의 선택을 이어가는 방식을 사용해야 문제를 풀 수 있습니다.✨ 핵심 아이디어사실 아이디어 자체는 매우 단순합니다.DP 상태 정의: dp[i][j] = 경찰차 1이 마지막으로 처리한 사건이 i, 경찰차 2가 마지막으로..
[백준 7578] 공장 (Kotlin)
·
Algorithm
🏆 문제 난이도- Platinum V🔗 문제 링크https://www.acmicpc.net/problem/7578📝 문제 분석 & 접근아이디어는 간단합니다.A를 순서대로 순회하며, 같은 값을 가진 B의 index가 어딘지를 찾습니다.찾은 B index보다 뒤에 값들 중에 방문한 적이 있는지를 확인하고 전부 더합니다. (SegmentTree에서 Query 역할)방문한 적 없다면 겹치는 선이 없는 것입니다.SegmentTree Update를 통해서 방문한 노드와 해당 노드를 포함하는 노드들에 1을 더해줍니다.(새로운 노드에 방문했다는 의미로 1을 더해주는 것입니다.)2.에서 찾은 Sum 값들을 전부 더하고 출력합니다.💻 코드import java.io.StreamTokenizerlateinit var ..
[백준 13141] Ignition (Kotlin)
·
Algorithm
🏆 문제 난이도- Platinum V🔗 문제 링크https://www.acmicpc.net/problem/13141📝 문제 분석 & 접근플레 치고는 어렵지 않은 문제입니다.플로이드-와샬 알고리즘을 사용해서 모든 정점 쌍 간의 최단 거리를 구해줍니다.플로이드-와샬을 사용하는 이유는, 모든 점에서 다른 모든 점들까지의 최단거리를 모두 구해야 하기 때문입니다. 각 노드의 최단거리를 구한 다음에는 각 정점 별로 타는데 가장 오래 걸리는 시간들 중에서 가장 작은 값을 구하면 됩니다.✨ 핵심 아이디어시작점 i에서 불이 붙기 시작해서 어떤 도로 j (start, end)를 태우는 데 걸리는 시간은 maxLength = dist[i][start] + dist[i][end] + length[j]로 계산할 수 있습니..
[백준 2357] 최솟값과 최댓값 (Kotlin)
·
Algorithm
🏆 문제 난이도- Gold I🔗 문제 링크https://www.acmicpc.net/problem/2357📝 문제 분석 & 접근수열의 크기를 N, 질의의 수를 M이라고 할 때, 각 질의마다 O(N)의 시간이 걸리므로, 매번 순회하면서 최솟값과 최댓값을 찾으면 전체 시간 복잡도는 O(NM)이 될껍니다.즉, 최악의 경우 수열의 크기 최대 100,000 그리고 질의의 수 최대 100,000이므로 연산 횟수가 10^10이 될 수 있습니다.이처럼 많은 질의를 빠르게 처리해야 할 때는, 질의에 답하기 위해 미리 데이터를 가공해두는 효율적인 자료구조가 필요합니다.이 문제에 가장 적합한 자료구조는 바로 세그먼트 트리(Segment Tree)입니다 세그먼트 트리가 무엇인지는 따로 설명하지 않겠습니다만, 괜찮은 설명..
[백준 15824] 너 봄에는 캡사이신이 맛있단다 (Kotlin)
·
Algorithm
🏆 문제 난이도- Gold II🔗 문제 링크https://www.acmicpc.net/problem/15824📝 문제 분석 & 접근일단 모든 조합을 직접 만들어서 계산하는거는 불가합니다. 시간초과 이슈~따라서, 각 봉우리의 높이(값)가 전체 합에 얼마나 기여하는지를 따로 계산해서 더해주는 방식으로 접근해야 합니다.✨ 핵심 아이디어- 봉우리의 기여도 계산하기정렬된 배열에서 각 봉우리가 최대값이 되는 경우와 최소값이 되는 경우를 계산하여 전체 합에 더해줍니다.봉우리 arr[i]가 조합의 최대값이 되는 경우: arr[i]를 포함하고, arr[0]부터 arr[i-1]까지의 i개 봉우리들 중에서 나머지 봉우리를 선택해야 합니다. 즉, i개의 봉우리로 만들 수 있는 모든 조합의 수는 2^i개입니다. 따라서 a..