티스토리 뷰

코드카타

 

행렬의 곱셈

 

문제

 

해당 문제는 행렬의 내적을 구하는 문제이다.

 

 

입출력 예시

 

행렬의 내적에 대한 개념을 알아야 해당 입출력 예시를 이해할 수 있다.

 

 

행렬의 내적을 구할 수 있는 조건

(m x k) · (k x n) = (m x n)

행력을 내적을 구하려면 두 행렬의 모양이 맞아야 가능하다.

(첫번째 행렬의 열 크기와 두 번째 행렬의 행 크기가 같아야 한다는 뜻)

 

제한 조건에 곱할 수 있는 배열만 주어진다고 언급되어 있기에

주어진 두 배열로 행렬의 내적을 구할 수 있는지 검사하는 로직은 짤 필요없다.

(그렇지만 테스트 케이스의 이해를 돕기 위해서 언급하였다.)

 

 

행렬 요소 구하기

 

행렬 A, B가 주어졌을 때, 두 행렬의 내적 C의 요소는 다음과 같이 정의된다.

 

저 식에서 시그마 기호(Σ)는 i의 값이 1 ~ n에 해당하는 for문이라고 보면 된다.

여기서 n은 행렬 A의 열의 개수에 해당한다.

 

C의 각 요소는 A의 i번째 행과 B의 j번째 열의 내적으로 계산된다.

내적은 각 대응하는 원소를 곱한 후 그 결과를 모두 더한 값이다.

 

 

예시

 

첫번째 테스트 케이스에서 두 행렬의 곱셈이

어떤 결과를 반환하는지에 대해서 설명하는 이미지이다.

 

두 행렬의 내적은 3 x 2 크기의 행렬에 해당한다. 

(n x m 크기의 행렬에서 n의 행의 개수 m은 열의 개수에 해당한다.)

 

 

풀이

class Solution {
    fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): List<List<Int>> {
        val res = mutableListOf<MutableList<Int>>()
        for (i in 0 until arr1.size) {
            val element = mutableListOf<Int>()
            for (j in 0 until arr2[0].size) {
                var e = 0
                for (k in 0 until arr1[0].size) {
                    e += arr1[i][k] * arr2[k][j]
                }
                element.add(e)
            }
            res.add(element)
        }
        return res
    }
}

Int형 자료를 요소로 갖는 2차원의 가변형 배열을 선언해준 뒤

3중 for문을 통해서 행렬의 내적을 계산할 수 있다.

 

i는 첫 번째 행렬(A)의 행 인덱스, j는 두 번째 행렬(B)의 열 인덱스,

k는 두 행렬의 곱셈을 계산하기 위한 공통 인덱스에 해당한다.

(공통 인덱스 = A의 열 인덱스이자 B의 행 인덱스)

 

해당 3중 for문에서 element는 각 행렬의 곱셈 결과를 저장하는 리스트,

e는 arr1의 특정 행과 arr2의 특정 열의 내적 결과를 저장하는 변수에 해당한다.

두 변수값은 각각의 반복문이 시작되기 전에 초기화를 진행해야 된다. 

 

공식에 따라 행렬의 요소를 초기화하고 주어진 두 배열의 내적을 반환한다.

 

 

현타와 의문점

import numpy as np

def solution(arr1, arr2):
    return np.dot(arr1, arr2).tolist()

사실 이런 거 알 필요 없이 파이썬 확장 라이브러리의 함수를 써서 풀어도 되긴한다.

그래서 문제 풀었을 때 2점밖에 안주는 걸까? 어제 푼 거는 7점 주던데..

 

 

회고

 

국비지원에서 코드카타 시키는 이유가 코틀린 문법에 익숙해지라고 그런거라는데 

Lv2 진입하는 시점부터 문법보다는 수학공부를 하게 되는 주객전도된 느낌이다.

 

어제 푼 문제는 행렬의 좌표값을 이용해 푸는 문제였고,

오늘 푼 문제는 행렬의 열과 행의 개수를 다루는 문제여서 

두 개념이 충돌해 코드를 이해하는데 상당히 햇갈렸었다.

 


 

안드로이드 앱 개발 입문 3주차 정리 (1)

 

Android UI

 

UI 용어 정리

 

뷰(View): 안드로이드 앱의 UI를 구성하는 기본 단위에 해당한다.

위젯(Widget): View의 서브 클래스로써, 앱 화면을 구성하는 시각적 요소이다.

레이아웃(Layout): ViewGroup의 서브 클래스로, 위젯들을 정렬하는 기능을 지닌 UI요소이다.

 

 

UI 설계 방법

 

Layout Editor를 이용하여 UI를 설계할 수 있다.

 

해당 에디터는 드래그 앤 드롭 방식으로 화면에 위젯을 배치한다.

다양한 디바이스에서의 화면 미리보기(Preview)가 가능하다.

배치한 위젯은 자동으로 xml코드로 변환된다.

 

 

탭 형식을 split으로 변환해 XML file을 직접 편집할 수 있다.

우측 미리보기 화면은 작성한 코드를 반영한다.

 

XML 태그나 속성 같은 걸 잘 알면 이 방법이 더 편리할 수도 있다.

 

 

 

Widget

 

위젯

 

안드로이드의 대표적인 위젯으로는 TextView, EditText, Button등이 있다.

 

 

 

TextView는 위젯에 해당하고 해당 위젯을 감싸는

ConstraintLayout은 View에 해당한다.

 

View 클래는 모든 위젯의 부모 클래스이며

뷰의 속성은 모든 위젯에 공통적으로 적용된다.

 

 

식별자

 

위젯의 id 속성으로 각 위젯의 식별자를 지정해줄 수 있고,

위젯끼리 식별자를 참조하여 위젯의 위치를 지정할 수 있다. 

 

코틀린 파일에서 식별자를 통해 변수에 위젯을 저장할 수 있다.

 

 

위젯 크기 지정

 

match_parent: 위젯의 크기를 부모 위젯의 크기에 맞춤

wrap_content: 위젯의 크기를 해당 위젯의 내용물 크기에 맞춤

 

 

위젯 크기 단위

 

Pixel 방식으로 view의 크기를 설정하면, 

디스플레이 해상도에 따라 view의 크기가 달라질 수 있다.

 

 

다양한 스마트폰 해상도에 대응하기 위해 

dp라는 밀도에 독립적인 단위를 사용한다.

 

 

다양한 해상도 대응

 

안드로이드 기기에서는 픽셀 밀도에 따라 여러 가지 해상도가 지원된다.

 

 

뷰는 dp라는 단위를 사용해 크기를 지정하여 해상도별 대응이 가능하고,

이미지 같은 경우는 해상도에 맞는 크기의 이미지를 각 폴더에 넣어야 한다. 

 

 

TextView

TextView의 주요 속성

- text: 출력할 문자열 지정
- textSize: 텍스트 크기
- textStyle: 텍스트 스타일 (normal, bold, italic)
- typeface: 텍스트 폰트
- textColor: 텍스트 색상
- singleLine: 값이 true면, 텍스트 길이가 위젯의 너비보다 길 때 강제로 한 줄에 출력

TextView는 화면에 text를 표시하는 용도로 쓰인다.

 

 

EditText

주요 속성

- EditText는 TextView의 서브클래스 이기에 TextView의 모든 속성을 상속함
- inputType: 입력 시 허용되는 키보드 타입 및 키보드 행위를 설정한다


키보드 타입 설정 값

- “text”: 기본적인 텍스트 키보드
- “phone”: 전화번호 입력 키보드
- “textEmailAddress”: 이메일 주소를 입력할 때 적합한 키보드


키보드 행위 설정 값

- “textCapWords” : 문장의 시작을 대문자로 변환
- “textAutoCorrect” : 텍스트 입력 시 자동 수정 기능을 제어 (맞춤법 교정 등에 쓰임)
- “textMultiLine”:여러 줄을 입력 받을 수 있음

EditText은 사용자가 텍스트를 입력할 수 있는 위젯이다.

 

 

배경색 지정

 

 

버튼

 

사용자 상호작용을 유도하기 위해 화면에 표시되는 요소로,

사용자가 버튼을 탭하면 정의된 동작이 실행되도록 설정할 수 있다.

 

Button은 TextView의 모든 속성을 활용할 수 있다.

버튼 내에 텍스트 및 아이콘 표시가 가능하다.

 

 

이미지뷰

 

앱 화면에 이미지를 표시하기 위해 이미지뷰를 사용한다.

 

 

이미지 뷰를 사용하려면 XML 파일에 이미지뷰를 추가하고,

이미지를 res/drawable 폴더에 추가한 뒤, 

이미지 리소스 ID를 ImageView의"src"속성에 지정하면 된다.

 

 

이미지 파일의 형식은 .jpg,.png가 가능하나 원본 이미지의 품질을 유지하고

투명한 배경을 지원하기 위해서 .png확장자 파일을 사용한다.

해상도에 따른 다른 크기의 이미지는 별도의 폴더를 생성하고 복사한다.

 

 

이미지 파일명의 규칙에 해당한다.

 

var imageView: ImageView = findViewById(R.id.imageView1)
imageView.setImageResource(R.drawable.이미지_이름)

setImageResource()함수를 호출하여 이미지뷰의 이미지 변경이 가능하다.

 

android:scaleType = "Center"

이미지의 크기와 비율을 유지하며 이미지의 중앙을 ImageView의 중심에 맞춘다. 
이때, ImageView보다 이미지가 클 경우 이미지가 잘릴 수 있습니다.

scaleType 속성을 통해 ImageView의 영역에 따른 이미지 크기 지정이 가능하다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함