오늘은 협력사 설명회도 있고, 멘토님 미팅도 있었어서 많은 시간을 투자하진 못했지만 🤣
그래도 알찬 하루를 보냈다. 확실히 10시 출근 ~ 24시 퇴근 루틴을 세우고, 그 안에 몰입해서 개발을 하려고 노력하니까 능률이 좋은 것 같다 :D
우선 회원가입-명함생성-명함첩(자동로그인) 으로 이어지도록 구현했다.
보통 서비스를 사용할 때, 회원가입을 할 때 해당 어플리케이션에 필요한 자료를 입력받게 되고, 그 이후엔 바로 사용할 수 있도록 바로 서비스에 접속되는 것이 가장 사용자에게 편하고 직관적인 방법이라고 느껴왔기 때문이다.
기존에는 자동로그인을 고려해서 무조건 명함첩으로 라우팅을 해주고, 만약 로그인 정보가 없으면 로그인 화면으로 튕기도록 하는 로직으로 되어 있었다. 라우팅 화면은 다음과 같다.
Widget build(BuildContext context) {
return MaterialApp(
title: 'Nemo test',
theme: style.theme,
initialRoute: '/contacts',
routes: {
'/': (context) => LoginPage(),
'/signup': (context) => SignupPage(),
'/contacts': (context) => ContactsPage(),
'/message': (context) => MessagePage(),
'/mypage': (context) => MypagePage(),
'/sharing': (context) => SharingPage(),
'/namecard': (context) => NameCardGenerator(),
}, // end routes
);
}
하지만, 이렇게 하니까 명함첩이 잠깐 보였다가 로그인 화면으로 튕기다보니 깜빡이는 것이 상당히 눈에 띄었다. 그래서 라우팅을 최초에 initPage로 하도록 하고, 이후에 3가지 로직에 따라 각기 다른 페이지로 연결되도록 처리해주었다.
로그인이 되어있지 않다면, 로그인 페이지로 이어지도록 하였다.
명함생성은 나중에 하고 싶거나 불가피한 사유로 인해 회원가입만 하고 어플리케이션을 종료하는 경우도 있을테니, 그런 경우엔 로그인이 확인되더라도 명함생성 페이지로 이어지도록 하였다. 즉, 로그인이 되어있더라도 생성된 명함이 존재하지 않으면 명함생성 페이지로 이어진다.
로그인도 되어있고 명함생성도 되어있다면, 명함첩으로 바로 넘어가도록 해주었다.
Widget build(BuildContext context) {
return MaterialApp(
title: 'Nemo test',
theme: style.theme,
initialRoute: '/',
routes: {
'/': (context) => InitPage(),
'/login': (context) => LoginPage(),
'/signup': (context) => SignupPage(),
'/contacts': (context) => ContactsPage(),
'/message': (context) => MessagePage(),
'/mypage': (context) => MypagePage(),
'/sharing': (context) => SharingPage(),
'/namecard': (context) => NameCardGenerator(),
},
);
}
이렇게 변경해주었더니, 전반적인 어플리케이션의 최초 라우팅이 아주 깔끔해졌다😊
이 부분에 대한 gif는 initPage 디자인까지 마치고나서 내일 공개하도록 하겠다 !
오늘은 새로운 플랫폼인 '구름'이라는 곳에서 문제를 풀었다.
백준과 프로그래머스의 딱 중간같은 느낌............
오늘 푼 문제는 외계인과 용돈기입장이라는 문제였다.
생긴건 쉬워보였는데, 거의 절반이 시간초과가 뜨기 시작했다. 펑... 펑....처음엔 그냥 그때그때 리스트 인덱싱을 하고, 거기에 sum을 적용하면 되지 않을까 싶었는데, 그렇게 해서 시간초과가 났기에.... 이런 문제에서 시간초과라면 DP 아닌가? 라는 생각이 들었다.
그래서 곰곰이 생각을 해보니까, 사실 그때그때 인덱싱을 해서 합을 구하면 너무 시간이 오래 걸린다. 주어진 날짜구간 [a,b]의 차이들이 항상 2x10⁵ 에 근접한다면....? 아주 끔찍할 것이다.
한 번에 1일차부터 N일차까지 쭉 훑으며 그때그때의 잔액을 저장해놨다가, 이후에 구간 [a,b]가 주어지면 그냥 날짜a의 잔액을 날짜b의 잔액에서 빼면 되지 않을까...? 라는 생각이 든 순간, 유레카!
코드로 그대로 옮겨보았다.
N, M = map(int, input().split())
DP = [0] * (N+1)
L = input().split()
for i in range(1, N+1):
DP[i] = int(L[i-1]) + DP[i-1]
for _ in range(M):
s, e = map(int, input().split())
result = DP[e] - DP[s-1]
print('+' + str(result) if result > 0 else result)
코드로 옮기고 나서 제출했더니, 통과했다!
오늘은 15분 컷 ! 내일도 빨리 풀고싶다 :) 화이팅 😊