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에서 구현 가능한 것들은 위의 그림처럼 구현해놨고, 나머지 기능들은 내일 완성할 예정이다.