본문 바로가기
♞ | 공부일지/♝ | TIL

[Android, 내일배움캠프] 공부일지(2024-05-27)

by immgga 2024. 5. 27.
오늘 공부한 내용 정리(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를 이용한 반복문을 구성한다.

리스트 [1,2,7,6,4]의 숫자 3개의 합의 모든 경우의 수.

  • 소수를 구할 때는 소수인지 체크하기 위한 변수(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