오늘 공부한 내용 정리(2024년 7월 19일)
코드카타 문제풀이
세 개의 소수 문제(SIlver 4, 11502번, 마라톤)
문제 내용
문제 풀이 방법
테스트 케이스의 개수(T)와 숫자 K가 T번 입력될 때, K의 소수들 중 3개를 더한 값이 K가 되는 경우가 있으면 숫자 3개를 오름차순으로 출력하고, 아닌 경우는 0을 출력.
해결 코드(스포 주의)
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.sqrt
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val case = readLine().toInt()
for (c in 0 until case) {
val num = readLine().toInt()
val array = Array(num + 1) { it }
array[1] = 0
for (i in 2 .. sqrt(num.toDouble()).toInt()) {
if (array[i] == 0) continue
for (j in 2 * i .. num step i) {
array[j] = 0
}
}
val removeZeroArr = array.filter { it != 0 }
var answer = ""
for (i in removeZeroArr.size - 1 downTo 0) {
for (j in removeZeroArr.size - 1 downTo 0) {
for (k in removeZeroArr.size - 1 downTo 0) {
val sum = removeZeroArr[i] + removeZeroArr[j] + removeZeroArr[k]
if (sum == num) {
answer = "${removeZeroArr[i]} ${removeZeroArr[j]} ${removeZeroArr[k]}"
break
}
}
}
}
if (answer.isEmpty()) println(0)
else println(answer)
}
}
풀이 과정
입력받을 수의 개수(case)를 먼저 입력받고, 1부터 소수를 구할 수를 입력받는다(num).
array는 0부터 num까지 수를 저장하고 있다.
그리고 첫 번째 반복문에서는 에라토스테네스의 체 알고리즘을 이용해 소수를 구해줄 것이다.
2부터 시작해 num의 제곱근까지 반복해 주고, 이미 지워져서 0인 데이터가 있으면 continue로 넘긴다.
조건을 만족하지 않으면 i * 2부터 시작해 i의 배수에 해당되는 index의 값들을 모두 지워준다.
위 반복을 끝내면 1부터 num까지의 소수만 남을 것이다.
이제 소수만 남은 array에 0을 전부 지워서 removeZeroArr에 새로 저장한다.
그리고 정답 데이터를 저장할 answer를 생성한다(초기값은 빈 문자열).
3중 반복문으로 removeZeroArr에서 중복을 포함해 3개를 선택하는 모든 경우의 수를 체크한다.
반복을 역순으로 진행했는데, 그렇게 해야 굳이 answer에서 sorting을 할 필요 없이 자동으로 정렬되어서 수가 출력되기 때문이다.
sum(선택된 수 3개의 합)과 num이 같으면 answer에 소수 3개를 넣어 주고 break로 반복을 끝낸다.
만약 answer가 반복이 끝났는데도 0이면 0을 출력하고 아닌 경우에는 answer를 출력한다.
문제 해결 과정
에라토스테네스의 체 알고리즘으로 소수를 찾고, 반복문을 이용해 모든 경우의 수를 체크해 주면 쉽게 해결할 수 있는 문제이다.
7 더하기(Silver 3, 4900번, 마라톤)
문제 내용
문제 풀이 방법
7 세그먼트 디스플레이에는 총 7개의 led가 독립적으로 동작한다.
led가 7개이기 때문에 총 127개의 경우의 수가 있다.
위 사진처럼 1부터 9까지 led가 켜지는 데 코드는 총 7자리로, 첫 번째 수가 6번 led를 가리키고, 마지막 수는 0번 led를 가리킨다(1의 경우에는 1, 3번 led가 켜지기 때문에 0001010이다).
0001010은 이진수다. 이를 10진수로 변환하면 10인데, 3자리의 숫자로 나타내야 하기 때문에 010이 된다.
입력은 여러 변 주어지고, 3자리의 수로 구성된 코드들이 수식으로 주어진다.
예) 010010+010 => 11 + 1과 동일.
이 수식의 합을 3자리의 코드로 나타내서 출력한다.
예) 010010+010 = 11 + 1 = 12 = 010093
해결 코드(스포 주의)
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val sevenSegmentDisplay = listOf(
"063", "010", "093", "079", "106", "103", "119", "011", "127", "107"
)
while (true) {
val formula = readLine()
if (formula == "BYE") break
val input = formula.substring(0, formula.length - 1).split("+")
var resultToNumber = ""
var resultAddToNumber = ""
val segmentCode1 = input[0].chunked(3)
val segmentCode2 = input[1].chunked(3)
for (code in segmentCode1) {
val number = sevenSegmentDisplay.indexOf(code)
resultToNumber += number
}
for (code in segmentCode2) {
val number = sevenSegmentDisplay.indexOf(code)
resultAddToNumber += number
}
var answer = ""
val resultNumber = (resultToNumber.toInt() + resultAddToNumber.toInt()).toString()
for (num in resultNumber) {
answer += sevenSegmentDisplay[num.digitToInt()]
}
println("${formula}$answer")
}
}
풀이 과정
입력되는 경우는 0 ~ 9까지이기 때문에 sevenSegmentDisplay 리스트에 각 인덱스에 해당하는 수의 3자리 코드를 미리 정의해 놓는다.
그다음 코드로 이루어진 수식 formula를 입력받는다, formula가 BYE면 반복을 끝낸다.
다음으로는 + 기호로 수식을 나눈 결과를 input에 저장한다(수식을 입력받을 때 = 기호까지 같이 입력받기 때문에 subString으로 마지막 문자를 제거해 줌).
그다음 수식의 수 2개를 문자 3개씩 구성되도록 나눠준다(segmentCode1, segmentCode2).
다음으로는 segmentCode1, segmentCode2를 반복해서 sevenSegmentDisplay에서 동일한 값이 들어 있는 index를 찾아서 resultToNumber, resultAddToNumber에 추가해 준다(문자열로 추가해 줘야 숫자로 추가했을 때의 자릿수 고려를 하지 않을 수 있음).
다음으로 answer 변수를 생성하고, 3자리의 코드를 int로 변환한 후, 그 수들의 합을 다시 string으로 변환한 값인 resultNumber를 반복해서 각 자릿수에 해당하는 sevenSegmentDisplay의 index로 찾아가면 그 수에 해당하는 3자리 코드를 얻을 수 있다.
모두 모아서 출력 형식에 맞게 출력해 준다.
문제 해결 과정
문제 이해가 어려웠고, 문제 이해를 했다면 굳이 일일이 구할 필요 없이 미리 리스트로 코드를 정의해서 푸는 방법을 바로 생각해 낼 수 있을 것이다.
먼저 코드를 정의하는 방법을 생각해 냈다면 Silver 3 난이도 치고는 쉽게 해결 가능함.
수준별 학습반 과제 v3(standard class)
검색 화면 생성
공부 내용 간단 정리
이번의 필수 작업사항은 fragment끼리 데이터 공유를 하는 것이다.
이를 구현하기 위해 검색 fragment를 구현하기로 했다.
검색 입력 fragment에는 상단의 탑바를 클릭해서 들어오거나, 카테고리 정보를 클릭해 들어오는 방법이 있다.
카테고리 정보 card를 클릭해서 들어왔으면 클릭한 카테고리 text가 editText에 보이도록 해주었다.
editText에 텍스트를 입력하고 검색 버튼을 누르면 검색 기록 recyclerView에 데이터가 추가되도록 listAdapter로 구현했다.
또한 검색 기록 item에서 화살표 icon을 누르면 검색 기록이 editText에 붙여 넣기 되도록 해주었다.
결과 화면
오늘 공부 내용 정리 및 회고
이제 v3의 마지막 과제인 MVVM 활용하기가 남아 있다.
viewModel에는 비즈니스 로직만을 다루어야 하는데, 일단 오늘 구현한 검색 기록에서 검색 기록을 저장할 수 있도록 ViewModel에서 구현해 볼 것이다.
또한 게임 fragment에서 추천 탭과 인기 차트 등등에 쓰인 더미 데이터를 불러오는 것도 ViewModel로 빼서 처리해 주겠다.
다음 주부터는 팀 프로젝트가 시작되는데, 시작하기 전에 전부 끝내고 시작하고 싶다.
'♞ | 공부일지 > ♝ | TIL' 카테고리의 다른 글
[Android, 내일배움캠프] 공부일지(2024-07-23) (0) | 2024.07.23 |
---|---|
[Android, 내일배움캠프] 공부일지(2024-07-22) (0) | 2024.07.22 |
[Android, 내일배움캠프] 공부일지(2024-07-18) (0) | 2024.07.18 |
[Android, 내일배움캠프] 공부일지(2024-07-17) (2) | 2024.07.17 |
[Android, 내일배움캠프] 공부일지(2024-07-16) (0) | 2024.07.16 |