본문 바로가기
  • 개발하는 곰돌이

분류 전체보기202

[Kotlin] 백준 25240 : 가희와 파일 탐색기 2 문제 링크 25240번: 가희와 파일 탐색기 2 Q개의 질문에 대해, 연산이 성공하면 1을 실패하면 0을 출력해 주세요. 각 질문에 대한 답은 한 줄에 하나씩 출력해 주세요. www.acmicpc.net 문제 해설 리눅스의 파일 권한과 관련된 문제. 관련 지식이 있다면 어렵지 않게 풀 수 있다. 우선 각 권한을 2진수로 바꿔보자. \begin{align*} 000 &\to 권한 없음\\ 001 &\to 실행 가능\\ 010 &\to 수정 가능\\ 011 &\to 실행 및 수정 가능\\ 100 &\to 읽기 가능\\ 101 &\to 읽기 및 실행 가능\\ 110 &\to 읽기 및 수정 가능\\ 111 &\to 읽기, 수정, 실행 모두 가능 \end{align*} 여기서 \(2^2\)에 해당하는 비트는 읽기.. 2023. 12. 30.
[Spring Boot] @Value 대신 생성자 바인딩을 통해 프로퍼티 값을 바인딩하고 관리해보자 목차 들어가기 전에 스프링부트 프로젝트를 개발하다 보면 운영/개발 등의 환경에 따라 코드에 들어가야 하는 값이 달라지는 경우가 있다. 단순히 현재 서버가 어떤 서버인지를 확인해줄 문자열이 될 수도 있고, 다른 API를 통해 서비스를 제공하는 프로젝트라면 해당 API를 제공하는 서버 호스트가 될 수도 있다. 이렇게 구동 환경에 따라 달라지는 값들은 yml파일 또는 properties 파일에서 프로파일을 나눠서 관리하고 실제 코드에서는 @Value로 값을 바인딩해서 사용하게 된다. 그런데 @Value로는 final 변수에 값을 바인딩하려면 롬복으로 생성자를 선언하는 방식을 사용할 수 없기 때문에 변경사항이 발생했을 때 굉장히 귀찮아진다. 이 경우 생성자 바인딩이라는 방식을 통해 프로퍼티 설정 값을 수월하게 .. 2023. 12. 21.
[Kotlin] 백준 11082 : 소수를 분수로 문제 링크 11082번: 소수를 분수로 Cube World에서는 모든 유리수를 소수로 표시하고, Baekjoon World에서는 모든 유리수를 분수로 표시합니다. 이때문에 두 나라 간에 오랜 기간 동안 전쟁을 치뤘고, 마침내 서로의 생각을 존중하기로 www.acmicpc.net 문제 해설 소수의 형태로 주어지는 유리수를 기약분수로 치환해야 한다. 우선 입력으로 주어지는 수는 정수, 유한소수, 순환소수 3가지의 경우로 구분할 수 있다. 각 경우에 대해서 생각해보자. 정수인 경우 예제 1과 같이 단순히 분자가 입력으로 주어진 수이고 분모가 1인 형태로 나타내면 된다. println("$decimal/1") 유한소수인 경우 소수부의 길이가 \(n\)이라고 할 때, 유한소수를 분수로 나타내는 가장 쉬운 방법은 .. 2023. 12. 11.
[Kotlin/Java] JUnit을 사용한 단위 테스트에서 System.in을 사용하는 콘솔 입력 로직 테스트하기 목차 들어가기 전에 간단한 토이 프로젝트를 진행하던 중에 콘솔을 통해 사용자로부터 값을 입력받아서 처리하는 로직을 구현하게 되었다. 이 로직을 테스트하기 위해 단순히 IDE로 프로젝트를 실행해서 돌려볼 수도 있었지만 입력받아서 처리하는 로직만 테스트를 하고 싶었기 때문에 단위 테스트로 구현하고자 했다. 그런데 그냥 평범하게 콘솔 입력을 하면 되겠지라는 생각과는 달리 단위 테스트에서는 콘솔 입력을 사용할 수 없었다. 하지만 단위 테스트에서도 콘솔로 입력하지 않을 뿐이지 표준 입력을 사용하는 로직을 테스트하는 방법을 찾을 수 있어서 정리해두려고 한다. 테스트를 하려는 기능 fun readConfig() = System.`in`.bufferedReader().run { val host = input("Host.. 2023. 12. 7.
[Gradle] 순수 자바/코틀린 Gradle 프로젝트를 실행 가능한 jar 파일로 빌드하기 목차 들어가기 전에 종종 스프링부트를 사용하지 않은 간단한 순수 자바/코틀린 프로젝트를 빌드해서 실행할 일이 있다. 스프링부트를 사용하지 않는 경우에는 bootJar 명령이 없어서 jar 명령으로 빌드할 수밖에 없는데 이렇게 생성된 jar 파일은 java -jar 명령어로 실행해도 제대로 실행되지 않는다. 이러한 현상이 발생하는 이유와 해결법을 정리해두고자 한다. 왜 gradle jar로 생성한 jar 파일은 실행되지 않을까? 기본적으로 Gradle의 jar 명령은 프로젝트의 소스 파일들을 컴파일한 후 jar 파일의 형태로 압축한다. 그리고 이 과정에서 MANIFEST.MF 파일이 생성되어 jar 파일에 추가된다. 터미널에 jar tf {jar 파일명}을 입력하면 jar 파일의 내부 구조를 확인해볼 수 .. 2023. 11. 28.
[Kotlin] 백준 1850 : 최대공약수 문제 링크 1850번: 최대공약수 모든 자리가 1로만 이루어져있는 두 자연수 A와 B가 주어진다. 이때, A와 B의 최대 공약수를 구하는 프로그램을 작성하시오. 예를 들어, A가 111이고, B가 1111인 경우에 A와 B의 최대공약수는 1이고, A www.acmicpc.net 문제 해설 모든 자리가 1로 이루어진 두 수의 최대 공약수를 구해야 한다. 우선 모든 자리가 1로 이루어진 수가 어떻게 구성되는지 보자. \(1111\)의 경우에는 다음과 같이 나눌 수 있다. $$1111=11\times 101$$ 또 다른 수인 \(111111\)은 다음과 같이 나눌 수 있다. $$\begin{align*}111111&=11\times 10101\\&=111\times 1001\end{align*}$$ 자세히 보.. 2023. 11. 11.
[IntelliJ] 스프링부트 프로젝트의 클래스 또는 리소스 수정 후 자동으로 재시작하기 이클립스에서 인텔리제이로 IDE를 갈아탄 이후 가장 불편했던 점이 로컬에서 인텔리제이를 통해 프로젝트가 실행 중인 상태에서 클래스나 리소스를 수정했을 때마다 프로젝트를 수동으로 재시작해야 했던 점이다. 그러던 중에 인텔리제이에서도 스프링부트 프로젝트의 클래스나 리소스를 수정했을 때 자동으로 프로젝트를 재시작해주는 기능이 있다는 것을 알게 되어 정리하려고 한다. 본 글은 IntelliJ IDEA 2023.2.4 Ultimate Edition + Gradle 기준으로 작성되었습니다. 의존성 추가 build.gradle에 아래 의존성을 추가한다. developmentOnly 'org.springframework.boot:spring-boot-devtools' Run/Debug Configurations 설정 .. 2023. 11. 2.
[Kotlin] 백준 30036 : INK 문제 링크 30036번: INK 첫 번째 줄에 정수 $I$, $N$, $K$가 공백으로 구분되어 주어진다. $(1 \le I, N, K \le 100)$ 두 번째 줄에는 잉크 문자열이 주어진다. 세 번째 줄부터 $N$개의 줄에 걸쳐 $N \times N$ 크기의 스테이지가 주어진 www.acmicpc.net 문제 해설 특별한 알고리즘이 필요하지 않은 단순 구현 문제. 우선 스테이지를 입력받으면서 하얀 사각형의 현재 위치를 저장하고 충전된 잉크의 양과 현재 색상의 순서를 저장할 변수를 선언한다. 이때 하얀 사각형의 현재 위치인 @는 이후 구현을 편하게 하기 위해 .으로 치환해준다. 이후 문제의 조건을 차례대로 구현해보자. UDLR : 스테이지를 벗어나지 않는 범위 내에서, 스테이지의 목적지 값이 .인 경우.. 2023. 10. 25.