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)
인텐트는 일종의 메시지 객체로, 이것을 사용해 다른 앱 구성요소(액티비티, 서비스, 브로드 캐스트리시버)로 작업을 요청 할수 있다.
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에 저장된 값을 불러오는 메소드