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

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

by immgga 2024. 5. 8.
오늘 공부한 내용 정리(2024년 5월 8일)

 

 

1. 코드카타(프로그래머스) 문제 풀이.

A. 시저 암호

문제 내용

 

문제 풀이 방법

  • s라는 문자열을 받아오면 각 문자들을 for문으로 받아와 n만큼 더한 값을 반환하기.
  • 공백의 경우에는 answer에 공백을 추가해 주고 continue를 돌려서 넘김.

해결 코드(스포 주의)

더보기
fun solution(s: String, n: Int): String {
        var answer = ""
        val aInt = 97
        val AInt = 65

        // A = 65, a = 97
        // Z = 90, z = 122
        // s를 char로 나눠서 n만큼 이동된 값을 구하기.
        // char + n이 z값(122, 90)을 넘어가면? 다시 A, a부터 시작.
        for (char in s) {
            val charToInt = char.toInt()

            // 공백의 경우(32) 공백만 따로 추가해주기.
            if (charToInt == 32) {
                answer += " "
                continue
            }

            // char가 대문자인 경우
            if (char.isUpperCase()) {
                // 대문자 char가 Z값을 넘어감.
                if (charToInt + n > 90) {
                    val plusValue = charToInt + n - 90
                    // Z -> A로 한 번 움직이면 1이 소모되야 하기에 -1을 추가해주기.
                    answer += (AInt + plusValue - 1).toChar()
                } else answer += (charToInt + n).toChar()
            }

            // char가 소문자인 경우
            else {
                // 소문자 char가 z값을 넘어감.
                if (charToInt + n > 122) {
                    println(charToInt + n)
                    val plusValue = charToInt + n - 122
                    // z -> a로 한 번 움직이면 1이 소모되야 하기에 -1을 추가해주기.
                    answer += (aInt + plusValue - 1).toChar()
                } else answer += (charToInt + n).toChar()
            }
        }

        return answer
    }

 

풀이 과정

  • String을 target으로 삼아서 for문을 돌리면 각각의 문자들은 Char 타입을 가지게 된다.
    Hello -> 'H', 'e', 'l', 'l', 'o'
  • 문자(char)를 toInt()를 이용해 int형으로 변환하면 아스키코드 값이 나오게 됨.
    아스키코드표
  • A(65), a(97), Z(90), z(122)인 것을 이용해 Char를 Int로 변환한 아스키코드값으로 판단해 보기.
  • char 데이터가 대문자인지 체크하기 위해 isUpperCase()를 사용함. Boolean을 return 하기 때문에 추가 코드 없이 if문에 다이렉트로 작성 가능함.
if (char.isUpperCase) {}

 

  • char에서 n을 더한 값이 Z(z)의 아스키코드값(90, 122) 보다 클 경우 z를 초과한다는 뜻이기 때문에 A(a)부터 다시 시작해야 하기 때문에 얼마나 초과되었는지 알 수 있는 변수를 추가함(plusValue 변수).
    plusValue 변수의 값만큼 시작값(aInt, AInt 변수)에서 더해주기.
    Z(z) -> A(a)로 움직이는 데 이동 1을 소모해야 하기 때문에 answer에는 plusValue의 -1 만큼 뺀 값을 넣어주기.
    (빼지 않으면 plusValue가 3일 때 char가 z라면 (z -> a) -> b -> c -> d 순서가 되기 때문)
  • 공백(32)이 걸렸을 때만 " "을 answer에 추가해 주고 continue를 해준다(아래의 if 코드가 작동하면 안 되기 때문).

 

B. 3진법 뒤집기.

문제 내용

 

문제 풀이 방법

  • n을 3진법으로 변환하기
  • 변환된 n을 좌우반전시키기.
  • 좌우반전된 n을 다시 10진법으로 표현해서 return 하기.

 

해결 코드(스포 주의)

더보기
fun solution(n: Int): Int {
    var answer: Int = 0

    // n을 3진법으로 변환 후, 좌우반전을 시키고 10진법으로 재변환.
    val n3String = n.toString(3)   // n을 3진법을 적용한 String으로 변환.
//        val reversedInt = n3String.reversed().toInt(3)  // n3String을 reversed(좌우반전) 후(10진법 으로 변경됨.) int 3진법으로 변경
//        answer = reversedInt.toString(10).toInt()   // 3진법 int를 10진법 String으로 변경 후, 다시 int로 변경.

    // 좌우반전하고 3진법으로 변환해서 출력
    // 이유: 10진법으로 바꿔도 똑같은 값이 나올 것이기 때문에 불필요한 코드를 줄임.
    answer = n3String.reversed().toInt(3)
    return answer
}

 

풀이 과정

  • 진법을 변환하기 위해서는 toString(), toInt()의 파라미터에 자신이 원하는 진법을 표기해주어야 한다.
    3진법 String으로 변환하고자 하면 toString(3).
  • n을 3진법 String으로 변환해 준다.
    같은 타입끼리의 진법 변환은 되지 않음(String -> String n진법, Int -> Int n진법).
val n3String = n.toString(3)
  • reversed()를 이용해 String 타입 데이터를 좌우반전시킬 수 있음.
  • 반전된 n3String을 다시 3진법 Int로 변경해 줌.
    reversed()를 사용하면 10진법 String으로 자동으로 변경되기 때문이다.
  • 3진법 Int로 변경한 반전된 n3String을 return 해줌.
    10진법으로 변환하지 않고 return 한 이유는 10진법은 평범하게 출력하는 것과 같기 때문에(toInt(10)와 toInt()가 같음) 변환 코드는 생략함.

 

2. 스파르타 코딩 클럽 강의 수강(1-2, 1-3)

A. BMI 계산기(메인화면, 1 - 2)

강의내용 간단 정리

  • BMI 계산기의 초기 화면(키 몸무게 입력 화면)의 디자인을 함.
  • split과 code 화면을 이용해 xml 코드를 작성하는 방법을 공부함.

 

B. BMI 계산기(결과화면, 1 - 3)

강의내용 간단 정리

  • BMI 계산기의 결과 화면의 디자인을 함.
  • Button, Image 같은 자주 사용하는 View들의 사용법을 익히고 xml의 View에 id를 부여하는 방법을 공부함. 

 

 

간단 정리

  • 공부일지에는 일과 시간(사전캠프: 14:00 ~ 18:00, 본캠프 09:00 ~ 21:00)에 했던 일들을 작성하겠다.
  • 프로그래머스 풀이를 하면서 처음 알게 되는 개념(toString, toInt를 이용한 진법 변환)을 알게 되었다.
  • BMI 계산기 강의 과정은 이전에 다 공부했던 개념이지만, 성실하게 챙겨볼 생각이다.
728x90