코틀린-안드로이드

43일차)알고리즘 문제(가장 큰 수), 피그마 강의, 팀프로젝트

songyooho 2024. 7. 5. 20:46

>알고리즘 문제

1. 가장 큰 수

1)문제

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

2)솔루션

class Solution {
    fun solution(numbers: IntArray): String {
        if(numbers.sum()==0) return "0"
 
        var num=Array(numbers.size){Pair(-1,-1)} //바꾼수, 원래수
        for((idx,i) in numbers.withIndex()){
            if(i<10){
                num[idx]=Pair(111111*i,i)
            }else if(i<100){
                num[idx]=Pair(10101*i,i)
            }else if(i<1000){
                num[idx]=Pair(1001*i,i)
            }else{
                num[idx]=Pair(i,i)
            }
        }
        return num.sortedByDescending{it.first}.map{it.second.toString()}.joinToString().replace(", ","")
        
    }
}

-1000을 제외한 나머지 수들의 자릿수의 공배수인 6자리로 만들어서 비교하여 풀었음

 

3)증명: 왜 공배수 자릿수로 바꾼뒤 비교 하면 맞는가?

<1>일반화: t자리수 이하의 어떤 수들에 대하여 임의의 두수를 골라 크기를 비교 하자

-공배수는 t!

-임의로 뽑은 두 수의 자리수가  i,j,라 하자 

-그러면 기존 수가 ai,aj라 할시, 변환된 수는

-ait=ai(1 + 10^i + 10^2i + 10^3i + ... + 10^(t!/i))

-ajt=aj(1 + 10^j + 10^2j + 10^3j + ... + 10^(t!/j))

-둘을 이어붙였을때 ai가 앞에 오는것이 크거나 같다 가정하자

-즉, ai*10^j+aj>=aj*10^i+ai

-ai(10^j-1)>=aj(10^i-1)

-양변 10-1로 나눔: ai(10^(j-1)+10(j-2)+...+10+1)>= aj(10^(i-1)+10(i-2)+...+10+1)

-양변 (1 + 10^i + 10^2i + 10^3i + ... + 10^(t!/i))곱하고 (10^(j-1)+10(j-2)+...+10+1)로 나눔

- (10^(i-1)+10^(i-2)+...+10+1)* (1 + 10^i + 10^2i + 10^3i + ... + 10^(t!/i))=1+10+10^2+...+ 10^(t!) 이므로

-그걸 다시 (10^(j-1)+10(j-2)+...+10+1)로 나누면 1+10^j+...+10^(t!/j)가 된다. 

-즉  ait>=aj(1+10^j+...+10^(t!/j))=ajt. 

그러므로 공배수 자릿수로 바꾼뒤 비교하면 이어붙였을때 어느쪽이 앞에 오는게 맞는지 알 수 있다.

 

4)느낀점: 직관으로 풀긴 했지만 증명을 통해서 좀 더 머릿속에 남게 된것같다.

 

 

 

>피그마 강의

-파일 생성
<1>좌측 draft:개인적인 파일 생성
<2>팀프로젝트 생성: create new team

-프레임(frame)
<1>좌상단 우물정자 아이콘: 주로 안드로이드 small기준으로 만들음
<2>디자인할 배경이 되는 것

-텍스트
<1>좌상단 T 아이콘
<2>우측 패널로 위치, 크기, 색조절가능
<3>행간 자간 조절가능(A위아래 선 있는게 행간, 좌우에 선있는게 자간)

-도형
<1>좌상단 도형 아이콘
<2>쉬프트를 누르고 만들면 가로세로비율이 같게 생성이됨
<3>알트를 누르고 가져오면 복사가됨

-펜툴
<1>자주 사용은 안 함
<2>좌상단 만년필촉 모양 아이콘
<3>점을 찍고 드레그하면 곡선도 가능
<4>첫 포인트와 마지막 포인트 연결시 도형이 생성됨
<5>도형 선택한 상태에서 상단 중앙의 맨 우측 아이콘으로 도형의 교집합, 합집합등으로 변형 가능

-정렬
<1>개체간의 정렬: 드레그로 모두 선택 후 우측 상단의 정렬아이콘으로 정렬 가능
<2>constraint: 도형이 속한 프레임을 기준으로 constraint설정 가능(constraint layout과 비슷)
@constraint를 center로 설정시 도형이 변함에 따라 center도 변하므로 도형 위치도 같이 변함 
@constraint를 scale로  설정시 도형 비율도 가로세로 크기 변화에 따라 같이 변함

-폰트 스타일
@컨트롤 클릭:그룹안의 객체를 바로 클릭 가능
<1>스타일 생성: 
(1)우측에서 text 옆에 사각형을 이루는 점 4개 클릭 후 +클릭
(2)이름은 "분류/굵기/사이즈" 로 명칭을 맞춤=>피그마에서는 슬래시를 넣으면 상위 하위 개념이 적용됨 
@두 줄 이상 작성되는 본문은 글자크기보다 행간이 넓어야 가독성이 좋음 =>행간 150퍼센트로(퍼센트 기호 넣는것 유의)
(3)정렬: 여러 개체를 드래그로 선택하면 우하단에 버튼 생김 =>누르면 자동 정렬
(4)스타일 적용: 점 4개 사각형이나 이미적용되어있으면 육각형을 눌러 선택가능
(5)스타일 해제: 스타일명 위에 커서를 올려두면 해제 버튼이 떠오름. 이걸 누르면 해제
(6)스타일값 변경:이름 변경은 이름을 더블클릭, 폰트값 수정은 폰트변경버튼위에 커서를 올려두면 뜨는 조절 버튼을 클릭

-컬러 스타일
(1)컬러지정:Fill에 컬러값을 눌러 수정가능: 펜모양을 클릭하면 직접 선택가능
(2)스타일 추가는 동일방식
(3)이름은 "분류/컬러명"

-컴포넌트
(1)반복적으로 재사용 되는 개체를 컴포넌트로 저장함
(2)아이콘 프레임 사이즈는  24*24가 기본(아이콘이 아니라 아이콘을 감싸는 프레임 의미)
(3)컴포넌트 등록: 프레임 선택후 상단 중앙 왼쪽에 마름모꼴을 클릭해서 등록
@드레그후 멀티플 컴포넌트를 선택시 한번에 여러개 등록가능
(4)이점: 컴포넌트를 복사하면 인스턴스가 생성
-다른 컴포넌트로 자유롭게 변경가능
-메인 컴포넌트(원본)의 색과 크기 변경시 인스턴스들도 변경됨
@주의:인스턴스를 직접 변경하면 나중에 메인 컴포넌트가 변경돼도 안바뀜

-오토레이아웃
(1)오토레이아웃이란: 지정한 값이나 비율에 따라 자동으로 개체와 개체 사이 간격을 맞춤
(2)개체 누르고 shift+A하면 오토레이아웃생성
(3)좌측 autolayout에서 상하좌우 간격(꼭지점없는 사각형 테두리)과 정렬 위치(점9개 흰 사각판)를 정할 수 있음
(4)resizing:좌측 Frame에 있는 ><와 상하 ><표시
-Hug는 내부 개체 크기 변화에 따라 감싼 레이아웃크기도 변함
-Fixed는 내부 개체 크기가 변해서 넘치더라도 감싼 레이아웃 크기는 고정

 

 

>팀 프로젝트

https://appdevelopjava.tistory.com/57