🍯Algorithm 꿀팁 with Java & Kotlin

: ) YOUNG·2023년 7월 12일
2

알고리즘

목록 보기
226/370
post-thumbnail

1. 많은 분기 조건을 가질 때는 if else 보다는 Switch (Kotlin에서는 when)를 사용하자

if else보다는 실제로 switch가 더 최적화에 도움이 된다. 물론 적은 조건에서는 차이가 별로 없겠지만, 문제에 따라서 조건 분기를 많이 해야되는 구현 문제라던가 시뮬레이션 문제에서는 switch구문이 최적화에 도움이 된다.

Ex)


private fun solve(a: Int, b: Int): Int {
    if(a + b == 2) {
        return 2
    } else {
        return 1
    }
} // End of solve

private fun solve(a: Int, b: Int): Int {
    when(a + b) {
        1 -> return 1
        2 -> return 3
        else -> return 4
    }
} // End of solve


2. List나 배열을 반복할때 for문 내부에 메소드 사용을 자제하자


	val testList = arrayOf(1, 2, 3)

    for (i in 0 until testList.size) {
        println(testList[i])
    }

전체를 반복해야 할때 for문 내부에 sizelength()메소드를 사용해서 for 문을 돌리는 경우가 많은데, 이럴 경우 for문이 한번 돌고 난 후 testListsize가 얼마인지 확인하고, 다시 for문의 조건이 true인지 확인하고 반복하기 때문에 for문을 한번 반복할 때 마다 메소드를 들어갔다가 나오게되는 결과를 가지게 된다.

이럴 때는 리스트 배열의 길이를 변수로 빼서 size는 미리 계산해두고, for문 내부에서는 메소드를 사용하지 않도록 만드는 것이 약간의 최적화에 도움이 된다.


    val size = testList.size
    for(i in 0 until size) {
        println(testList[i])
    }


3. println() 보다는 BufferedWriter를 사용하자

	
    println()

    val bw = BufferedWriter(OutputStreamWriter(System.out))
    bw.write("")
    bw.close()
    

참고로 BufferedWriter에서

close() 메소드를 호출하면 자동으로 flush()를 하기 때문에 write(), flush(), close() 3개를 모두 사용할 필요가 없다.

또한, Java에서는 Exception처리를 해야되는데, 그냥 throw해주면 된다.


4. 문자열 연산을 할 때는 +보다 StringBuilder와 append()를 사용하자

    
    var ans = ""
    ans = "정" + "답"
    println(ans)

문자열 연산은 위 방식으로도 가능한데, 최적화를 위해서는 아래의 방법이 매우 효율적이다.

	
    var sb = StringBuilder()
    val bw = BufferedWriter(OutputStreamWriter(System.out))
    sb.append("정답").append("입니다.")
    bw.write(sb.toString())
    bw.close()

StringBuilderBufferedWirter를 같이 사용하면 훨씬 더 최적화에 도움을 주어 문제를 해결 할 수 있다.


또한 StringBuilder에서 append()를 할 때 한글자 단위일 경우 "를 사용해서 String 타입보다는 '를 사용해서 Char 타입을 사용할 것을 권장한다.


// 줄바꿈을 해야 할 때,
    var sb = StringBuilder()
    val bw = BufferedWriter(OutputStreamWriter(System.out))
    sb.append("정답").append("입니다.").append('\n')
    bw.write(sb.toString())
    bw.close()

.append('\n') 의 형식 처럼 한글자인 Char 타입으로 만들 수 있는 것들은 싱글 쿼테이션을 사용하여 append 할 것을 추천한다.




백준에서는 문제마다 메모리와 시간을 기준으로 순위가 나오게 되는데, 승부욕이 많은 나는... 조금이라도 등수를 올려보기 위해 맞은 문제도 다시 구현해보고 최적화를 고민해보는 습관을 가지게 되었다

이런 습관 덕분에 많은 발전을 할 수 있는 계기가 되었고, 다른 분들의 코드를 참고하면서 코드리뷰를 할 수 있는 능력도 가지게 되었다.

사실 보기에 별거 아닌 것 같지만 이런 작은 구현의 차이에서 오는 것들이 모여서 프로그램의 큰 최적화에 도움이 될 수 있다는 것을 알기 때문에 더 많은 흥미를 가지게 되는 것 같다

오늘의 교훈 꺼진 코드도 다시보자!


좋아요 누르고 가라!

0개의 댓글