오늘 공부한 내용 정리(2024년 5월 27일)
1. 코드카타 문제풀이
A. 모의고사
문제 내용
문제 풀이 방법
- 1, 2, 3번 수포자의 정답에서 answers와 비교해 가장 많은 정답을 맞힌 수포자를 구하기.
- 수포자의 정답지는 정답 형식에서 규칙을 찾아서 구성해야 함.
해결 코드(스포 주의)
더보기
// 학생 1, 2, 3이 있고, answers가 있음.
// 학생 1, 2, 3의 정답을 규칙에 맞게 구성한다(answers의 size 만큼).
fun solution(answers: IntArray): IntArray {
// 각 학생들의 시험 찍는 규칙
val stu1 = intArrayOf(1, 2, 3, 4, 5)
val stu2 = intArrayOf(2, 1, 2, 3, 2, 4, 2, 5)
val stu3 = intArrayOf(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)
val correct = mutableListOf(0, 0, 0)
// 정답과 학생이 찍은 답과 같으면 해당 index의 학생의 정답 수를 +1
repeat(answers.size) {
if (stu1[it % stu1.size] == answers[it]) correct[0]++
if (stu2[it % stu2.size] == answers[it]) correct[1]++
if (stu3[it % stu3.size] == answers[it]) correct[2]++
}
// 최댓값을 찾아 정답의 개수와 같은 학생만 result에 넣어서 return.
val result = mutableListOf<Int>()
for (i in correct.indices) {
if (correct.maxOf { it } == correct[i]) result.add(i + 1)
}
return result.toIntArray()
}
풀이 과정
- 각 학생(수포자)들이 시험을 찍는 루틴을 intArray로 구성한다.
- answers의 size만큼 반복해서 각 학생들의 정답과 answers가 같으면 correct에서 해당 학생의 index에 +1을 해준다.
반복문에서 it(현재 answers의 index)이랑 학생들의 정답의 size의 나머지 값을 학생들(stu1, stu2, stu3)의 index로 넣어주면 로테이션을 돌면서(1번 학생의 경우 1,2,3,4,5,1,2,3,4,5,1...) 해당 학생의 정답을 나열해 준다. - correct의 최댓값을 구해서 correct의 index에 해당하는 값과 같으면 result에 몇 번 학생(i+1)인지 추가해서 return.
B. 소수 만들기
문제 내용
문제 풀이 방법
- nums에서 숫자 3개를 추출해서 더하는 모든 경우의 수를 구한다.
- 모든 경우의 수들 중, 소수인 경우들의 개수를 return 한다.
해결 코드(스포 주의)
더보기
import kotlin.math.sqrt
fun solution(nums: IntArray): Int {
var answer = 0
val case = mutableListOf<Int>()
// 경우의 수 구하기
for (i in nums.indices) {
for (j in i + 1 until nums.size) {
for (k in j + 1 until nums.size) {
case.add(nums[i] + nums[j] + nums[k])
}
}
}
// 소수 구하기
for (data in case) {
// 특정 수가 소수인지 확인하기 위한 변수.
var isPrimeNum = false
// 숫자의 제곱근 값
val sqrt = sqrt(data.toDouble()).toInt()
// 2부터 제곱근 값만큼 반복
// 1은 소수가 아니므로 넘어가고, 2부터 제곱근까지 수까지 반복하면서 i의 배수가 되는 숫자들을 제외시키면 소수를 구할 수 있다.
for (i in 2 .. sqrt) {
// else는 소수가 아님.
if (data % i != 0) isPrimeNum = true
else {
isPrimeNum = false
break
}
}
println("소수 결과: ${data}는 소수인가? => $isPrimeNum")
if (isPrimeNum) answer++
}
return answer
}
풀이 과정
- 경우의 수를 구할 때, index가 배열의 범위를 벗어나면 안 되기 때문에 nums.size로 반복문의 최댓값을 설정한다.
i를 기준으로 i, i+1, i+2 총 3개의 수를 구해야 하기 때문에 j와 k를 이용한 반복문을 구성한다.
- 소수를 구할 때는 소수인지 체크하기 위한 변수(isPrimeNum)를 만들고 data의 제곱근을 구할 sqrt 변수를 생성함.
data가 9일 때, sqrt는 3이다. 9가 되기 위해 제곱을 해야 하는 수가 3이기 때문이다. - 1은 소수가 아니기 때문에 제외하면, 2부터 sqrt값까지 반복하게 된다.
sqrt가 3일 때, 2부터 3까지 반복하게 되는데, 이 숫자들의 배수가 아닌 수들이 소수가 된다.
- sqrt 반복문 종료 후, isPrimeNum에 맞게 소수면 answer에 +1을 해준다.
2. 개인 공부
A. 다이얼(백준)
문제 내용
문제 풀이 방법
- 원하는 번호까지 다이얼을 돌리고 나면 처음부터 다시 다이얼을 돌려야 한다.
- 다이얼 1번을 돌리는 데 1초가 소요된다.
- 돌리는 순서는 1부터 0까지이고, 처음 1로 이동하는 것은 2초가 소요된다. 나머지는 1초 소요.
해결 코드(스포 주의)
더보기
import java.io.BufferedReader
import java.io.InputStreamReader
// 전화를 걸려면 해당 번호까지 돌리고 처음부터 다시 돌려야 한다.
// 문자에 해당하는 다이얼을 찾아 그 숫자까지 돌린다.
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val dial = readLine()
var result = 0
dial.forEach { char ->
when (char) {
'A', 'B', 'C' -> result += 3
'D', 'E', 'F' -> result += 4
'G', 'H', 'I' -> result += 5
'J', 'K', 'L' -> result += 6
'M', 'N', 'O' -> result += 7
'P', 'Q', 'R', 'S' -> result += 8
'T', 'U', 'V' -> result += 9
'W', 'X', 'Y', 'Z' -> result += 10
}
}
println(result)
}
풀이 과정
- dial을 forEach {}를 이용해 char를 개별적으로 받아옴.
- char값이 무엇인지에 따라 result에 소요 시간을 더해줌.
A, B, C의 경우에는 다이얼 2에 해당되는데, 다이얼 1로 이동하는데 2초가 소요되기 때문에 3을 result에 더해줌.
B. 공 바꾸기
문제 내용
문제 풀이 방법
- 바구니 N개가 주어지고, 바구니를 M번 바꾸려고 할 때, M번 바꾸고 나서 결과를 출력하기.
- M의 개수만큼 I와 J를 입력받는데, I, J가 서로 바꿀 바구니 번호이다.
해결 코드(스포 주의)
더보기
import java.util.Scanner
fun main() = with(Scanner(System.`in`)) {
// 공의 개수와 바꿀 횟수
val ballChange = nextLine()
val ball = ballChange.split(" ")[0].toInt()
val changeCnt = ballChange.split(" ")[1].toInt()
// 최종 결과
val resultChange = (1..ball).toMutableList()
// 변결 횟수만큼 change 입력하기.
repeat(changeCnt) {
val change = nextLine()
val changing1 = change.split(" ")[0].toInt()
val changing2 = change.split(" ")[1].toInt()
val swapTemp = resultChange[changing1 - 1]
resultChange[changing1 - 1] = resultChange[changing2 - 1]
resultChange[changing2 - 1] = swapTemp
}
resultChange.forEach {
print("$it ")
}
}
풀이 과정
- 바구니의 개수와 바꿀 횟수를 입력할 변수(ballChange) 생성.
- changeCnt만큼 반복해서 change 변수 생성.
변경될 바구니들을 changing1, changing2라는 변수로 저장한다. - changing1, 2에서 -1만큼 뺀 값이 target index가 되기 때문에 해당하는 두 곳의 인덱스의 값을 서로 swap 해준다.
- resultChange을 출력할 때, 리스트채로 출력하면 틀리기 때문에 반복문으로 출력한다(공백과 같이).
간단 정리
- 오늘부터 내일배움캠프 본캠프 시작일이다.
- 성공적으로 내일배움캠프를 수료해서 꼭 Android 개발자로 취업하고 싶다.
- 12시간씩 집중해서 공부하는 것은 나중에는 모르겠지만 현재는 많이 힘들어서 틈틈히 쉬어주면서 컨디션을 조절할 생각이다.
- 첫 주는 아직 사전 캠프 강의를 완강하지 못한 사람들을 위한 진도를 맞추는 주이다. 이미 완강을 한 나는 알고리즘 문제를 열심히 풀고 있다...
728x90
'♞ | 공부일지 > ♝ | TIL' 카테고리의 다른 글
[Android, 내일배움캠프] 공부일지(2024-05-29) (0) | 2024.05.29 |
---|---|
[Android, 내일배움캠프] 공부일지(2024-05-28) (0) | 2024.05.28 |
[Android, 내일배움캠프] 공부일지(2024-05-18) (0) | 2024.05.18 |
[Android, 내일배움캠프] 공부일지(2024-05-17) (0) | 2024.05.17 |
[Android, 내일배움캠프] 공부일지(2024-05-16) (0) | 2024.05.16 |