본문 바로가기

[TIL][내일배움캠프]

[내일배움캠프][TIL] 23.12.13 (수) - H-Index, Android 앱개발 입문 - Activity, Intent

1. 코드카타

 

오늘 푼 알고리즘 문제는 'H-Index'이다.

 

 H-Index

 

역시나 오늘도 수학적인 사고를 요하는 문제가 나왔다.

 

위의 입출력 예를 설명하자면, citations 배열 안에는 5개의 논문이 있고, 배열의 숫자는 각각의 논문이 인용된 횟수다.

이 때, 3번 이상 인용된 논문이 3편이기 때문에 이 배열의 H-Index 값은 3이 된다.

 

이걸 코드로 표현하면 다음과 같다.

 

class Solution {
    fun solution(citations: IntArray): Int {
        var answer = 0
        
        for (i in citations.indices) {
            var num: Int = 0
            answer++
            
            for (j in 0 until citations.size){
                if (answer <= citations[j]) num++
            }
            
            if (answer >= num) break
        }
        
        return answer
    }
}

 

우선 answer에 1씩 더하면서, citations 배열에 answer보다 큰 값을 가지는 인덱스의 개수를 num에 저장한다.

그리고 그 num이 answer보다 같거나 작아질 때까지 계속 반복한다. 마지막으로 break 이후의 answer값을 리턴.

 

 

그런데 나는 여기서 간과한 점이 하나 있었다.

(대충 오답이 나왔다는 이야기)

 

극단적인 케이스, 즉 코너 케이스를 고려하지 않았다는 것.

 

예를 들어보자.

어떤 케이스 중에는 [3, 3, 3, 3, 3]도 있다고 하자.

 

이러면 3이 3번 이상 인용됐지만, 4는 1개도 없으므로 3이 return되야 한다.

하지만, 위의 코드같은 경우 조건대로 하게 되면 4가 나오게 된다.

 

그렇기 때문에, 여기서 조건을 몇가지 더 추가해서 위와 같은 케이스가 나오지 않도록 만들어야 한다.

 

class Solution {
    fun solution(citations: IntArray): Int {
        var answer = 0
        var h = 0
        
        for (i in citations.indices) {
            var num: Int = 0
            h++
            
            for (j in 0 until citations.size){
                if (h <= citations[j]) num++
            }
            
            if (h > num) break
            answer++
        }
        
        return answer
    }
}

 

이렇게 하면 h와 answer가 따로따로 움직이므로 위와 같은 조건에서도 아무런 문제 없이 정확한 answer 값을 return할 수 있게 된다.

 

오늘의 교훈 : 극단적인 케이스도 고려해서 코딩을 짤 것.

 

 

 

2. Android 앱개발 입문 - Activity, Intent

 

저번 시간에는 앱의 UI와 관련된 Widget과 Layout에 대해 알아봤다.

 

이번 시간에는 앱을 실질적으로 가동시키기 위한 Activity와 Intent에 대해 알아보고자 한다.

 

 

액티비티 (Activity)

 

※ 안드로이드 4대 컴포넌트 : 액티비티, 서비스, 브로드캐스트 리시버(Broadcast Receiver), 콘텐트 프로바이더(Content Provider)

 

액티비티(Activity)는 안드로이드 애플리케이션의 핵심 구성 요소로서 사용자가 직접 상호 작용하는 창(window)을 의미하며, 각 액티비티는 독립적인 화면으로서, 사용자에게 다양한 작업을 수행할 수 있는 인터페이스를 제공.

 

  • 액티비티는 사용자가 애플리케이션과 상호 작용하는 방식을 정의하는 중요한 요소이며, 안드로이드에서의 사용자 경험을 결정짓는 중추적인 역할을 담당함.
  • setContentView()를 이용하여 액티비티에 사용자 인터페이스를 정의한View를 설정
  • 모든 Activity컴포넌트는 Android Manifest파일에 등록되어야 함

○ Android Manifest 파일의 역할

  • 패키지 이름 설정:
    • 앱의 고유 식별자로서, 애플리케이션의 패키지 이름을 설정합니다. 이 이름은 Google Play와 같은 앱 스토어에서 앱을 구별하는 데 사용
  • 구성 요소 선언:
    • 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더와 같은 애플리케이션 구성요소들의 존재를 시스템에 알림
  • 권한 설정:
    • 앱이 사용자의 기기에서 특정 작업을 수행하기 위해 필요한 권한을 명시합니다. 또한, 다른 앱이 이 애플리케이션과 상호작용하기 위해 필요한 권한도 설정 가능

 

 

인텐트(Intent)

 

인텐트는 일종의 메시지 객체로, 이것을 사용해 다른 앱 구성요소(액티비티, 서비스, 브로드 캐스트리시버)로 작업을 요청 할수 있다.

인텐트 (Intent)

1) 인텐트의 유형

○ 명시적 인텐트(Explicit Intent) : 특정한 컴포넌트를 직접적으로 호출할 때 사용되는 인텐트. 인텐트 객체에 시작하고자 하는 구성 요소의 이름을 명확하게 설정하고 startActivity() 또는 startService() 메소드를 통해 해당 컴포넌트를 실행

 

주로 앱 내부에서 다른 액티비티나 서비스를 시작할 때 사용

 

○ 암시적 인텐트(Implicit intent) : 특정한 컴포넌트를 명시하지 않고, 수행하고자 하는 일반적인 작업을 인텐트 객체에 설정하여 startActivity() 메소드에 넘기는 인텐트. 이 때, 안드로이드 시스템은 이 인텐트를 처리할 수 있는 모든 애플리케이션을 검색하여 적합한 인텐트 필터를 가진 컴포넌트를 찾아 실행

 

주로 다른 앱의 컴포넌트를 실행시키는 데 사용

 

 

2) 인텐트의 객체

컴포넌트 이름 (Component Name) : 타겟 컴포넌트의 이름을 명시하여, 인텐트가 전달될 정확한 대상을 지정

액션 (Action) : 인텐트가 수행해야 할 일반적인 작업을 정의

데이터 (Data) : 작업을 수행하는 데 필요한 데이터의 URI를 지정

카테고리 (Category) : 인텐트의 유형을 더 구체적으로 지정하여, 어떤 컴포넌트가 처리할 수 있는지 알려줌

○ 엑스트라 (Extras) : 복잡한 데이터를 인텐트에 전달하기 위한 키-값 쌍의 추가 정보

 

 

3) 인텐트 사용 예

// 현재 액티비티에서 AnotherActivity를 시작하기 위한 명시적 인텐트 생성
val intent = Intent(this, AnotherActivity::class.java)

// 인텐트에 데이터 추가 (옵션)
intent.putExtra("key", "value")

// AnotherActivity 시작
startActivity(intent)

 

 

4) 데이터 전달

  • 인텐트에 컴포넌트 실행을 요청할 때 데이터를 함께 전달하려면 엑스트라 데이터를 이용.
  • 엑스트라 데이터는 인텐트에 담는 부가 정보라 할 수 있습니다.
  • Extras를 활용하여 이름과 값의 쌍으로된 정보를 전달

 

○ Extras에 값을 저장하는 메소드

 

○ Extras에 저장된 값을 불러오는 메소드