c 코드로 짜면 이중 for문이 들어가게 짤 텐데.. 코틀린은,,

class Solution {
    fun solution(array: IntArray, commands: Array<IntArray>): IntArray {
        var answer = intArrayOf()
        answer = commands.map{ array.slice(it[0]-1 until it[1]).sorted()[it[2]-1] }.toIntArray()
        return answer
    }
}

 

한 줄로 코틀린스럽게,,,

 

우선 map으로 원소 하나 하나에 접근을 해주고 slice로 배열의 원하는 만큼 짤라서 정렬시켜주고 그 배열의 특정 인덱스 값 원소를 가져와서 IntArray로 바꿔서 리턴해준다.

 

 

우선 윈도우는 터미널 창에서 쉘 언어를 git bash로 변경.

명령어를 보기 전에 git 로그인을 먼저 해주어야 한다.

 

git config --global user.email "you@example"

git config --global user.name "yourname"

 

그리고 깃헙과 연결을 해주자.

깃헙 레퍼지토리에 코드가 그대로 있으니 쓰면 된다.

 

git remote add origin 깃헙주소

 

이 명령어는 깃헙주소를 앞으로 origin으로 하겠다는 명령어다.

주소 맨날 쓰기 귀찮으니까~~

 

git branch -M main

 

기본 브랜치 이름을 master에서 main으로 바꿔주는 명령어

왜 마스터를 빼느냐? 기술적인 이유가 아닌 단어의 배경이 노예제도에서 나온 이름이라,,

deprecated라고 해야하나ㅋㅋ 듣자니 그렇단다,,

 

git push origin 브랜치명

폴더의 저장된 파일을 깃헙으로 업로드해주는 명령어다.

 

됐다면 이제 명령어를 보자.

 

git init   

코드 관리를 시작하는 명령어

프로젝트 시작 전 딱 한 번만 입력하면 된다.

단, 정확한 프로젝트 폴더에서 입력해야한다. 

 

git init을 통해 초기 세팅을 하게 되는데 이를 통해 .git이라는 숨겨진 폴더가 생성된다.

이 폴더가 바로 코드 변경점을 계속 추적하고 기록하는 폴더이다.

 

git add 파일명

저장하기 전 저장할 파일을 지정하는 명령어

git add . <-- 모든 파일을 지정하는 명령어 보통 이걸 많이 씀

 

git commit -m "메세지 작성"

지정된 파일을 실제로 저장하는 명령어

메세지 부분은 최대한 자세하게 작성하기 / "로그인 기능 함수 완성"

메세지는 무조건 써주어야 한다

 

git status

코드의 변경상태를 알려주는 명령어

코드를 수정하고 git status를 하면 수정된 파일이 빨간색으로 나온다

 

git log

저장 내역을 확인하는 명령어

그 동안 commit 내역을 보여준다. commit 메세지로 코드 변경점 추측이 가능하다.

log 내역에서 빠져 나올때는 q 로 빠져 나온다.

 

git push origin <master or main>

위에서 말했던 그대로 입니다.

 

 

 

협업을 위해서는 ??

레퍼지토리 생성자가 등록해주어야한다.

깃헙에서 Collaborators(협력자)를 등록하기

초대 수락 형식으로 되어있다

 

협업 시 “git organization 만들기”로 구글링해보셔요 :) 

개인 github가 아닌 팀 협업을 위한 organization을 만드는 방법입니다!

 

git clone

코드 복사해오기 명령어이다.

git clone 깃헙주소 . <----  '.'을 붙여주면 현 폴더에 그대로 코드만 가져오기

폴더 생성안했다면 . 안붙이고 그냥 쓰면 된다.

 

git pull origin 브랜치명

다른 사람이 변경한 코드 내 코드로 가져오기

clone과 다른 점은 다른 사람이 변경한 코드 + 내가 변경한 코드를 합쳐주는거다.

내 코드 위에 합쳐준다고 생각하면 된다. 그 뒤에 push해줘야 덮어쓰기를 방지할 수 있다.

 

git push 시 경고문이 뜬다면

경고문이 뜨는 이유는 덮어쓰기가 될 수 있는 경우가 있을 때 뜬다. 예를 들어 협업자가 작성한 코드가 있는데 

pull을 먼저 안해주고 push를 하려고 할 때 경고문이 나온다. 친절하게 pull 먼저 하라고 알려준다.

 

git pull --rebase

pull --rebase의 경우는 레퍼지토리의 작업된 내용을 먼저 pull 해서 commit내역을 동일하게 해주고

그 뒤에 내가 로컬에서 작업한 내용을 commit 해주는 명령어이다.

 

git pull로 가져왔는데 충돌이 떴다면,,

우선 충돌 발생 이유는 같은 파일의 같은 위치에 코드가 변경되었기 때문이다.

current change와 Incoming Change 로 충돌 라인을 알려준다.

충돌은 수정 메세지 모두 지우고 무엇을 쓸지 선택을 하든 코드를 새로 짜든 하고 push 해주면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Working directory

staging area

repository

 

 

 

 

 

 

'Git,Github' 카테고리의 다른 글

Git, Github 협업 프로세스  (0) 2023.12.04
Git LF will be replaced by CRLF 에러 해결법  (0) 2023.11.30
Git 과 Github 이란?  (2) 2023.11.20

 

처음 이 문제를 생각했을 땐 굉장히 복잡하게 느껴졌다.

 

mapIndexed로 접근해서 인덱스 값으로 접근을 해볼까 이런식으로,,

정렬을 보면 sort를 떠올려야하는데 아직 많이 부족하다..

 

한참을 헤매다가 결국 검색을 했다.. 

 

검색결과 다중 정렬이라는 아주 멋지고 간단한 방법을 발견했다.

 

하나 이상의 기준을 가지고 정렬을 해야할 때 사용하면 정말 쉽게 구현가능하다.

 

바로 sortedWith() 함수와 compareBy를 comparator로 사용하는 것이다.

 

코드를 먼저 보자.

 

class Solution {
    fun solution(strings: Array<String>, n: Int): Array<String> {
        var answer = arrayOf<String>()
        
        answer = strings.sortedWith(compareBy({it[n]}, {it})).toTypedArray()
        
        return answer
    }
}

 

우선 sortedWith 함수는 원본 리스트를 바꾸지 않고 인자로 comparator를 받아 여러개의 정렬 기준으로 새로운 리스트를 반환한다.

 

여기서는 compareBy라는 comparator를 사용하여 두 개의 정렬 기준에서 우선 순위를 부여하여 첫번째로 it[n]을 기준으로 정렬하고 그 후에 그 기준을 적용시킨 채로 두 번째 정렬 기준인 기본 오름차순 정렬을 해준것이다.

(tip: sortedBy는 정렬 기준이 하나 일 때 사용^^)

 

compareBy는 기본적으로 오름차순 정렬이며 내림차순으로 하고 싶을 때는 compareByDescending()을 써주면 된다.

 

Kotlin으로 소스코드에서 레이아웃에 접근하려 할 때 처음엔 findViewById()로 뷰를 가져왔다.

 

공부를 하다보니 findViewById()는 코드의 가독성이 떨어지고 코드량이 불필요하게 많아져 좋은 수단은 아닌거 같다.

 

찾아보니 안드로이드 스튜디오 3.6 버전 부터 viewBinding이라는 비교적 편한 기능이 제공되고 있다.

 

findViewById는 val textView = findViewById<TextView>(R.id.TextView) 이런식으로 뷰들을 변수에 모두 선언해서 사용했지만 binding은 설정만해주면 binding.textview.text = "binding편하당" 이런식으로 바로 사용가능하다.

 

findViewById는 다른 모든 레이아웃들에도 접근하여 id체크를 하고 binding은 내가 사용하고자 하는 레이아웃만 연결시켜 사용하기에 속도면에서도 빠르다. 그 외 NullPointerException, CastException 문제에서 binding이 걱정이 없어 상위호환으로 볼 수 있다.

 

 

사용법을 보자.

 

우선, gradle 설정 먼저 해줘야 한다.

android {
    ... 
    buildFeatures {
        viewBinding = true
    }
}

build.gradle 의 안드로이드 코드 블럭에 위와 같이 viewBinding 사용을 선언한다. Sync Now 해주는거 잊지말자!

 

이렇게 뷰 바인딩을 선언해줌으로써 사용하는 액티비티, 프래그먼트 등의 xml 레이아웃 파일들을 모두 바인딩클래스로 자동변환 해준다.

예 )            activity_main.xml -------> ActivityMainBinding

                  fragment_list.xml -------> FragmentListBinding

                  item_recycler.xml -------> ItemRecyclerBinding

 

 

Activity에서 binding 사용

class MainActivity : AppCompatActivity() {
    // lazy 를 사용해서 처음 호출될 때 초기화 되도록 설정
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate() {
        super.onCreate()
        setContentView(binding.root) // * setContentView에는 binding.root를 꼭 전달
    }

 

액티비티에서는 by lazy를 사용해서 최초 호출시에 초기화 되도록 바인딩 프로퍼티를 선언하고 사용하고

setContentView에 binding.root를 전달해준다.

 

Fragment 에서 binding 사용

class ListFragment : Fragment() {
    // lateinit으로 binding을 선언
    lateinit var binding:FragmentListBinding
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentListBinding.inflate(inflater, container,false)
        return binding.root
    }

 

프래그먼트는 액티비티와 다르게 LayoutInflater를 onCreateView에서 넘겨받기에 직접 초기화해주는게 낫다고 한다. 그래서 lateinit으로 한다.

Infalte란 xml에 있는 레이아웃들을 메모리에 객채화 시키는 행동 즉, 우리가 알고 싶은 요소들을 코드로 접근할 수 있게 해주는 것.

 

안드로이드 스튜디오는 기본적으로 에뮬레이터를 돌리면 mainActivity로 떨어지게 되어있다.

 

하지만 메인에 별다른 코딩을 하지않고 다른 액티비티를 먼저 작업을 하고 결과를 보고 싶어질 때가 있다.

 

지금이 그 때다... 메인은 내비두고 멤버 회원가입 및 로그인 기능을 먼저 구현하고 있는데 에뮬레이터가 메인에 떨어져서 진행 상황을 볼 수가 없는 상황이 되었다..

 

찾아보니 어렵지 않게 해결할 수 있는 방법이 당연히 있었다. 역시 구글링 b

 

우선, app -> manifests 에 가서 안드로이드매니페스트.xml을 열어주자

 

현재 나는 exported를 다 true로 바꿔준 상태인데, 기본적으로 false로 되어있다.

원하는 액티비티의 exported를 true로 바꿔준다.

 

 

그리고             ^^^^            안드로이드 스튜디오 상단에 ^ 표시한 app을 누르고 edit configurations에 들어간다.

 

 

그럼 이런 Launch options를 설정해줄 수 있는데 여기서 저 스피너를 누르고 Default Activity를 Specified Activity로 바꿔준다.

 

 

이후 원하는 액티비티를 선택후 적용시켜준 뒤 에뮬레이터를 돌리면 원하는 액티비티의 진행상황을 바로바로 볼 수 있다.

 

처음에는 map으로 처리를 할까 하였으나 인덱스 값을 따져가며 하는게 비효율적이라 생각되어 고민을 좀 했다.

 

문자열 안에서 숫자는 냅두고 영단어만 숫자로 바꿀 순 없을까 하다가 찾은게 replace()

replace(바꿀녀석, 원하는결과) 이런식으로 쓰면 된다.

 

우선 코드를 보자.

 

class Solution {
    fun solution(s: String): Int {
        var answer : Int = 0
        val numArr = arrayOf("zero", "one", "two", "three", "four", "five", "six", "seven","eight", "nine")
        var temp = s
        for (i in 0 until numArr.size) {
            temp = temp.replace(numArr[i], i.toString())
        }
        answer = temp.toInt()
        return answer
    }
}

 

 

영단어를 배열에 넣어 반복문으로 해당하는 영단어가 있으면 그 영단어가 있었던 인덱스 값을 문자열값으로 넣어준다.

 

여기서 신경써줘야 할건 숫자를 배열에 순서대로 넣어준다는 것! one zero four two nine --- 이런식으로 넣으면 안된다. 또한 반복문의 조건식도 신경써서 넣어주어야한다.

 

배열을 잘 쓰면 까다로울 수 있는 문제도 쉽게 해결 가능하다는 걸 느낀 문제다.

 

 

+ Recent posts