티스토리 뷰
사전캠프 TIL 22일차 (모의고사, 소수 만들기 - Kotlin | FlutterFlow - 로그인/회원가입 구현)
하몬드 2024. 5. 21. 20:45코드카타
모의고사
문제
정답
class Solution {
fun solution(answers: IntArray): IntArray {
val patterns = listOf(
listOf(1, 2, 3, 4, 5),
listOf(2, 1, 2, 3, 2, 4, 2, 5),
listOf(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)
)
val scores = IntArray(3)
for ((i, answer) in answers.withIndex()) {
for ((j, pattern) in patterns.withIndex()) {
if (answer == pattern[i % pattern.size]) {
scores[j]++
}
}
}
val maxScore = scores.maxOrNull()
val res = mutableListOf<Int>()
for ((i, score) in scores.withIndex()) {
if (score == maxScore) {
res.add(i + 1)
}
}
return res.toIntArray()
}
}
수포자들의 패턴을 선언하고 그걸 활용해 수포자들의 점수가 들어있는 배열을 만든다.
수포자 i의 점수가 그 배열에서 가장 큰 점수와 동일하다면 res에 i를 추가한다.
withIndex함수로 각 요소의 인덱스 값에 접근할 수 있게 해주는 함수로
위와 같이 주어진 값을 n번지에 저장하는 로직이 필요한 문제에서 유용하게 쓰인다.
패턴 선언
val patterns = listOf(
listOf(1, 2, 3, 4, 5),
listOf(2, 1, 2, 3, 2, 4, 2, 5),
listOf(3, 3, 1, 1, 2, 2, 4, 4, 5, 5)
)
수포자들의 찍기 패턴을 2차원 배열로 선언한다.
수포자들 점수 구하기
val scores = IntArray(3)
for ((i, answer) in answers.withIndex()) {
for ((j, pattern) in patterns.withIndex()) {
if (answer == pattern[i % pattern.size]) {
scores[j]++
}
}
}
수포자는 총 3명이므로 3의 크기를 가지며 초기값이 모두 0인 scores배열을 선언해준다.
scores배열에는 3명의 수포자들의 점수가 차례대로 들어가게 된다.
i는 정답지의 (문제번호-1)에 해당하고 j는 수포자의 번호에 해당한다.
i번 문제의 정답이 j번 수포자가 찍은 i번째 문제와 일치한다면 score의 j번지값에 1을 더해준다.
pattern[i % pattern.size]
// 만약 수포자의 찍기 패턴 배열의 크기가 5라면
// i가 5에 해당할 때 해당구문은 패턴 배열의 0번지를 반환한다.
pattern[i % pattern.size]는 정답의 개수가 pattern의 크기를 초과할 때를
고려한 구문이며 해당 구문에서 패턴 배열에 반복적으로 접근하도록 한다.
최고득점자 구하기
val res = mutableListOf<Int>()
for ((i, score) in scores.withIndex()) {
if (score == scores.maxOrNull()) {
res.add(i + 1)
}
}
수험자 i의 점수가 3명 중에 가장 높다면 i를 res에 더한다.
가장 높은 점수를 받은 사람이 여럿이라면 그 수험자들 번호 순서대로 res에 더해지게 된다.
소수 만들기
문제
정답
class Solution {
fun solution(nums: IntArray): Int {
val num = mutableListOf<Int>()
val n = nums.size
for (i in 0 until n - 2) {
for (j in i + 1 until n - 1) {
for (k in j + 1 until n) {
num.add(nums[i] + nums[j] + nums[k])
}
}
}
fun isPrime(num: Int): Boolean {
if (num <= 1) return false
return (2..Math.sqrt(num.toDouble()).toInt()).none { num % it == 0 }
}
return num.count{isPrime(it)}
}
}
주어진 숫자 중 3개의 수를 더하는 모든 경우의 수를 num에 더해준다.
소수 판별 함수를 작성하고 count함수를 활용해 num의 요소를 인자값으로
주었을 때 true를 반환하는 총 경우의 수를 반환한다.
소수 판별 함수
fun isPrime(num: Int): Boolean {
if (num <= 1) return false
return (2..Math.sqrt(num.toDouble()).toInt()).none { num % it == 0 }
}
1 이하의 수는 소수가 아니므로 false를 반환한다.
소수는 판별할 숫자의 제곱근 까지 나눠도 나누어 떨어지지 특성을 가지고 있다.
따라서 num이 (2~num의 제곱근)범위에 있는 어떤 수에도 나누어 떨어지지 않으면 소수이다.
none함수는 주어진 범위에 대해 모든 조건이 거짓이면 true를 반환한다.
해당 함수에서 num에 3이 들어가게 된다면
2~1의 범위를 탐색하게 되는데 이 경우엔 2만 확인하게 된다.
FlutterFlow 2주차 숙제
이메일을 활용한 회원가입 및 로그인 페이지 구현이 이번 주 숙제이다.
서버 세팅
Setting > Firebase 경로로 들어가서 파이어베이스 프로젝트를 생성해준다.
프로젝트를 생성할 때 지역은 사용자를 기준으로 설정하며 되는데
한국에 사는 사람들을 위한 서비스를 제공하려면 서울로 설정해주면 된다.
파이어베이스에서 계정과 저장소 기능을 사용하기 위해 활성화를 시켜야 한다.
Auth에서 이메일/비밀번호로 로그인을 하도록 설정한다.
Stroage는 사용자가 올린 파일을 저장하는 역할을 한다.
이미지 업로드 오류를 방지하기 위해 저장소 설정의
규칙 탭에 들어가서 위와 같이 코드를 변경한 후 변경사항을 게시해준다.
FireStore에 들어가서 유저 컬렉션을 생성해준다.
"user"라는 컬렉션을 생성하면 기본적인 유저 필드 세팅여부를 고를 수 있다.
Yes 버튼 눌러주고 문자열 값이 들어가는 role과 short_description키를 추가해준다.
Firestore Rules를 deploy해준다.
Regenerate Config Files 버튼을 눌러 파이어베이스의 설정파일을 만들어준다.
deploy 버튼을 눌러 파이어베이스의 저장소의 설정을 해준다.
로그인 페이지 설정
페이지 폴더에 AuthPage와 ProfilePage를 추가한다.
Setting > Authentication 경로로 들어가서 계정 기능을 활성화 시켜주고 페이지를 설정한다.
Entry Page는 계정 생성 페이지로,
Logged In Page는 말그대로 로그인 시 이동할 페이지로 설정해주면 된다.
계정 페이지 레이아웃
이런식으로 레이아웃을 짰다.
텍스트 필드의 borderType은 Outline으로 전부 줬다.
각각의 텍스트 필드에 알맞은 이름을 준다.
비밀번호를 입력하는 텍스트필드는 위의 설정을 해줘야 한다.
회원가입 버튼
회원가입 버튼에 Create Account 액션을 추가해준다.
로그인 방식은 이메일을 활용하도록 설정해주고,
이메일과 비밀번호는 회원가입 텍스트필드에 입력한 값으로 설정한다.
Action Flow에 들어가 버튼을 누르면 프로필페이지로 이동하고
계정을 생성하도록 버튼 동작을 설정한다.
로그인 버튼
로그인 버튼에 Log in 액션을 추가해준다.
회원가입과 마찬가지로 이메일을 활용하도록 로그인 하도록 설정하고,
이메일과 비밀번호는 로그인 텍스트필드에 입력한 값으로 설정한다.
로그인 후 이동할 페이지는 이미 설정했으므로 따로 액션을 추가할 필요는 없다.
프로필 설정 페이지 레이아웃
프로필 페이지에서 아까 추가한 키에 들어갈 값을 입력하는
텍스트필드와 드롭다운 버튼을 추가한다.
드롭다운 버튼에 적절한 항목을 추가한다.
유저 설명은 최대 5줄까지 적을 수 있도록 설정해준다.
이미지 업로드
Upload/Save Media를 검색한뒤
Aciton을 Upload media to Firebase로 변경한다.
업로드 할 수 있는 자료의 타입은 사진만 허용한다.
프로필 설정
프로필 완성 버튼에 Update Document 액션을 추가해준다.
레퍼런스는 유저 레퍼런스로 설정해주고 추가해줄 필드 또한 설정해준다.
필드에 들어갈 값의 속성은 From Variable로 주고
각각의 필드에 해당하는 위젯의 값을 읽어오도록 설정한다.
프로필 이미지 경로는 Uploaded Photo/Video로 설정한다.
프로필 설정 후 홈페이지로 이동하도록 한다.
유저 생성 확인
유저 컬렉션에서 Manage Content 버튼을 눌러 생성된 유저를 확인할 수 있다.
이런식으로 생성된 유저를 확인할 수 있고,
연필 아이콘을 눌러 사용자의 정보를 수정할 수도 있다.
저기서 photo_url을 누르면 사용자가 업로드한 사진을 확인할 수 있다.
느낀 점
벡엔드 설정 골아픈데, 이것저것 알아서 설정해주니까 편하다!
'내일배움캠프 > Android 사전캠프' 카테고리의 다른 글
사전캠프 TIL 24일차 (기사단원의 무기 - Kotlin | FlutterFlow 프로젝트 웹배포) (0) | 2024.05.24 |
---|---|
사전캠프 TIL 23일차 (덧칠하기 - Kotlin | FlutterFlow - 관리자 페이지 & 댓글 기능 구현) (0) | 2024.05.23 |
사전캠프 TIL 21일차 (카드 뭉치, 과일 장수 - Kotlin | FlutterFlow - 레이아웃 짜기) (0) | 2024.05.21 |
사전캠프 TIL 20일차 (2016년 - Kotlin, 앱 개발 용어정리 1) (0) | 2024.05.17 |
사전캠프 TIL 19일차 (명예의 전당 (1) - Kotlin, MBTI 테스트 결과화면 구현) (0) | 2024.05.16 |