티스토리 뷰

코드카타

 

이진 변환 반복하기

 

문제

 

 

풀이

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

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함