본문 바로가기

전체 글135

[백준] 9084. 동전 / Java https://www.acmicpc.net/problem/9084 9084번: 동전 우리나라 화폐단위, 특히 동전에는 1원, 5원, 10원, 50원, 100원, 500원이 있다. 이 동전들로는 정수의 금액을 만들 수 있으며 그 방법도 여러 가지가 있을 수 있다. 예를 들어, 30원을 만들기 위해서는 www.acmicpc.net 문제 풀이 주어진 동전들로 목표 금액 M을 만들 수 있는 경우의 수를 찾아내는 문제이다. 일차원 dp 배열을 활용하여 각 금액에 대한 경우의 수를 갱신해나가는 방식으로 풀이할 수 있다. dp[i] = j 일 때, 금액 i를 만들 수 있는 경우의 수는 j라는 의미이다. 예를 들어, 동전의 종류가 1, 2 세 가지가 있고 목표 금액이 10인 경우를 생각해보자. 먼저 1짜리 동전만 사용.. 2023. 6. 21.
[백준] 11758. CCW / Java https://www.acmicpc.net/problem/11758 11758번: CCW 첫째 줄에 P1의 (x1, y1), 둘째 줄에 P2의 (x2, y2), 셋째 줄에 P3의 (x3, y3)가 주어진다. (-10,000 ≤ x1, y1, x2, y2, x3, y3 ≤ 10,000) 모든 좌표는 정수이다. P1, P2, P3의 좌표는 서로 다르다. www.acmicpc.net 문제 풀이 이 문제는 두 벡터의 외적을 구하는 공식으로 풀 수 있는 문제이다. 일명 '신발끈 공식'으로 (빨간색 빗금으로 이어진 것들의 곱의 합) - (파란색 빗금으로 이어진 것들의 곱의 합) 이다. 즉, 아래와 같은 식이다. (x1*y2 + x2*y3 + x3*y1) - (y1*x2 + y2*x3 + y3*x1) 계산 결과가 양.. 2023. 6. 20.
[백준] 9663. N-Queen / Java https://www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 풀이 이 문제는 크기가 N * N인 체스판 위에 퀸 N 개를 서로 공격할 수 없게 놓는 경우의 수를 구하는 문제이다. 기본적으로 BruteForce 유형이나 isPromising()과 같은 메서드를 활용하여 가망이 없는 경로를 가지치기 하며 진행하는 BackTracking 기법이 가미되어 있다. 우선 눈여겨 볼 점은 이 차원으로 이루어진 체스판을 일 차원 배열(board[])로 바꾸어 생각한다는 것이다. 배.. 2023. 6. 14.
[Jenkins] Jenkins를 통한 배포 시 application.yml 내 환경변수 처리 개요 SpringBoot 프로젝트의 application.yml 파일에는 각종 외부 접속에 필요한 정보(URL, 계정정보 등)가 포함되어 있다. 이를 GitHub에 그대로 업로드한다면 민감한 정보가 노출되어 보안 상 문제가 되므로 아래와 같이 주요 정보들을 환경변수(${} 로 감싸져 있는 부분)로 처리해주었다. 그리고 Jenkins를 통해 해당 프로젝트를 빌드할 때, 환경변수로 처리한 부분들에 대한 정보를 주입할 수 있도록 빌드 환경 설정을 해준다. application-prod.yml server: servlet: encoding: force: true charset: UTF-8 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: .. 2023. 6. 13.
[Docker] 도커 연결 시 Host 포트와 Container 포트 도커 이미지를 실행할 때 아래와 같은 명령어를 사용한다. docker run -d --name myproject -p {host 포트}:{container 포트} myrepository/myproject 여기서 -p {host 포트}:{container 포트} 부분을 활용해서 두 포트를 연결시킬 수 있다. 예를 들어 1.23.43.123 이라는 주소를 가진 서버의 8080 포트에 도커 컨테이너의 8081 포트를 연결하고자 한다면 -p 8080:8081 과 같이 설정할 수 있는 것이다. 이렇게 연결하고 나면 사용자가 1.23.43.123:8080로 접속하면 이를 통해 여기에 연결된 도커 컨테이너의 8081 포트로 접속할 수 있게 된다. 2023. 6. 8.
[오늘의 발견] 원형 자료구조에서의 인덱스 오늘의 발견은? 알고리즘 문제를 풀 때 사용할 수 있는 사소한 팁이다. 아래 그림과 같이 동서남북 각 방향을 나타내는 인덱스가 있고 방향을 가리키는 변수 d가 있다. 예를 들어 d = 0 인 경우 북쪽 방향을 나타내는 것이다. 이때 d를 시계방향으로 5 만큼 조정한다고 했을 때 이동하는 값만큼 더해주고 전체 칸의 수로 나누었을 때의 나머지를 구함으로써 조정 후의 인덱스 값을 계산할 수 있다. d = (d+5) % 4; d = (d + {이동 칸 수}) % {방향 갯수} // 일반화 2023. 6. 8.
[백준] 14503. 로봇 청소기 / Java https://www.acmicpc.net/problem/14503 14503번: 로봇 청소기 첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽 www.acmicpc.net 문제 풀이 구현 카테고리에 있던 문제라 그저 구현으로 풀수도 있었지만 DFS를 활용해서도 풀 수 있었다. 문제에 주어진 조건을 찬찬히 읽고 이해하는 것이 중요했다. 풀이 흐름에 대한 상세 설명은 소스 코드에 주석으로 대체한다. 소스 코드 import java.io.BufferedReader; import java.io.IOException; imp.. 2023. 6. 8.
[Linux] cd 명령어의 사용(절대 경로, 상대 경로) cd란? 리눅스에서 명령어 cd는 change directory의 약자로, 말그대로 디렉토리 이동에 사용되는 명령어이다. 예제 코드는 아래와 같다. cd {이동하고자 하는 경로} 명령어 자체는 간단하다. 다만 이동하고자 하는 경로를 표시하는 데 있어서 쓸 때마다 헷갈리는 부분이 있어 정리해보려 한다. 절대 경로 절대 경로는 이동하고자 하는 목표 경로를 루트 디렉토리부터 목표 디렉토리까지 모두 명시하는 경로이다. 예를 들어 /home/one/two/three 으로 이동하려면 현재 위치가 어디든 상관 없이 해당 경로를 그대로 입력하면 된다. cd /home/one/two/three 상대 경로 상대 경로는 절대 경로와 달리 현재 위치를 활용할 수 있다. 예를 들어 현재 위치가 /home/one 이고 목표 위치.. 2023. 6. 3.
[AWS] EC2 SSH 접속 시 사용하는 개인키(.pem)에 대한 권한 설정 EC2에 SSH 접속 시 AWS에서 다운로드받은 pem키를 그대로 사용하면 permission denied 오류가 발생할 수 있다. 이때 아래 명령어를 통해 파일의 권한을 변경함으로써 문제를 해결할 수 있다. chmod 400 .pem chmod는 파일의 권한을 변경하는 명령어이며, 잇따라 입력하는 세자리 수는 세부적인 권한을 설정하는 데 사용된다. 각 자리의 의미는 다음과 같다. [파일 소유자][그룹 사용자][모든 사용자] 각 자리에 들어가는 숫자는 읽기(read), 쓰기(write), 실행(execute)의 조합으로 이루어지는데 각각에 할당된 값은 4, 2, 1이다. 예를 들어, 읽기와 쓰기에 대한 권한을 부여하려면 4 + 2 = 6이 된다. 따라서 chmod 400의 의미는 "파일 소유자에 대해 읽.. 2023. 6. 2.
[백준] 1339. 단어수학 / Java https://www.acmicpc.net/problem/1339 1339번: 단어 수학 첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대 www.acmicpc.net 문제 풀이 알파벳에 0~9 사이의 수를 대입하여 가장 큰 수를 만드는 문제이다. 핵심은 높은 자릿수에 위치한 알파벳에 큰 수를 맵핑하는 것이다. 예를 들어 아래 두 단어가 주어졌을 때, GCF ACDEB 알파벳별로 따로따로 생각해보면 다음과 같다. GCF = 100*G + 10*C + 1*F ACDEB = 10000*A + 1000*C + 100*D + 10*E + 1*B 그 다음으로는 알파.. 2023. 6. 1.
[백준] 11725. 트리의 부모 찾기 / Java https://www.acmicpc.net/problem/11725 11725번: 트리의 부모 찾기 루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 풀이 루트 노드인 1부터 DFS 탐색을 하기 때문에 DFS가 시작되는 노드가 부모가 되고, 이 노드에 연결되어 있으면서 아직 탐색되지 않은 노드를 찾는다면 그 노드가 자식 노드가 되게 된다. 다시 말해, 루트 노드로부터 아직 탐색되지 않은 노드를 탐색하며 해당 노드가 어느 노드로부터 왔는지를 찾아 parent[]에 저장한다. 소스 코드 import java.io.BufferedReader; import java.io.IOException; import j.. 2023. 5. 30.
[백준] 4963. 섬의 개수 / Java https://www.acmicpc.net/problem/4963 4963번: 섬의 개수 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도 www.acmicpc.net 문제 풀이 일반적인 BFS 탐색문제의 흐름대로 풀 수 있는 문제였지만, 하나 특이한 점이라면 대각선 위치로도 이동할 수 있다는 조건이 있다는 점이었다. 추가적인 설명은 소스코드의 주석으로 이어진다. 소스 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import jav.. 2023. 5. 29.