TIL #50

loci·2024년 6월 19일
0

TIL

목록 보기
48/103

n^2배열 자르기

n행의 n열크기의 2차원배열에서 i행 i열까지의 빈칸의 값을 i로 채운다.
2차원배열을 1차원배열로 만들고 left부터 right까지의 요소들을 1차원배열로 반환해야한다.

처음엔 2차원배열을 만들어서 각좌표의 가장 큰 값을 해당 값으로 넣어주고 1차원 배열로 만들어 left부터 right까지의 index를 가져와 answer의 넣어 반환해주려고 했는데 n의 값이 n ≤ 10^7 이기 때문에 n의 값이 너무 커져 2차원배열을 만들때 메모리초과 오류가 나온다.

그래서 다른방법을 생각해보려고 각 좌표를 계산해보니 해당 좌표의 값은 (x, y)에서 x와 y좌표 중 가장 큰값의 +1이 해당 좌표의 값이 된다. 그래서 left와 right사이에 있는값 i 와 n에서 i / n은 x의 좌표가 되고 i % n은 y의 좌표가 된다.(i/n, i%n) 해당 좌표를 구하는 법을 이용해 i / n이 크면 answer에 i / n + 1을 추가해주고 i % n이 크면 answer에 i % n + 1을 추가해주고 answer list를 intArray로 바꿔 반환해준다.


나의풀이

class Solution {
    fun solution(n: Int, left: Long, right: Long): IntArray {
        var answer: IntArray = intArrayOf()
        var arr = Array(n) { IntArray(n) }
        var count = 1
        for(i in arr.indices){
            for(j in arr.indices){
                if(i > j){
                    arr[i][j] = i
                } else {
                    arr[i][j] = j
                }
            }
        }
        var arr2 = arr.map{ it.toList()}.flatten()
        for(i in left..right){
            answer += arr2[i.toInt()] + 1
        }
        return answer
    }
}

처음 2차원배열을 만들어 풀어보려고 했을때 메모리초과

class Solution {
    fun solution(n: Int, left: Long, right: Long): IntArray {
        var answer: IntArray = intArrayOf()
        
        for(i in left..right){
            if(i / n >= i % n ){
                answer = answer.plus((i/n).toInt() + 1)
            }else{
                answer = answer.plus( (i % n).toInt() + 1)
            }
        }
        
        return answer
    }
}

통과가 되긴 했는데 시간이 너무 크게 나왔다. (4236.02ms, 375MB)

class Solution {
    fun solution(n: Int, left: Long, right: Long): IntArray {
        var answer = mutableListOf<Int>()
        var arr = Array(n) { IntArray(n) }
        
        for(i in left..right){
            if(i / n >= i % n ){
                answer.add((i / n).toInt() + 1)
            } else {
                answer.add((i % n).toInt() + 1)
            }
        }
        
        return answer.toIntArray()
    }
}

위 코드처럼 answer를 list로 바꾸었는데도 메모리 초과 오류가 계속 났었는데 알고보니 n크기로 2차원배열을 만드는 부분을 삭제해주지 않아 생기는 문제였다. 그래서 해당 배열선언 부분을 삭제해주니 해결됐다.
(32.99ms, 76.6MB)


다른사람풀이

import kotlin.math.max

class Solution {
    fun solution(n: Int, left: Long, right: Long): IntArray {
        return (left..right).map { (max(it / n, it % n) + 1).toInt() }.toIntArray()
    }
}

리소스 파일

리소스 파일이란

  • 애플리케이션 리소스(이미지, 문자열 등)를 코틀린 코드에서 분리해 독릭접으로 유지/관리 함으로써, 다양한 환경변화(화면크기변화, 사용 언어변경 등)를 콛의 변경없이 수용할 수 있게 해다.
  • 리소스폴더 - drawable(이미지 리소스), layout(UI구성에 필요한 XML리소스), mipmap(앱아이콘 이미지), values(문자열등의 값)

    주의

    • res의 하위폴더들은 지정된 폴더명을 사용해야 한다.
    • 각 리소스폴더에 다시 하위폴더를 정의 할수 없다.
    • 리소스 파일 명에는 알파벳 대문자를 사용할수없다.
    • 소문자 a~z, 0~9, "_" (underscore)만 포함가능
string 값을 따로 정의해 리소스를 불러오는 이유는 다국어 지원을 위해서 사용한다.

aapt도구

  • 애플리케이션 리소스를 컴파일하여 컴파일 된 리소스 (R클래스와 패키지된 리소스파일)을 생성한다.
  • R.java
    - aapt도구에 의해 자동으로 생성된 파일
    - R클래스는 리소스를 kotlin프로그램에서 접근하기위한 리소스 ID를 정의
    - R클래스는 애플리케이션에서 사용되는 모든 리소스를 참조할 수 있도록 해준다.

코트린 소스파일

package com.android.helloworld

  • MainActivity가 속한 패키지
  • 안드로이드 프로젝트 생성시 설정된 이름

class MainActivity: AppCompatActivity()

  • 안드로이드 액티비티는 Activity의 서브 클래스임
  • AppCompatActivity는 Activity의 서브 클래스로서 하위 플랫폼 버전을 지원

override fun onCreate (savedInstanceState : Bundle?)

  • 안드로이드 플랫폼이 호출하는 메소드로서 액티비티가 생성되는 순간에 한번 호출됨
  • 주로 액티비티와 관련된 변수 초기화 및 사용자 인터페이스 설정 코드를 포함함

setContentView(R.layout.activity_main)

  • R.layout.activity_main이 가리키는 리소스를 이 액티비티가의 콘텐츠뷰로 사용하겠다는 의미
  • R.layout.activity_main은 res/layout폴더에 있는 activity_main.xml을 가리키는 정적 상수(R클래스에서 정의됨)

프로젝트 빌드

  • android빌드 시스템은 앱 리소스 및 소스코드를 컴파일하고, 배포할 수 있는 apk로 패키징함
  • android studio는 고급 빌드 툴 킷인 Gradle을 사용하여 빌드 프로세스를 자동화하고 관리

컴파일러의 역할

  • 소스코드를 DEX(Dalvik Executable)파일로 변환하고 그 외 모든 것을 컴파일 된 리소스로 변환
    - aapt도구는 리소스파일(res 하위파일)들을 컴파일된 리소스(R 클래스 파일과 패키지된 리소스 파일)로 변환 시킴
    - kotlinc 컴파일러는 kotlin소스파일(자동으로 생성된 R.java와 사용자가 정의한 .kt파일)을 kotlin클래스파일(.class확장자)로 변환시킴
    - dx안드로이드 개발도구는 컴파일된 kotlin클래스 파일을 DEX파일로(.dex확장자)로 변환시킴
    - 이 DEX파일에는 android기기에서 실행되는 바이트코드가 포함됨

APKPackger

  • DEX파일과 컴파일된 리소스를 단일 APK에 결합함
  • 앱을 배포하기위해 APKPackager는 디버그 또는 릴리스 키스토어를 사용하여 APK를 서명
  • 디버그 버전의 앱(테스트및 프로파일링 전용앱)
    - 빌드 중인 경우 패키저가 디버그 키스토어로 앱에 서명함
    - android studio는 디버그 키스토어로 새프로젝트를 자동으로 구성함
  • 릴리스 버전의 앱( 외부에 릴리즈할 앱 )
    - 빌드 중인 경우 패키저가 릴리스 키스토어로 앱에 서명함
  • 최종 apk를 생성하기 전
    - 패키저는 기기에서 실행될 때 더 적은 메모리를 사용하도록 앱을 최적화 하기위해 zipalign도구를 사용

빌드구성파일

  • 새프로젝트를 시작할때 아래 그림처럼 프로젝트 구조를 생성하고 빌드 구성파일(build.gradle, settings.gradle 등)을 자동으로 만들고, 적합한 기본값로 설정된다.

build.gradle(Project level)

  • 프로젝트의 모든 모듈에 적용되는 빌드 구성을 정의

settings.gradle

앱을 빌드할때 어떤 모듈을 포함할지 Gradle에 알
려줌
대부분의 프로젝트에서 다음코드만을 포함 include ':app'

build.gradle(Module level)

  • compileSdkVersion 28 - 컴파일시 sdk 28버전을 사용
  • minSdkVersion 26 - 앱이 지원하는 최소 API 버전을 26으로 설정
  • targetSdkVersion 28 - 앱을 테스트하기 위해 사용할 API버전을 28로 설정
  • dependencies - 모듈자체를 빌드하기 위해 요구되는 종속성을 명세, 외부저장소에서 해당 라이브러리를 다운 받아와 빌드
profile
편리한 개발자

0개의 댓글