경험의 기록

문제 : www.acmicpc.net/problem/1373

 

1373번: 2진수 8진수

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

www.acmicpc.net

 

정답

import java.util.*

fun main(args:Array<String>) = with(Scanner(System.`in`)){
    var a = nextLine()
    var sum = 0

    if (a.length % 3 == 1) a = "00$a" 
    if (a.length % 3 == 2) a = "0$a"
    // 3개씩으로 안나눠 떨어질 경우 앞에 0을 채워줌

    for(i in a.indices step 3){
        sum = a[i].toString().toInt() * 4 + a[i+1].toString().toInt() * 2 + a[i+2].toString().toInt()
        // 3자리씩 끊어서 8진수로 변환
        print(sum)
    } // indices == 0 until a.length
	
}

 

 

코틀린으로 진수변환을 해본적이 없어 헤맨 문제이다.

import java.util.*

fun main(args:Array<String>) = with(Scanner(System.`in`)){

    var a = nextLine()
    var b = a.toInt(2) // 2진수를 10진수로
    println(b.toString(8)) // 10진수를 8진수로

}

처음에는 단순히 입력받은 2진수를 10진수로, 10진수를 8진수로 변경하려고 시도했는데

NumberFormat 오류가 발생하였다.

원인을 생각해보니 주어지는 수의 길이가 최대 1,000,000 이라서 toInt를 하는 과정에서 범위를 초과한 거 같았다.

 

그래서 방향을 바꿔서

2진수를 세자리씩 끊어서 그걸 10진수로 변환한 수가 8진수이기 때문에 

import java.util.*

fun main(args:Array<String>) = with(Scanner(System.`in`)){
    var a = nextLine()
    var sum = 0

    if (a.length % 3 == 1) a = "00$a"
    if (a.length % 3 == 2) a = "0$a"

    for(i in a.indices step 3){
        sum = a[i].toInt() * 4 + a[i+1].toInt() * 2 + a[i+2].toInt()
        print(sum)
    } // indices == 0 until a.length

}

이렇게 코드를 짰으나, 코틀린에서는 char형을 숫자로 사용할 수 없고, Int로 변환한 값이 아스키 코드이기 때문에 원하는 값이 나오지 않았다.

그래서 String으로 바꾸고 Int로 바꾸는 방법을 사용했는데,

0과 다른 숫자들과의 아스키코드 값 차이가 숫자값 차이만큼 난다는걸 활용하면,

a[i]-'0' 같은 방식으로도 해결 할 수 있다.

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading