티스토리 뷰

코드카타

 

대충 만든 자판

 

문제

 

 

입출력 예시

 

targets의 요소(문자열)을 기준으로 각 요소마다 자판을 눌러야 되는

횟수를 카운트하여 배열에 추가한 뒤 반환한다.

 

목표 문자열을 작성할 수 없는 경우에는 [-1]을 반환한다.

 

 

정답

class Solution {
    // 반환값을 IntArray에서 List<Int>로 수정
    fun solution(keymap: Array<String>, targets: Array<String>): List<Int> { 
		
        // FCI(Find Closest Index)
        // keymap에서 가장 가까운 곳에 위치하는 특정 문자의 인덱스값을 반환하는 함수
        fun fci(keymap: Array<String>, t: Char): Int { 
            var minIdx: Int? = null // 반환할 결과값을 nullable 타입으로 선언, 초기값은 null
            for (key in keymap) { 
                val tIdx = key.indexOf(t) // 각 문자열에서 't'의 인덱스를 찾음
                if (tIdx != -1) { // 문자가 문자열에 존재한다면
                    if (minIdx == null || tIdx < minIdx) { 
                        minIdx = tIdx // 현재 가장 작은 인덱스를 갱신
                    }
                }
            }
            return minIdx ?: -2 // 반환값은 인덱스에 해당하므로 null값을 가진다면 -2 반환
        }
        
        
        var res = mutableListOf<Int>() // 결과값 저장 리스트
        
        // 각 타겟 문자열 요소의 최소 인덱스 값 계산
        for (i in targets.indices) { 
            var cnt = 0 // target의 요소를 순회하기 전 cnt값 초기화
            for(j in targets[i]){ 
                if(fci(keymap, j) == -2){ // target(문자)가 keymap(문자열)에 없다면 
                    cnt = -1 // cnt를 -1로 초기화 후
                    break // 문자열 탐색 종료
                }
                else cnt += fci(keymap, j) + 1 // 문자가 존재한다면 cnt에 인덱스 값을 더함
            }
            res.add(cnt) // 각 타겟 문자열에 대한 결과를 리스트에 추가
        }
        
        return res // 결과 리스트 반환
    }
}

함수를 작성함으로써 코드의 가독성을 높이고 문제를 효율적으로 해결할 수 있었다.

 

targets의 요소를 순회하면서 keymap의 요소들 중 가장 가까운 인덱스를 구해

반환값에 더해주는 방식으로 문제를 해결하였다.   

 

 

시간 복잡도 고려

for(j in targets[i]){
    val n = fci(keymap, j) // 함수 반환값 저장
    if(n == -2){ 
        cnt = -1
        break
    } else cnt += n + 1
}

코드카타 리뷰 중 팀원분께서 코드를 효율성을 높일 수 있는 방법을 알려주셨다.

 

각 타겟 문자열 요소의 최소 인덱스값을 계산하는 로직을

fci 함수의 반환값을 변수로 저장한 뒤 그 값을 활용하는 방식으로 짜면

함수 실행횟수를 줄일 수 있게 되어 시간 복잡도가 줄어들게 된다.

 


 

Git 세션 정리

 

Git 실습환경 구축

 

Git - Downloads

Downloads macOS Windows Linux/Unix Older releases are available and the Git source repository is on GitHub. GUI Clients Git comes with built-in GUI tools (git-gui, gitk), but there are several third-party tools for users looking for a platform-specific exp

git-scm.com

Git 다운받고 

 

 

 

안드로이드 트랙은 vscode가 아닌 android studio를 사용하므로

git bash 열어서 실습을 진행해준다.

 

 

 

리눅스 명령어

 

pwd

 

현재 내가 작업하고 있는 폴더의 경로를 보여준다.

 

 

mkdir 폴더명

 

현재 위치에서 폴더를 생성한다.

 

 

touch 파일명

 

현재 위치에서 파일을 생성한다.

 

 

cd 폴더명

 

폴더명에 해당하는 폴더로 이동한다.

 

 

 

'cd 폴더 경로' < 폴더 내의 폴더로도 이동이 가능하다

 

 

 

'cd ..' < 이전 경로로 이동한다.

 

 

ls

 

내 폴더 안에 있는 파일 내역들을 보여준다.

 

 

ls -a

 

해당 폴더 내에 숨겨진 파일도 모두 볼 수 있다.

 

 

 

Git이란?

 

git은 프로젝트의 버전 관리 도구이다.

 

하나의 폴더내에서 코드의 변경점을 기록하기 위해 사용하고,

에러 발생 시엔 코드 변경사항을 추적하여 오류를 수정하거나 

과거의 코드 기록으로 되돌아가는 것이 가능하다.

 

 

 

Github란?

 

"백업"과 "공유"가 가능한 온라인 코드 저장소이다.

코드의 공유가 가능하기에 협업도구로 쓰인다.

 

 

 

Git 명령어

 

실습환경 구축

 

바탕화면에 폴더 하나 만들고 vscode에서 연 뒤 터미널을 열어준다.

 

기본 터미널은 powershell로 설정되어 있는데 +버튼을 눌러

(git) bash 창을 열어줘야 git 명령어가 올바르게 실행된다.

 

 

 

변경 사항을 저장하기 위해 폴더 내에 아무 파일이나 만들어준다.

 

git init

 

로컬 깃 저장소를 초기화하는 명령어이다.

git init은 프로젝트 시 시 딱 한 번만 입력하면 된다.

 

해당 명령어를 입력하면 .git라는 폴더가 생성이 되고

이때부터 코드 변경사항을 git에서 추적한다.

(.git은 숨김파일에 해당한다.)

 

 

 

저장소를 초기화하기 전 폴더 경로를 확인해줘야 하는데

만약 잘못된 경로에서 git init 명령어를 실행시켰다면

해당 명령어를 실행시켜 폴더 내의 .git 폴더를 제거하면 된다.

 

 

git add & commit

 

git add 파일명으로 로컬 저장소에 저장할 파일을 지정한다.

git add . < 프로젝트 내 모든 변경사항을 한 번에 지정

 

 

 

git commit -m "커밋메시지" 명령어를 실행시키면

지정한 파일을 로컬 저장소에 실제로 저장하게 된다.

 

 

git status

 

코드 저장여부를 확인하는 명령어이다.

변경사항은 존재하지만 저장을 하지 않은 파일을 붉은색 글자로 표시한다. 

 

 

git log

 

코드 저장내역을 확인하는 명령어이다.

 

 

git diff

 

commit된 파일상태와 현재 수정중인 상태를 비교하는 명령어이다.

삭제된 부분은 빨간색, 추가된 부분은 초록색으로 표시된다.

 

 

git reset

 

되돌리고 싶은 커밋의 커밋해시 앞 6글자를 복사 한다음

 

 

 

git reset 커밋해시를 하면 해당 커밋해시를 가진 커밋으로 되돌아간다.

git reset을 하기 전에 모든 파일이 커밋이 된 상태여야 한다.

 

 

 

a.txt 파일이 이전 커밋 상태로 되돌아간 것을 확인할 수 있다.

 

 

 

Github에 변경사항 업로드

 

변경사항 업로드

 

레파지토리를 생성하고 만약 커밋을 진행하였다면

붉은 박스 안에 위치한 명령어들을 복사해

 

 

 

터미널에 붙여넣어준다.

 

 

명령어 설명

 

git remote add origin 레파지토리 주소 <  로컬 Git 저장소와 원격 저장소 추가

 

git branch -M main < 메인 브랜치 이름을 'master'에서 'main'으로 변경

 

(github의 기본 레파지토리명은 master에 해당하는데

master에 어원이 노예제도에서 왔다는 이유로 main으로 대체되었다.)

 

git push -u origin main < 로컬의 main 브랜치를 원격 저장소에 푸시하고,

main 브랜치와 원격 저장소의 main 브랜치를 연결한다.

 

(해당 명령어를 실행하면 git push origin main > git push로 푸시가 가능해진다.)

 

 

푸시 하는 법

로컬저장소와 레파지토리 연결을 완료했다면 앞으로는

변경사항이 생겼을 때 커밋을 아래와 같은 방법으로 할 수 있다.

 

git add. < 변경사항 지정

git commit -m "커밋메시지" < 변경사항 저장

git push (origin main) < 변경사항 푸시

 

 

 

협업하는 법

 

협력자 등록

 

레파지토리 만든 사람(팀장)이 팀원들을 초대한다.

 

 

 

팀원들의 깃허브 아이디로 초대를 보낸다.

 

 

 

초대장은 깃허브 계정에 등록해둔 이메일로 오게 된다.

팀원이 초대를 수락하게 되면 해당 레파지토리에 팀원이 추가된다.

 

 

프로젝트 복사해오기

 

레파지토리에 주소를 복사한 뒤

 

 

 

현재 위치를 바탕화면으로 이동하고 

'git clone <레파지토리 주소>' 명령어로 프로젝트 폴더를 복사해준다.

 

바탕화면에서 만들어야 찾기가 쉽다.

 

 

 

생성된 폴더를 열어준다.

 

 

코드 변경 사항 내 프로젝트 폴더에 가져오기

 

push 하기 전에 git pull로 main 브랜치의 변경사항을 가져와야 한다.

 

 

 

git pull 시 아래와 같은 경고문이 뜬다면 

 

 

 

터미널에 git config pull.rebase false 명령어 입력 후 pull 해준다.

 

 

충돌 해결하기

 

git pull을 할 떄 같은 파일 내에서 서로 다른 코드를 작성하였면 

이런식으로 Conflict(충돌)이 발생하게 되는데 구현 사항에 따라 해결 방법이 달라진다.

 

둘 중 하나를 선택해도 되고, 

위, 아래, 중간에 위치한 특수문자를 다 지우고 코드를 적당히 합쳐도 된다.

 

충돌을 해결했다면 다시 변경사항을 push 해준다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함