Getx를 배우고 있는데 노트북이 너무 버거워한다...

조만간 맥북으로 바꾸는것을 목표로 하고 잠시동안

가벼운 프로젝트만 돌리려고한다.

 

이번에는 앱 첫시작에 꼭 들어가는 Onboarding Page를 만들어보려고한다.

앱의 사용설명서 같은것이다.

역시나 외부 라이브러리를 이용할 예정이다.

라이브러리를 설치하는것은 여럿 안내를 했으니 스킵하도록 하겠다.

 

설치가 다됬으면 페이지에 쓰일 이미지를 준비해주자

이미지또한 yaml 파일에서 assets 시켜주자.

 

간단한 트리를 말하자면

OnboardingPage -> main page

이며 역으로 다시 이동도 가능하다.

 

코드와 같이 앱을 실행하면 온보딩 페이지가 뿌려지게

STL 위젯을 만들어준다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

OnBoardingPage이다.

위 라이브러리를 설치하게되면

IntroductionScreen();

을 불러올 수 있다.

 

 

 

 

 

기본적인 틀이다.

pages는 페이지의 리스트이다.

각 페이지를 구현하는 코드는 PageViewModel이며

한개당 하나의 페이지를 그린다.

나는 위젯의 관리를 위해 body 대신 bodywidget을 사용했다.

사진에는 안나와있지만

image: 도 들어가야한다.

 

 

 

 

 

 

decoration 부분은 여럿페이지에 한번에 적용될것이니 따로 분리시켜줬다.

위와같이 PageViewModel 코드를 여러개 작성하면 그만큼 페이지가 나타날것이다.

구성이 완료되었다면.

이 처럼 데코레이션 코드를 작성해주자.

 

 

 

 

 

 

 

 

 

 

 

모든 페이지를 봤다면. 이제 앱의 메인페이지로 진입할때 사용된다. 마지막 페이지에서 보여진다.
다음 페이지로 넘어가기 위한 버튼에 대한 설정이다. 마지막을 제외한 페이지에서 보여진다.
모든 페이지를 보지않고 Skip하는 경우가 많다. 나 역시 그렇다. 이럴때 사용되며 누르면 마지막 페이지로 넘어간다.
페이지 구분 점에 대한 설정 코드들이다. 하나하나 만저보면 어떤 기능인지 감이 올것이다.

추가로...

해당 코드는 페이지 넘김 에니메이션 효과들이다. 

 

 

마지막으로 Main Page에 대한 코드이다.

코드중 pushReplacement를 push 대신 사용한 이유는 죄측상단에 뒤로가기버튼을 안생기게 하기 위함이다.

 

 

[2750] 수 정렬하기

해결 포인트

sort를 이용하면 쉽게 풀이 가능하다.

답안

a = int(input())
b = []
for i in range(a):
    b.append(int(input()))
b.sort()
for j in range(len(b)):
    print(b[j])

[2750] 수 정렬하기2

해결 포인트

이전문제랑 똑같지만 좀더 시간제한이 걸려있다...

최대한 코드를 최적화 해보자.

답안

import sys
a = int(sys.stdin.readline())
b = []
for i in range(a):
    b.append(int(sys.stdin.readline()))
for j in sorted(b):
    print(j)

readline은 필수인가 싶다.

그런데 여럿문제들을 풀다보면 가끔 해당 문법때문에 오류를 뿜는경우가있다.

또 파이썬 로직을 눈으로 쉽게 확인가능한 python tutor 에서는 지원하지 않는것 같다.

[25305] 커트라인

해결 포인트

쉽게 해결 가능하지만 힌트를 주자면
sort와 reverse를 이용하면 쉽게 출력 가능하다.

답안

n, k = map(int,input().split())
num = list(map(int,input().split()))
num.sort(reverse=True)
print(num[k-1])

[1978] 소수 찾기

해결 포인트

소수란... 1과 자기자신으로만 나울 수 있는 수를 말한다.

그럼 2부터 자기자신-1 까지 수를 돌리며 나눴을때 나머지를 확인하여 소수를 판별 한다는 것이 생각날것이다.

답안

a = int(input())
b = list(map(int,input().split()))
cnt = 0
def find(a):
  if(a<2):
    return False
  for i in range(2,a):
    if(a%i==0):
      return False
  return True
for j in b:
    if find(j):
        cnt += 1
print(cnt)

 

 

[2581] 소수

해결 포인트

이전 문제와 매우 유사하다.

range의 값을 조금 수정했고,

합은 sum

최솟값은 min을 이용하면 된다.

소수가 없을 경우까지 고려하여 구현했다.

답안

a = int(input())
b = int(input())
li = []
def find(v):
    if v < 2:
        return False
    for j in range(2,v):
        if v % j == 0:
            return False
    return True
for i in range(a,b+1):
    if find(i):
        li.append(i)
if len(li) != 0:
    print(sum(li))
    print(min(li))
else:
    print("-1")

[11653] 소인수분해

해결 포인트

소인수분해에 대해 수학적으로 우선 접근하여
로직을 생각해보자

답안

a = int(input())
b = 2
while a != 1:
    if a % b !=0:
        b += 1
    else:
        print(b)
        a = a/b

입력받은 a 값을 2로 나누어 나머지가 0일때 출력하고 그렇지 않다면 b를 +1시켜 다시 나눠 나머지를 확인한다.

나머지가 0이 돨때마다 a에는 a/b의 값을 다시 넣어줘야 한다.

 

[1929] 소수 구하기

해결 포인트

해당 문제는 시간 제한이 걸려있다.

아무리 머리를 쥐어짜도... 잘 생각이 안났고 sqrt 함수를 알게돠어 사용했다.

포문의 범위를 절반 이하로 줄여 시간 내에 해결 가능했다.

답안

import sys
import math
input = sys.stdin.readline()
a,b = map(int,input.split())
def find(v):
    if v < 2:
        return False
    for i in range(2,int(math.sqrt(v)+1)):
        if v % i == 0:
            return False
    return True
for j in range(a,b+1):
    if find(j):
        print(j)

import math가 필요하다.

기본 로직은 이전 문제들과 똑같으나...

for문 range를 살펴보면 math.sqrt(v)+1가 있다. 이는 정수 v의 제곱근을 수하는 함수이며

이를통해 for문 범위를 대폭 줄여 빠르게 계산이 가능하다.

 

점점 벽을 느끼고있다..

다시한번 기초문법을 공부할 예정이다...

[2292] 벌집

해결 포인트

시작(1)로부터 주위에 둘러싼 외벽의 방 갯수가 갖는 규칙을 찾아보면 쉽게 풀이 가능하다.

시작(1)은 방하나 그자제라고 생각하면된다.

답안

a = int(input())
if a == 1: # 처음 1은 방 한개 그 자체이다.
    print(a)
else: # 이후 외벽들은 6의 배수로 증가
    cnt = 1
    b = 1
    while b < a:
            b += cnt*6 # 벌집의 갯수를 파악하기위함
            cnt += 1 # 외벽의 갯수를 파악하기위함
    print(cnt)

a가 1인 경우 1개의 방 그 자체이기 때문에 시작으로 조건을 걸어준다.

이후 외벽 부턴 6의 배수로 증가한다는 점을 확인할 수 있다.
b에는 방의 갯수를 알기위해 6의 배수를 계속 더해 대입해주고

그때 마다 카운트를 통해 외벽의 갯수를 파악한다.

 

[2869] 달팽이는 올라가고 싶다

해결 포인트

로직 구현은 쉽게 가능할것이다...

그러나 문제는 시간초과이다.

for문 while문 반목문을 사용하면 안된다.

 로직을 간단하게 식으로 바꿔줘야한다.

답안

import sys
a,b,v = map(int,sys.stdin.readline().split())
cnt = (v-b)/(a-b) 
if cnt == int(cnt):
    print(int(cnt))
else:
    print(int(cnt)+1)

시간 제한이 걸려있기에 reline을 사용해줬다.

a = 올라감
b = 내려감

v = 총 높이

기본적으로는 v / a-b 를 떠오르겠지만 밤에 내려간다는것을 고려했을때 애초에 v(총 높이)에서 b(내려감)을 빼주고 시작하자.

나눗셈을 진행하면 소숫점이 나올것이다.

2.0 이면 2일 걸리는거지만 2.1은 3일 걸린다는것이다. int형으로 소숫점을 버리고 +1 시켰다.

 

오늘 카페가 너무 바빳다....

코딩할 시간이 없었다...

그래서 한문제다 ㅎㅎ

 

[1712] 손익분기점

해결 포인트

손익분기점에 대한 수학적 지식이 있으면 금방 해결할 수 있다.

손익분기점이 존재하지 않는경우는 -1을 출력하고 이외는

식을 통해 출력하면 된다.

답안

a,b,c = map(int,input().split())
if b>=c:
    print(-1)
else:
    print(int(a/(c-b))+1)

태풍이 가고 날씨가 너무 화창하다.

바람은 많이 불지만 아직 햇빛은 너무나 덥다~

 

어제에 이어 리스트 + 반복문 뿌시기다. 이번 문제중 4344번이 진짜 너무나도 오래걸렸다...

벌써부터 막히면 안되는데..

[4344] 평균은 넘겠지

해결 포인트

테스트 케이스를 받아 그 수만큼 점수를 받아야한다.

그리고 받은 데이터 인덱스 0은 학생의 수 이며 이후는 각 학생의 점수를 받는다.

그렇게 첫번째 리스트가 완성되면 인덱스 0(학생수) 를 제외하고 더한값을 변수에 저장하고 인덱스 0(학생수)로 나누어 평균값을 변수에 저장한다.

평균값과 각 학생 점수를 비교하여 카운트하여 평균을 넘는 학생수를 구하고 전체 학생수를 이용해 비율을 구한다.

답안

a = int(input())
b = []
result = []
for i in range(a):
    b.append(list(map(int, input().split())))
    sum = 0
    avg = 0
    count = 0
    for j in range(len(b[i])-1):
        sum = sum + b[i][j+1]
        avg = sum / b[i][0]
    for n in range(len(b[i])-1):
        if avg < b[i][n+1]:
            count = count + 1
    result.append(count/b[i][0]*100)
for m in range(len(result)):
    print('%.3f'%(result[m])+'%')

[2739] 구구단

해결 포인트

for문을 사용하면 0부터 시작한다는것을 인지하고 작성해보자

답안

a = int(input())
for i in range(9):
    print("{} * {} = {}".format(a, i+1, a*(1+i)))

[10950]  A+B -3

해결 포인트

처음에 입력받는 수 만큼 이후 값들을 입력받아야한다.

답안 

a = int(input())
for i in range(a):
    x,y = input().split()
    print(int(x)+int(y))

[8393] 합

해결 포인트

이전 구구단 문제와 같이 for문 사용시 0부터 시작한다는 점을 고려하여 작성하면 된다.

답안

a = int(input())
sum = 0
for i in range(a):
    sum = sum + (i+1)
print(sum)

[25304} 영수증

해결 포인트

두번째로 받는 물건 종류 수대로 아래 각 물건 가격과 개수를 받고

받은 가격과 개수를 곱해 변수에 저장한다.

각각의 물건 총 값을 더해 기존 입력 받은 총금액과 일치하는지 알아보면된다.

답안

sum = int(input())
sum2 = 0
a = int(input())
for i in range(a):
    x,y = input().split()
    sum2 = sum2 + (int(x)*int(y))
if sum == sum2:
    print("Yes")
else:
    print("No")

+ Recent posts