어디까지나 개발자지만, 기본적으로 피그마를 다룰 줄 알면 더 좋을 것 같아서 이번 기회에 다뤄보았다. 다뤄보는 김에 기록하기.
기본적인 프레임은 아이폰 11 Pro (375) / Android (360) 을 잡아두고 진행하되, 메인으로 한 os를 잡고 가는 것이 수월하다.동시에 2개를 구현하는 것도 좋지만,, 일이 2배니까! 디자인적 측면에서는 아이폰이 홍보 이미지를 만들 때 더 예뼈보여서 선호한다고는 하던데, 나는 일단 안드로이드를 기반으로 작업하려고 한다.
폰트 사이즈는 기본 사이즈를 14정도, 조금 큰 요소를 16정도로 잡는다. 10씩 값을 이동할 때 shift 키 누르면 수월.
한 요소를 component로 만들어줄 때는 ctrl+shift+k로 묶어줄 수 있다.
프로토타입 기능을 사용해서 실제로 어떻게 서비스되는지 동적으로도 보여줄 수 있음.
auto layout 기능도 잘 쓰면 유용할 듯 함 :)
inspect 란에서 개발 환경을 살펴볼 수 있음. 이미지 추출 역시 Export를 사용하면 됨.
공식 문서를 정말 열심히 뜯어보면서 사용하면 된다. 일단 flex:1은 필요가 없다. 얘는 화면 전체를 먹어야 하니까. 친절하게 나와있는 공식문서 설명을 보면서 따라가보자. 많이 사용할법한 속성으로는 하나하나의 요소를 page단위로 만드는 pagingEnable도 있고, style 속성이 먹지 않기 때문에 스크롤뷰에서만 가능한 contentContainerStyle prop이 있을 것이다. 그리고 현재 기기의 가로 크기를 받아오려면 Dimensions과 관련된 API를 사용하면 된다.
Touchable
버튼이 눌렸음을 가시적으로 보여줄 수 있도록 유저가 터치했을 때 피드백을 주는 요소들이 몇가지 있다.
TouchableOpacity : 클릭했을 때 약간 투명해짐
TouchableHighlight : 클릭했을 때 배경색을 변경
TouchableWithoutFeedback : 클릭한 여부만 받아오고 UI의 변화는 없음
이 중 버튼에 관련된 부분은 투명도를 건드리는 컴포넌트로 감싸주는 것이 대부분이다. 공식 문서를 살펴보면 이 컴포넌트보다 더 나은 요소를 pressable로 소개하는데 조금 더 세분화된 속성을 제공한다. 가령 hitSlope 옵션을 사용하여 더 넓은 영역까지 클릭이 되도록 설정해줄 수도 있다. (기존 웹에서는 버튼에 padding을 넣어서 해결했듯이)
유일성을 만족하기 위해 set 자료형을 사용했다. 키의 최대 길이가 8개로, 가능한 키 조합을 모두 구해 각 경우별로 set 자료형으로 변환해도 길이가 변하지 않는 것을 체크했다.
2차원 배열은 set연산을 적용하기가 골치 아파 중간에 한번 tuple 자료형으로 변환해주었다.
유일성을 만족하는 모든 경우의 수를 ck_list 배열에 저장한 뒤, ck_list 배열을 돌면서 최소성을 만족하는지 체크했다.
최소성을 만족하는지 체크하기 위해 실제로 최소성을 만족하는 후보키 배열 ck를 만들었다. 모든 후보키에 대해 합집합을 수행해 키가 최소성을 만족하는 경우를 체크했다. (단순히 합집합 한번만 했더니 [(0), (1,2)]과 [1,2,3] 경우를 계산하는 과정에서 0, (1,2,3) 이 조건을 만족하는 것으로 되서 cnt 변수를 통해 모든 후보키에 대해서 고려하도록 수정했다.)
한시간정도 걸린 문제였다. 은근 어려워..!
코드
from itertools import combinations
def solution(relation):
answer = 0
column_list = [i for i in range(len(relation[0]))]
# 모든 후보키가 될 수 있는 경우의 수(컬럼 인덱스 배열)
cases = []
for i in range(1, len(column_list)+1):
cases.append(list(combinations(column_list, i)))
ck_list = []
for case_list in cases:
for case in case_list:
all_senario = []
for row in range(len(relation)):
arr = [relation[row][c] for c in case]
all_senario.append(tuple(arr))
# print(all_senario)
if len(all_senario) == len(list(set(all_senario))):
ck_list.append(case)
# print(ck_list)
ck = []
for key in ck_list:
if len(ck) == 0:
ck.append(key)
continue
cnt = 0
for k in ck:
if set(key) != set(k) | set(key):
cnt += 1
if cnt == len(ck):
ck.append(key)
answer = len(ck)
return answer