티스토리 뷰
코드카타
이진 변환 반복하기
문제
풀이
class Solution {
fun solution(s: String): List<Int> {
var res1 = 0 // 이진 변환 횟수
var res2 = 0 // 제거된 0의 개수
var str = s // 입력 문자열을 현재 문자열로 초기화
while(str != "1"){
// 현재 문자열에서 0의 개수를 세고 이를 res2에 추가
val zeroCnt = str.count{it == '0'}
res2 += zeroCnt
// 남은 문자열의 길이를 이진수로 변환한 문자열을 현재 문자열로 갱신
val lenX = str.length - zeroCnt
str = lenX.toString(2)
// 이진 변환 횟수 증가
res1 += 1
}
return listOf(res1, res2) // s의 이진 변환 횟수와 제거된 0의 개수 반환
}
}
정수.toString(2) <- 10진수 정수를 2진수 문자열로 변환한다
Kotlin 진수 변환 메소드
fun main() {
val n1 = 8
println(n1.toString(2)) // 1000 (문자열)
val n2 = "1000"
print(n2.toInt(2)) // 8
}
toString(n)은 주어진 10진수 정수를 n진수 문자열로 변환하고,
toInt(n)은 주어진 n진수 문자열을 10진수 정수로 반환한다.
Java 진수 변환 메소드
fun main() {
println(Integer.toBinaryString(8)) // 1000 (문자열)
print(Integer.parseInt("1000", 2)) // 8 (정수)
}
Integer 클래스의 메소드를 호출하여 진수 변환을 할 수도 있다.
Kotlin은 대부분의 Java 라이브러리와의 호환성을 보장하기 위해 설계되었기에
Java에서 제공하는 기능을 Kotlin에서 그대로 활용할 수가 있다.
계산기 앱 만들기
UI 구성
Layout 분할
연산식을 계산 결과를 텍스트는 RelatvieLayout 내에
연산식을 입력하는계산기 버튼들은 TableLayout 내에 위치시킨다.
전체 위젯 배치 방향 설정
android:orientation="vertical"
모든 뷰를 감싸는 LinearLayout에 해당 속성을 준다.
해당 속성은 자식 뷰들이 수직 방향으로 배치되도록 정의한다.
RelativeLayout
// 텍스트뷰에서 위젯배치관련 속성만 남겨둔 코드 스니펫
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="220dp">
<TextView
android:id="@+id/txt_expression"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginTop="44dp"
android:layout_marginRight="20dp"
android:text="" />
<TextView
android:id="@+id/txt_result"
android:layout_below="@+id/txt_expression" // 뷰 앞쪽에 배치
android:layout_alignRight="@+id/txt_expression"
android:layout_marginTop="30dp"
android:text="" />
</RelativeLayout>
RelativeLayout은 다른 뷰들의 상대적인 위치를 기준으로 뷰를 배치할 수 있는 레이아웃이다.
RelativeLayout의 높이값이 커질 수록 TableLayout의 높이값은 줄어든다.
결과 텍스트뷰는 연산식 텍스트뷰의 위치를 기준으로 배치되어있다.
TableLayout 배치 속성
<TableLayout
android:stretchColumns="*">
TableLayout에 해당 속성을 주게 되면
모든 열이 균등하게 테이블의 가용한 공간을 채우게 된다.
<TableRow
android:layout_weight="1">
모든 TableRow의 레이아웃 가중치를 1로 설정하여
테이블의 모든 열이 동일한 크기를 가지도록 한다.
android:onClick="onClick"
테이블에 위치한 모든 버튼의 클릭 이벤트를 onClick함수로 정의한다.
onClick함수는 액티비티 파일에서 정의할 것이다.
로직 구현
클래스 인스턴스 불러오기
class CalculatorActivity : AppCompatActivity() {
val calculator = Calculator()
액티비티 클래스 내에 계산기 클래스의 인스턴스를 생성해준다.
이는 caculate 함수를 이용해 연산식의 계산결과를 반환하기 위함이다.
작성해놓은 계산기 클래스 확인 -> https://tsi0511.tistory.com/86
텍스트뷰 불러오기
private lateinit var expression: TextView
private lateinit var result: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_calculator)
// 액션바 숨기기
val actionBar: ActionBar? = supportActionBar
actionBar!!.hide()
expression = findViewById(R.id.txt_expression)
result = findViewById(R.id.txt_result)
}
텍스트뷰 변수를 private lateinit var로 선언해주고
onCreate() 메서드에서 해당 변수를 초기화해준다.
버튼 동작 함수 정의
fun onClick(view: View) {
val button = view as Button
val buttonText = button.text.toString()
val expressionText = expression.text.toString()
// 버튼 텍스트에 따라 수행할 작업 결정
when (buttonText) {
// 초기화 버튼
"AC" -> {
expression.text = ""
result.text = ""
}
// 삭제 버튼
"DEL" -> {
if (expressionText.isNotEmpty()) {
expression.text = expressionText.substring(0, expressionText.length - 1)
}
}
// 연산자 버튼
"+", "-", "x", "÷" -> {
if(expressionText.isNotEmpty() && expressionText.last() !in "+-x÷"){
expression.text = expressionText + buttonText
}
}
// 결과 출력 버튼
"=" -> {
if(expressionText.isNotEmpty()){
val res = calculator.calculate(expressionText)
result.text = "= " + res.toString()
}
}
// 숫자 버튼
else -> expression.text = expressionText + buttonText
}
}
계산기 버튼을 눌렀을 때의 동작을 처리하는 함수이다.
모든 버튼의 동작은 이 함수 하나로 처리한다.
클릭된 뷰를 버튼으로 변환한 뒤 버튼 텍스트 변수를 선언한다.
버튼 텍스트에 따라 연산식 텍스트뷰의 텍스트를 변경한다.
실행결과
깃허브
GitHub - hamond12/Calculator
Contribute to hamond12/Calculator development by creating an account on GitHub.
github.com
'내일배움캠프 > Android 국비지원' 카테고리의 다른 글
TIL 16일차 (카펫 - Kotlin | 코틀린 심화 문법 정리 1) (0) | 2024.06.11 |
---|---|
TIL 15일차 (피보나치 수 - Kotlin | 계산기 구현 과제 피드백 반영) (0) | 2024.06.10 |
TIL 13일차 (JadenCase 문자열 만들기 - Kotlin | 연산자 간의 우선순위를 고려한 연산 로직짜기) (0) | 2024.06.08 |
TIL 12일차 (최댓값과 최솟값 - Kotlin | 단계별 계산기 클래스 구현) (0) | 2024.06.07 |
TIL 11일차 (신고 결과 받기 - Kotlin) (1) | 2024.06.06 |