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

BOJ105

[Kotlin] 백준 1065 : 한수 문제 링크 1065번: 한수 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 www.acmicpc.net 문제 해설 1부터 1000까지의 모든 경우를 계산해야하는 완전탐색 문제다. n이 주어졌을 때 n 이하의 수 중 각 자리수가 등차수열을 이루는 수의 총 개수를 구해야한다. 우선 생각해야하는 점은 수열의 항이 2개 이하인 모든 수열은 등차수열이 된다는 점이다. 항이 1개뿐인 경우는 공차가 몇이든 상관 없이 등차수열이 되고, 항이 2개인 경우는 두번째 항 - 첫번째 항의 값이 공차인 등차수열이 되기 때문이다. 예를 들어, X가 31이라면 각 자리를 항으로 하는.. 2022. 11. 25.
[Kotlin] 백준 4673 : 셀프 넘버 문제 링크 4673번: 셀프 넘버 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때, www.acmicpc.net 문제 해설 완전탐색법으로 풀어야 하는 문제다. 먼저 1~10000까지의 수가 셀프 넘버인지 검사할 배열을 선언한다. 이후 1부터 10000까지 모든 수에 대해 d(n)을 구하고, d(n)이 10,000 이하일 경우 배열의 d(n)번째 값을 true로 변경한다.(true는 d(n)의 생성자 n이 존재하는 경우를 뜻한다.) 이후 배열에서 값이 false인 인덱스를 모두 출력하면 된다. Code fun ma.. 2022. 11. 25.
[Kotlin] 백준 1064 : 평행사변형 문제 링크 1064번: 평행사변형 평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC) 이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나 www.acmicpc.net 문제 해설 점 3개가 주어졌을 때 만들어지는 평행사변형 중 가장 긴 둘레와 가장 짧은 둘레 길이의 차이를 구하는 문제다. 점 3개가 주어지면 위 그림과 같이 3개의 변이 만들어지는데, 평행사변형은 마주 보는 변의 길이가 같으므로 두 변의 길이의 합에 2를 곱한 값이 둘레의 길이가 된다. 가장 큰 평행사변형의 둘레와 가장 작은 평행사변형의 둘레의 차이만 구하면 되기 때문에 3개의 변 중에 가장 긴 변의 길이에서 가장 짧은.. 2022. 11. 24.
[Kotlin] 백준 1010 : 다리 놓기 문제 링크 1010번: 다리 놓기 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다. www.acmicpc.net 문제 해설 문제의 결론만 따지자면 \( _{m}\mathrm{C}_{n}\)을 구하는 문제다. 강 서쪽의 n개의 사이트를 모두 선택하여 강 동쪽의 임의의 m개의 사이트에 하나씩 연결해야한다. n ≤ m이므로 m개 중 n개를 선택하는 경우의 수와 같다는 것을 알 수 있다. 여기서 다리가 겹쳐질 수 없다는 조건이 있는데 이에 대한 예시는 다음 그림과 같은 두 경우를 들어보겠다. 각 경우를 배열로 나타내면 첫번째는 [1, 2, 3], 두번째는 [2, 3, .. 2022. 11. 24.
[Kotlin] 백준 1094 : 막대기 문제 링크 1094번: 막대기 지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대 www.acmicpc.net 문제 해설 간단한 비트마스킹 문제다. 지문을 보면 64에서 반복적으로 연산을 진행하여 더한 횟수를 구해야할 것 같지만 문제의 조건을 보면 시작하는 막대 길이가 64(26)cm라는 점이 명시되어 있다. 즉, 이전 막대를 반으로 나눈 새 막대는 모두 2의 거듭제곱수라는 사실을 알 수 있다. 다시 말해, 나눠진 각 막대는 2진수로 표현하면 모두 다른 자리에 1이 하나만 존재하므로 X를 2진수로 바꿨을 때 1의 개수가 곧 문제의 답이 된다. Code fu.. 2022. 11. 23.
[Kotlin] 백준 1308 : D-Day 문제 링크 1308번: D-Day 첫째 줄에 오늘의 날짜가 주어지고, 두 번째 줄에 D-Day인 날의 날짜가 주어진다. 날짜는 연도, 월, 일순으로 주어지며, 공백으로 구분한다. 입력 범위는 1년 1월 1일부터 9999년 12월 31일 까지 이다. www.acmicpc.net 문제 해설 날짜 계산 문제다. 처음에는 단순히 날짜만 계산하면 될 것이라 생각하고 두 입력을 시간값으로 파싱하여 그 차이가 1000년 이상인 경우만 생각했다가 틀렸습니다가 나왔다. 원인을 분석해보니 단순히 날짜의 차이만 계산하다보니 중간의 수많은 윤년의 존재로 인해 y+1000년 m월 d일 이전의 날짜인데도 365,000일이 넘는 경우가 발생하여 gg를 출력한 것이다. 그리하여 원시적인 방법으로 일수를 계산하는 것으로 해결하는 쪽으.. 2022. 11. 23.
[Kotlin] 백준 1251 : 단어 나누기 문제 링크 1251번: 단어 나누기 알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다. 먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다 www.acmicpc.net 문제 해설 완전 탐색법으로 풀어야 하는 문제다. 주어진 단어를 3개로 나눈 후 각각을 뒤집어서 합쳐서 나온 단어들 중 사전순으로 가장 앞서는 단어를 구하기 위해서 2중 반복문을 돌려서 각 경우의 단어를 만든다. 이후, 새롭게 만들어진 단어와 이전 케이스에서 나온 단어를 비교하여 사전순으로 앞서는 단어를 비교하여 앞서는 단어를 결과에 저장하는 과정을 반복하여 해답을 구한다. Kotlin에서는 slice() 메소드를 통해 문자열을 쉽게 나눌 수 있으며 re.. 2022. 11. 23.
[Kotlin] 백준 1181 : 단어 정렬 문제 링크 1181번: 단어 정렬 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. www.acmicpc.net 문제 해설 여러 문자열의 입력이 주어졌을 때 입력된 문자열들의 중복을 제거하고 길이가 짧은순으로 정렬하되, 같은 길이의 문자열은 사전순으로 정렬하는 문제이다. 여러가지 해법이 있겠지만 나의 해결 순서는 다음과 같다. 입력받은 문자열을 배열에 저장 중복 문자열 제거 문자열을 사전순으로 정렬 문자열의 길이가 짧은 순으로 정렬 2. 중복 문자열 제거의 경우에는 Set에 입력받은 문자열을 저장하는 방법도 있지만 나는 배열 객체에 제공되는 disti.. 2022. 11. 22.