코틀린-안드로이드

25일차)알고리즘 문제(연속 부분 수열 합의 개수, H-Index, 인사고과), 입문 강의 1~3주차

songyooho 2024. 6. 18. 23:38

>알고리즘 문제

1. 연속 부분 수열 합의 개수

1)문제

문제 설명

철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.


원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항
  • 3 ≤ elements의 길이 ≤ 1,000
  • 1 ≤ elements의 원소 ≤ 1,000

 

2)솔루션

class Solution {
    fun solution(elements: IntArray): Int {
        var answer: Int = 0
        var nums=hashSetOf<Int>()
        for(i in 1..elements.size){
            
            for(j in elements.indices){
                var sum=0
                var idx=j
                repeat(i){
                    sum+=elements[(idx)%elements.size]
                    ++idx
                    idx%=elements.size
                }
                nums.add(sum)
            }
            
        }
        return nums.size
    }
}

-합들의 종류수이므로 합한 결과값들을 해시셋에 모아둠

-1에서 수열 사이즈 만큼까지 반복(합할 원소의 개수)

-j는 0부터 수열 사이즈-1까지 반복(합하기 시작할 원소 인덱스)

-합한 결과값을 nums에 모아두고 최종 결과는 nums의 사이즈

 

 

2. H-Index

1)문제

문제 설명

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

2)솔루션

class Solution {
    fun solution(citations: IntArray): Int {
        val arr=IntArray(10001){0} //인용횟수당 편수
        for(i in citations){
            arr[i]++
        }
        var sum=0
        for(i in 10000 downTo 0){
            sum+=arr[i]
            if(sum>=i) return i
        }
        return -1
    }
}

-인용 횟수가 0회이상 10000회이하 이니 10001짜리 배열을 생성

-배열의 인덱스는 인용횟수, 값은 인용횟수가 같은 논문의 수

-모든 논문을 살피며 배열의 값을 세팅

-이후 역순으로 살피면서 H-Index의 조건을 만족하는 경우를 찾음.

 

 

3. 인사고과

1)문제

완호네 회사는 연말마다 1년 간의 인사고과에 따라 인센티브를 지급합니다. 각 사원마다 근무 태도 점수와 동료 평가 점수가 기록되어 있는데 만약 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한 번이라도 있다면 그 사원은 인센티브를 받지 못합니다. 그렇지 않은 사원들에 대해서는 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됩니다. 이때, 두 점수의 합이 동일한 사원들은 동석차이며, 동석차의 수만큼 다음 석차는 건너 뜁니다. 예를 들어 점수의 합이 가장 큰 사원이 2명이라면 1등이 2명이고 2등 없이 다음 석차는 3등부터입니다.

각 사원의 근무 태도 점수와 동료 평가 점수 목록 scores이 주어졌을 때, 완호의 석차를 return 하도록 solution 함수를 완성해주세요.


제한 사항

  • 1 ≤ scores의 길이 ≤ 100,000
  • scores의 각 행은 한 사원의 근무 태도 점수와 동료 평가 점수를 나타내며 [a, b] 형태입니다.
    • scores[0]은 완호의 점수입니다.
    • 0 ≤ a, b ≤ 100,000
  • 완호가 인센티브를 받지 못하는 경우 -1을 return 합니다.

 

2) 솔루션

class Solution {
    fun solution(scores: Array<IntArray>): Int {
        var answer: Int = 0
        var hset=ArrayList<Int>()
        var mysum=scores[0][0]+scores[0][1]
        
        
        
        
        for(i in scores.indices){
            if(scores[i][0]+scores[i][1]>mysum){
                hset+=i
            }
        }
        
        val tset=HashSet(hset)
        tset+=0
        
        for(i in tset){
            var flag=true
            for(j in hset){
                if(scores[i][0]<scores[j][0]&&scores[i][1]<scores[j][1]) {
                    if(i==0) return -1
                    flag=false
                    break
                }
            }
            if(flag&&i!=0) answer++
        }
        
        return answer+1
    }
}

-인센티브를 못받는지 여부는 원호보다 합점수가 낮은 사람은 정답과 관련이 없기에 우선 합점수가 높은 사람을 찾음

-원호가 인센티브를 못받는지 체크를 따로 하면 시간 초과가 나기 때문에 tset이란 원호를 포함하는 집합을 추가로 만들음

-원호보다 점수높은 사람들에 대해 인센티브를 못받는 사람을 체크하고 원호의 등수를 체크하면서 원호의 인센티브 받는지 여부도 함께 체크함

 

>입문 강의

 

2주차
-필요라인에 f3을 눌러 북마크 =>ctrl f3으로 바로 가기
-ctrl d 한줄 복사 붙여넣기
-ctrl / 주석처리
-structure: 함수 변수명 한눈에 보기
-Logcat: 로그찍어 확인
-profiler 메모리 네트워크등의 사용량
-device Explorer 에뮬레이터 내의 파일 탐색기
-string.xml을 이용하는 이유-하드코딩시 다국어 지원 불가 =>string_kr같은 여러버전을 만들어 다국어 지원
-로그캣 사용법: 필터는 pakage:mine으로, 로그 찍는건 Log.d("태그", "메세지")

3주차

UI구성
1. 뷰(view)란: 안드로이드 앱의 기본 구성 단위
2. 구성
1)위젯(widget): 뷰의 서브클래스. 시각적모양을 지님
-종류: 버튼,메뉴,리스트
2)레이아웃: 뷰그룹의 서브클래스. 다른 뷰를 포함하며 정렬하는 기능을 지님

3.위젯
1)위젯이란: 뷰의 서브 클래스중 화면에 보이는 요소들
2)뷰란: 모든 UI컴포넌트들의 부모 클래스
<1>뷰의 속성은 모든 UI컴포넌트들에서 사용가능
(1)id
-식별자 지정 형식:@+id/아이디
=>@는 xml에 아이디 리소스란것을 알려주고 +는 R.java클래스에 새로운 리소스 이름을 추가하는 역할
-식별자 참조 형식:@id/아이디
=>기존에 정의된 아이디를 참조해서 가져올시 사용. id들을 res/values/ids.xml에서 관리할때 이 방법으로 사용
=>이 방법으로 아이디 중복사용을 피할 수 있음

(2)layout_width, layout_height
-match_parent, wrap_content
-dp: 밀도와 관련된 상대값
=>160dpi(mdpi)기준 1dp가 1px. 즉 320dpi(xhdpi)라면 1dp는 2px
@160dpi는 320*480(px), 320dpi는 720*1280(px)
@dpi란:1인치당 들어간 픽셀 개수
=>고해상도에서 px을 쓰면 저해상도에 비해 크기가 작아진다
=>반면 dp로 하면 해상도와 상관없이 크기가 동일

3)종류
<1>TextView
(1)주요속성
-text, textSize,textColor
-textStyle: normal,bold, italic
-typeface: 폰트(normal, sans, serif, monspace
-singleLine: 속성값이 true면 텍스트가 위젯폭보다 길때 강제로 한줄에 출력

<2>EditText
(1)주요 속성
-TextView와 동일 속성들 사용 가능
-inputType:

=>키보드 타입 설정값

  • “text”:일반적인 텍스트 키보드
  • “phone”:전화번호 입력 키보드
  • “textEmailAddress”:@문자를 가진 텍스트 키보드

=>키보드 행위 설정

  • “textCapWords” : 문장의 시작을 대문자로 변환
  • “textAutoCorrect” : 입력된 단어와 유사한 단어를 제시하고 제시된 단어 선택 시,입력된 단어를 대치
  • “textMultiLine”:여러 줄을 입력 받을 수 있음

@여러개를 넣고 싶으면 | 로 이어주면 됨. ex)"text|textMultiLine"

 

<3>Button

(1)버튼은 아이콘 표시 가능

(2)클릭 구현 방법

-onClick속성에 함수명을 쓴 뒤, 코틀린 파일에서 Activity안에 클릭시 작동할 함수를 작성한다

-id로 객체 등록(findViewById<Button>(R.id.아이디)) 후 setOnClickListener{}를 사용한다

 

<4>버튼 구현

(1)ImageView:

-대부분 이미지 버튼은 이미지 뷰를 사용

-Clickable 속성을 true로 지정

-해상도 처리를 위해 dpi별로 이미지 필요-5개(hdpi, mdpi,xhdpi,xxhdpi,xxxhdpi)

-src에 selector를 이용해서 상태별로 이미지 삽입가능: state_enabled="", state_pressed=""

 

(2) 9-patch이미지

 -해상도가 변화해도(예를 들어 가로모드로 변환) 늘리는 과정에서 이미지가 깨지지않는 것

 

<5>ImageView 

(1)이미지뷰란: 이미지를 넣는 뷰

(2)추가: 보통 png를 사용하고(투명도 때문) res/drawable에 넣어서 사용

=>해상도에 따라 별도의 폴더생성후 그에 맞는 이미지를 넣어야함(drawable-xhdpi와 같이)

(3)이미지 파일명:소문자 영어와 숫자와 언더바로만 구성. 시작부분엔 숫자는 안됨(언더바와 영어 소문자만)

(4)이미지 삽입: 컬러값도 가능

-xml: src속성에서 리소스 아이디를 넣음

-코드: imageView.setImageResource(R.drawable.이미지이름) 으로 설정가능

(5)이미지뷰의 영역과 이미지 크기

-같은경우: 문제없이 됨

-이미지가 작은 경우: 크기대로가거나 가로나 세로에 맞춰 늘리거나 꽉차게 늘릴수 있음

-이미지가 큰 경우: 잘리거나 가로나 세로에 맞추거나 이미지뷰에 맞추게 줄일 수 있음

-scaleType을 이용:

[1]Center: 이미지 그대로 이미지뷰 중심에 위치시킴. 크기가 크면 잘릴 수 있음

[2]centerCrop: 이미지 비율 유지하며 가로 세로중 짧은쪽을 이미지뷰에 맞춤. 긴쪽은 잘림

[3]centerInside: 가로세로중 긴쪽이 이미지 뷰에 들어가도록 비율을 유지해 줄임. 원래 이미지뷰보다 작으면 가운데 위치하고 크기가 늘어나진 않음.

[4]fitCenter: 이미지뷰에 맞춰 늘리거나 줄임. 비율 유지

[5]fitStart: 비율 유지하여 이미지뷰에 맞춰 크기조절. 좌상단 기준 정렬(가로가 맞으면 위로, 세로가 맞으면 좌측으로)

[6]fitEnd: 비율 유지하여 이미지 뷰에 맞춰 크기 조절. 우하단 기준 정렬

[7]fitXY: 비율상관없이 이미지뷰에 꽉채움

[8]matrix: 크기, 비율 유지하며 이미지뷰 좌상단 기준 정렬. 크기가 크면 잘릴 수 있

 

 

4. 레이아웃

1)레이아웃이란: ViewGroup파생 클래스로 View들을 정렬

2)종류

<1>LinearLayout

-orientation속성 값(vertical, horizontal)에 따라 해당 방향으로 겹치지 않게 쌓임

-LayoutWeight: 가중치를 이용해 비율로 나눔. (특정값이 주어진 뷰들이 차지한 넓이를 제외한 나머지를 weight값에 따라 나눠가짐)

=>layout_weight 가중치값을 지정

 

<2>RelativeLayout

-부모뷰 기준 안에서 어느쪽에 위치할지, 자식 뷰간 관계를 지정해 어느쪽에 위치할지(예를 들어 A의 왼쪽 같은 방식) 지정하여 배치하는 레이아웃

-겹치기 가능

-속성값: 자식 위젯끼리는 뷰의 아이디, 부모 뷰와는 true, false

 

 

<3>TableLayout

-행과 열로 이루어진 격자 형식의 레이아웃

-거의 사용X

 

<4>FrameLayout

-하나의 자식위젯만 표현할때 사용

-겹쳐지기 때문에 가장 최근에 추가된 뷰가 상위에 표현

-좌상단 정렬

-xml상 제일 아래것이 표현

 

<5>ConstraintLayout

-제약 조건으로 화면을 구성

-복잡한 레이아웃을 단순한 계층구조로 표현가능

-자식뷰간 상호 관계 정의와 뷰비율 조절가능

 

-위젯 크기 설정:wrap_content, match_constraint(영역을 꽉채움)

-상대 정렬

[1]사이드 핸들: 각변 가운데 위치.  좌우 핸들은 가로축, 상하 핸들은 세로축 간의 정렬 설정

@최소 3개는 설정해야 에러 안남

[2]베이스라인 핸들: ab라뜨는 아이콘을 클릭해 사용가능. 텍스트에 연결시 텍스트 하단과 일치하게 정렬

-Constraint툴바

[1] autoconnect: 위젯 배치시 자동으로 이웃한 위젯과 관계를 맺어줌

[2]clear all constraints: 모든 관계 삭제

[3]infer constraints: 레이아웃내 배치된 모든 위젯을 현재위치 기반으로 관계를 맺음

[4]default margin: 위젯간 기본 마진값 지정

[5]guidelines: 수평, 수직 가이드라인을 만들어 위젯을 이 가이드라인을 기준으로 정렬

 

4)Margin,padding,gravity,layout_gravity

<1>margin: 바깥쪽 여백을 두는것

<2>padding: 안쪽 여백을 두는것

<3>gravity: 뷰 내용물들의 위치 정렬

<4>layout_gravity: 부모뷰 기준 자기자신의 위치 정렬방식 지정

=>layout_gravity종류

  • BOTTOM : ­부모 뷰에서 아래 쪽에 위치시킴
  • CENTER ­: 부모 뷰의 중앙에 위치시킴
  • CENTER_HORIZONTAL : ­부모 뷰의 수평기준으로 중앙에 위치시킴
  • CENTER_VERTICAL : ­부모 뷰의 수직기준으로 중앙에 위치시킴
  • END­ : 부모 뷰에서 텍스트 방향의 끝(한글이나 영어의 경우는 오른쪽)에 위치시킴
  • LEFT : ­부모 뷰에서 왼쪽에 위치시킴
  • RIGHT : ­부모 뷰에서 오른쪽에 위치시킴
  • TOP : ­부모 뷰에서 위쪽에 위치시킴

 

 

4. 스타일과 테마

1)Style: 여러 속 값을 한번에 지정 =>사용은 style 속성값으로

2)Theme

-개별뷰가아닌 Activity전체나 애플리케이션에 적용되는 스타일

-스타일을 테마로 적용시키면 액티비티 또는 애플리케이션 내의 모든 뷰가 스타일이 디폴트로 적용됨