본문 바로가기

[TIL][내일배움캠프]

[내일배움캠프][TIL] 23.12.14 (목) - N개의 최소공배수, Android 앱개발 입문 실습과제: 자기소개 앱

1. 코드카타

 

오늘 푼 알고리즘 문제는 'N개의 최소공배수' 이다.

 

 N개의 최소공배수
n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성하기

 

보통 우리가 최소공배수와 최대공약수를 구할 때는 2개로 하는 경우가 많은데 이번에는 N개의 최소공배수라니.

 

우선, 이걸 들어가기에 앞서 최소공배수와 최대공약수를 어떻게 구하는지부터 알아보자.

 

최대공약수를 구하는 방법은 다음과 같다.

while (B != 0){
	var C: Int = A%B

	A = B
	B = C
}

return A

 

우선, A와 B가 있다고 하자.

그리고나서 A와 B를 나눈 나머지를 C라고 하자.

A는 B를 대입하고, B는 C를 대입한다.

이 때, C가 0이면 A와 B가 나누어 떨어졌다는 소리가 되므로 자연스럽게 반복문에서 탈출하며, B를 대입받은 A가 곧 최대공약수가 된다.

그렇지 않으면 나누어떨어질 때까지 계속 대입하는 과정을 반복한다.

 

그리고 최소공배수는 두 수의 곱에서 최대공약수를 나눈 값이다.

 

 

오늘의 문제는 이걸 확장해서 N개가 주어졌을 때 이 값들의 최소공배수를 어떻게 구할지 찾아야 한다.

 

이걸 알아내려면 몇 가지 케이스들을 통해서 분석해봐야 한다.

 

i) [2, 6, 8, 14]

위의 테스트 케이스에서 이미 정답이 있기 때문에 정답을 유추하는 쪽으로 가닥을 잡자.

위의 값을 다 곱하면 2*6*8*14 = 1344

여기서 이 문제의 답인 168을 나누면 8이 나오는데 이는 2의 3제곱이다.

따라서 2*3*4*7이 나오게 된다. (2를 제외한 세 숫자를 2씩 나눈 값)

 

ii) [3, 4, 7, 12]

이 경우에는 굉장히 쉽다. 왜냐하면 애초에 3과 4의 최소공배수인 12가 떡하니 배열 안에 포함되어 있기 때문.

그러니까 사실상 7과 12의 최소공배수를 구하기만 하면 된다.

이걸 식으로 표현하면 3*4*7이 된다. (12는 사실상 없는 숫자 취급)

 

iii) [3, 8, 14]

3과 8은 서로 겹치지 않으므로 그대로 곱한다. 그런데 24와 14는 2가 포함되어 있으므로 2를 나누면

24*7 = 168이 된다. …어라? i)과 똑같은 값이네.

 

여기서 N개의 최소공배수를 어떻게 구해야 하는지 나오게 된다.

  • 1. 우선 arr[0]과 arr[1]을 곱한다.
  • 2. 그리고 곱한 값을 arr[0]과 arr[1]의 최대공약수로 나눈다.
  • 3. 2번에서 구한 값에 arr[2]를 곱하고 2번의 값과 arr[2]의 최대공약수를 구해서 또 그 값을 최대공약수로 나눈다.
  • 4. 이 과정을 arr[n-1]까지 반복한다.

이를 코드로 나타내면 다음과 같다.

 

class Solution {
    fun gcd(a: Int, b: Int): Int {
        var A: Int = a
        var B: Int = b
        
        while (B != 0){
            var C: Int = A%B

                A = B
                B = C
        }
        
        return A
    }
    
    fun solution(arr: IntArray): Int {
        
        for (i in 0 until arr.size-1) {
            arr[i+1] = (arr[i] * arr[i+1])/gcd(arr[i], arr[i+1])
        }
        
        return arr[arr.size-1]
    }
}

 

 

 

2. Android 앱개발 입문 과제 - 자기소개 앱

 

저번 시간에는 Activity, Intent에 대해서 알아봤다.

이번 시간에는 지금까지 배운 앱개발과 관련된 내용들을 바탕으로 과제용 앱을 하나 만들고자 한다.

 

이번에 만들 앱은 바로바로 자기소개 앱!

 

 

이 앱의 메커니즘은 다음과 같다.

 

로그인 화면에서 아이디, 비밀번호를 입력하고 로그인을 누르면 그 사람의 정보를 촤르륵 보여주는 화면을 호출.

만약 아이디, 비밀번호가 없다면 회원가입 화면으로 가서 이름, 아이디, 비밀번호를 생성한다.

 

…인데 아직까지는 아이디, 비밀번호 데이터베이스를 저장해서 일치하는지 안하는지를 확인하는 것까지 구현하지 못 하므로 화면만 구현하는 식으로 나타냈다.

 

 

 

위의 사진들은 실제로 내가 구현한 화면들이다. 왼쪽이 로그인 화면이고, 오른쪽이 회원가입 화면.

(이미지는 내가 넣고 싶어서 곽철이를 넣었다.)

 

로그인을 한 뒤 자신의 정보를 보여주는 화면은 아직 미완이라서 올리지 않았다.

 

참고로, 이번 과제에도 단계가 있는데 우선 Lv. 1은 다음과 같다.

 

더보기

Lv1. 로그인 페이지 만들기 (SignInActivity)

  • 새 프로젝트를 만들고 MainActivity의 이름을 SignInActivity로 바꿔주세요.
  • 로고 이미지는 원하는 이미지로 넣어주세요.
  • 아이디, 비밀번호를 입력받는 EditText를 넣어주세요. (미리보기 글씨 있어야함)
  • 비밀번호 EditText는 입력 내용이 가려져야 합니다.
  • 로그인 버튼을 누르면 HomeActivity가 실행됩니다. (Extra로 아이디를 넘겨줍니다.)
  • 아이디/비밀번호 모두 입력 되어야만 로그인 버튼이 실행됩니다. (“로그인 성공”이라는 토스트 메세지 출력)
  • 아이디/비밀번호 중 하나라도 비어 있다면 “아이디/비밀번호를 확인해주세요” 라는 토스트 메세지 출력
  • 회원가입 버튼을 누르면 SignUpActivity가 실행됩니다.

 

처음 4가지 항목은 xml 레이아웃에서 구현하면 되고, 그 결과가 바로 위의 화면이다.

 

여기서 투명한 글씨체는 다음 코드로 구현할 수 있다.

android:hint="아이디를 입력하세요."

 

 

그 다음 밑의 4가지 항목은 Activity 클래스 내에서 직접 코딩해야 한다.

물론 이 코드는 전부 SignInActivity에 적어야하고.

 

// 회원가입 버튼을 누르면 회원가입 화면(SignUpActivity)으로 이동

btnSignUp.setOnClickListener{
            val intent = Intent(this, SignUpActivity::class.java)
            startActivity(intent)
        }

 

// 로그인 버튼을 누르면 자기소개 화면(HomeActivity)으로 이동 + 아이디, 비번을 넘김

btnLogin.setOnClickListener{
	val intent = Intent(this, HomeActivity::class.java)
		intent.putExtra("id", id)
		intent.putExtra("password", password)
		startActivity(intent)
	}

 

// 아이디, 비밀번호가 모두 들어있다면 "로그인 성공" 토스트 메시지를, 하나라도 입력하지 않았다면 "아이디/비밀번호를 확인해주세요." 토스트 메시지 출력

if (idEditText.text.isEmpty() || passwordEditText.text.isEmpty()) {
	Toast.makeText(this, "아이디/비밀번호를 확인해주세요.", Toast.LENGTH_SHORT).show()
    return@setOnClickListener
	}

else Toast.makeText(this, "로그인 성공!", Toast.LENGTH_SHORT).show()

 

 

다음 Lv. 2.

더보기

Lv2.  회원가입 페이지 만들기 (SignUpActivity)

  • SignUpActivity를 생성해 주세요.
  • 타이틀 이미지는 원하는 이미지로 넣어주세요.
  • 이름, 아이디, 비밀번호 모두 입력 되었을 때만 회원가입 버튼이 눌립니다.
  • 셋 중 하나라도 비어있으면 “입력되지 않은 정보가 있습니다.” 라는 토스트 메세지 출력
  • 비밀번호 EditText는 입력 내용이 가려져야 합니다.
  • 회원가입 버튼이 눌리면 SignInActivity로 이동합니다. (finish 활용)

역시나 xml에서 구현 가능한 것들은 위의 그림처럼 구현해놨고, 나머지 기능들은 내일 완성할 예정이다.