본문 바로가기
♞ | 공부일지/♝ | TIL

[Android, 내일배움캠프] 공부일지(2024-07-01)

by immgga 2024. 7. 1.
오늘 공부한 내용 정리(2024년 7월 1일)

 

 

코드카타 문제풀이

다각형의 면적(Gold 5, 2166번)

문제 내용

 

문제 풀이 방법

N개의 점으로 이루어지는 다각형의 면적을 구해서 출력.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader
import java.math.BigDecimal
import java.math.RoundingMode
import kotlin.math.abs

private var points = mutableListOf<List<Long>>()

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val case = readLine().toInt()

    for (i in 0 until case) {
        val (x,y) = readLine().split(" ").map { it.toLong() }
        points.add(listOf(x, y))
    }

    val area = getArea().setScale(1, RoundingMode.HALF_UP)
    println(area)
}

private fun getArea(): BigDecimal {
    var diagonalX = 0L
    var diagonalY = 0L
    for (i in 0 until points.size) {
        if (i == points.size - 1) {
            diagonalX += points[i][0] * points[0][1]
            diagonalY += points[i][1] * points[0][0]
        } else {
            diagonalX += points[i][0] * points[i+1][1]
            diagonalY += points[i][1] * points[i+1][0]
        }
    }

    return BigDecimal.valueOf(abs(diagonalX - diagonalY) / 2.0)
}

 

풀이 과정

각 점의 개수인 case를 입력받고, case만큼 x, y를 입력받아 points에 저장한다.

다음으로 면적을 구하는 getArea() 함수를 수행한다.

 

getArea() 함수에는 사선 공식(신발끈 공식)을 이용해 다각형의 넓이를 구해서 return 한다.

신발끈 공식에 관해서는 아래의 링크를 참고.

https://ko.wikipedia.org/wiki/%EC%8B%A0%EB%B0%9C%EB%81%88_%EA%B3%B5%EC%8B%9D

 

신발끈 공식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 신발끈 공식(―公式)은 좌표평면 상에서 꼭짓점의 좌표를 알 때 다각형의 면적을 구할 수 있는 방법이다. 다각형의 각 꼭짓점의 좌푯값을 교차하여 곱하는 모

ko.wikipedia.org

 

신발끈 공식에서 x좌표를 기준으로 잡아서(1번째 x좌표와 2번째 y좌표의 곱, 2번째 x좌표와 3번째 y좌표의 곱...) 이 수들의 합을 저장하기 위한 변수 diagonalX를 생성한다.

diagonalY는 y좌표를 기준으로 잡아 x좌표랑 같은 방식으로 값들의 합을 저장한다.

그리고 diagonalX와 diagonalY의 차의 절댓값에 2를 나눈 값을 return 한다.

return type을 BigDecimal로 잡았는데, 이는 int보다 큰 범위의 소수를 정확하게 저장하고, 소수점이 정확하게 나오게 하기 위해 사용했다(기존의 float, double은 소수점이 길어지면 데이터가 변질될 가능성이 있다).

 

getArea()에서 return 된 값을 setScale로 소수점 둘째 자리에서 반올림을 하고 출력한다.

 

 

문제 해결 과정

신발끈 공식을 알고 있으면 쉽게 해결 가능하다.

하지만 타입의 정의와 변환을 많이 신경 써주어야 한다.

 

 

삼각형으로 자르기(SIlver 2 1198번)

문제 내용

 

문제 풀이 방법

N개의 점으로 이루어진 다각형이 주어질 때, 점 3개를 이어서 만들 수 있는 삼각형의 넓이 중 가장 큰 값을 출력.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.abs
import kotlin.math.max

private val points = mutableListOf<List<Int>>()
private var selectedPoints = mutableListOf<List<Int>>()
private var max = 0.0

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val pointCnt = readLine().toInt()

    for (i in 0 until pointCnt) {
        val (x, y) = readLine().split(" ").map { it.toInt() }
        points.add(listOf(x, y))
    }

    for (i in 0 until points.size) {
        for (j in i+1 until points.size) {
            for (k in j+1 until points.size) {
                selectedPoints = mutableListOf(points[i], points[j], points[k])
                val area = getTriangleArea()
                max = max(max, area)
            }
        }
    }

    println(max)
}

private fun getTriangleArea(): Double {
    var diagonalX = 0
    var diagonalY = 0

    for (i in 0 until selectedPoints.size) {
        if (i == selectedPoints.size - 1) {
            diagonalX += selectedPoints[i][0] * selectedPoints[0][1]
            diagonalY += selectedPoints[i][1] * selectedPoints[0][0]
        } else {
            diagonalX += selectedPoints[i][0] * selectedPoints[i+1][1]
            diagonalY += selectedPoints[i][1] * selectedPoints[i+1][0]
        }
    }

    return abs(diagonalX - diagonalY) / 2.0
}

 

풀이 과정

좌표를 저장할 points를 생성하고,

선택된 3개의 점을 저장할 selectedPoints를 생성,

그리고 넓이의 최댓값을 저장할 max를 생성한다.

 

점의 개수를 뜻하는 pointCnt를 입력받는다.

points 리스트에 점의 좌표(x, y)를 입력받아 넣어준다.

 

그다음 pointCnt개의 중 중복 없이 3개의 점을 골라서 넓이를 구해야 하기 때문에, 경우의 수를 구할 때랑 똑같이 구현하면 된다.

3중 for문을 써서 중복 없이 3개의 점을 고를 수 있도록 해주고,

selectedPoints에 선택된 점의 좌표 3개를 넣어서 초기화한다.

getTriangleArea() 함수를 실행해서 점 3개로 구성된 삼각형의 넓이를 구해준다.

max값에 현재 max와 getTriangleArea() 리턴 값 중 2개 중 더 큰 값을 max에 새로 넣어 준다.

반복이 종료되면 현재 max가 가장 넓이가 큰 삼각형의 넓이가 된다.

 

getTriangle() 함수에는 사선 공식(신발끈 공식)을 사용해 준다.

x, y를 기준으로 한 사선 공식을 적용하기 위한 diagonalX, diagonalY 변수를 생성한다.

그다음 selectedPoints의 데이터를 사용해 신발끈 공식을 적용해서 그 값을 double로 return 한다.

 

 

문제 해결 과정

1번째에 해결했던 다각형의 면적 문제와 비슷한 문제이다.

사선 공식(신발끈 공식)을 알고 있으면 쉽게 해결할 수 있는 문제이다.

삼각형을 입력받은 점의 좌표대로 설정하는 것이 아닌, 점 N개 중 3개를 골라서 가장 큰 삼각형의 넓이를 구해야 한다.

 

 

스파르타 코딩 클럽 강의 수강

앱 개발 입문 개인 과제 해설

강의 내용 간단 정리

과제 해설이 코드를 같이 따라 치는 게 아닌 이미 만든 코드를 설명해 주는 방식이었기 때문에

나의 코드와 과제 해설 코드 중 다르게 구현한 부분을 확인해 보았다.

 

과제 코드는 xml에서 한글을 쓸 때, string.xml에 한글을 정의해 준 후에 xml에 사용하였다.

<resources>
    <string name="app_name">IAm</string>
    <string name="signIn_id">아이디</string>
    <string name="signIn_id_et">아이디를 입력하세요.</string>
    <string name="signIn_pw">비밀번호</string>
    <string name="signIn_pw_et">비밀번호를 입력하세요.</string>
    <string name="signIn_login">로그인</string>
    <string name="signIn_signup">회원가입</string>
    <string name="toast_msg_noinput">입력되지 않은 정보가 있습니다.</string>
    <string name="toast_msg_idpqErr">아이디/비밀번호를 확인해주세요</string>
    <string name="signup_name">이름을 입력하세요.</string>
</resources>

string.xml을 쓰는 이유는 다국어 지원 때문에 쓴다고 했는데 나는 아직 다국어 지원 앱을 만들어본 경험이 없다.

 

위의 부분을 제외하고는 똑같거나 비슷하게 구현했다.

이번 과제는 내 수준에서는 쉬웠기 때문에 큰 문제없이 구현할 수 있었다.

 

 

팀 프로젝트를 위한 Git 협업 강의

강의 내용 간단 정리

 

branch 만들기

수정은 하고 싶은데, 원래 파일은 그대로 놔두고 싶을 때, branch를 만들어야 한다.

 

branch: 코드의 복사본.

 

branch 만들기 명령어: git branch 브랜치명(ex: login)

branch 확인 명령어: git branch

git branch를 실행하고 난 후, q키를 눌러서 branch 확인 탭을 빠져나가야 함.

 

branch 이동 명령어

git switch 브랜치명
git checkout 브랜치명

2개의 명령어 중 아무거나 써도 상관없다.

나는 checkout을 사용 중.

 

branch를 한 번에 생성 후 이동

git switch -c 브랜치명
git checkout -b 브랜치명

 

 

코드 짠 branch를 main에 합치기.

main에 코드를 합치는 이유.

main(최종) 브랜치에 서로 작성한 코드를 하나로 모으기 위함.

 

branch 합치는 명령어

git merge 합칠 branch 이름

 

 

pull request 활용하기

git merge 말고 github에서 합침

다른 사람이 변경한 코드를 보고 코드 리뷰를 할 수 있다.

협업하는데 내 마음대로 합칠 수 없다. 합치기 전에 올려놓고 리뷰를 받고 merge 함.

pull request: 당겨서 합치는 것(merge) + 요청
코드 합병을 요청하는 것

 

 

pull request 후의 main branch를 최신 코드로 변경하기

github 코드 반영

git pull origin 브랜치명

 

 

협업 실전 가이드

main branch는 배포용이라 문제가 될 수 있음.

완벽하게 기능을 개발해야 main으로 merge 가능.

 

무지성 main push는 2가지의 문제점이 있을 수 있다.

문제점 1: 기능을 여러 개를 만들어야 할 때, 다 만드는 데 오래 걸린다. 버그 수정도 오래 걸리고.

 

이를 해결하기 위한 방법은 개발용 branch를 추가하는 것이다.

develop 브랜치를 만들어 기능을 테스트하고 main으로 push 한다.

 

문제점 2: 그냥 합치면 위험함. 변수 이름이 같은 경우에는 오류가 발생해 서비스가 정지됨.

깃허브에 있는 develop 브랜치를 먼저 내 로컬에서 합쳐서 충돌 이슈를 해결할 수 있음.

 

 

실전 협업

1. 초기 세팅

팀장: 초기 코드 작성 및 깃허브에 업로드

폴더 생성
초기 코드 작성
git init, add, commit
github repository 생성
github 업로드(push)

 

1 - 2. 팀장: dev(혹은 develop) 브랜치 생성

git switch -c develop
git push origin dev(깃허브에서 만들어도 상관없음)

 

1 - 3. github에서 develop 브랜치를 default로 설정하기

 

1 - 4. 팀원들을 collaborator로 등록

repository의 설정에서 변경하기.

 

1 - 5. 팀원: git clone 하기(팀장이 github clone 링크 줘야 함)

 

2. 기능 개발 시작

2 - 1. 기능 브랜치 생성 및 기능 개발

git switch -c 기능 브랜치명

develop도 공용 브랜치라 팀원끼리 기능별로 브랜치를 만들어서 작업해야 함.

작업 후 기능 브랜치에 commit & push 하기.

 

2 - 2. pull request 생성

default branch로 설정하면 pull request를 생성할 때 base 브랜치가 default 브랜치가 됨. develop으로 변경한 branch가 base로 자동으로 변경됨

 

2 - 3. 리뷰 요청하기

생성한 pull request의 reviewers에 사람들을 넣어 준다.

 

2 - 4. 코드 리뷰어: 리뷰하기

수정사항이나 코멘트를 달고 싶은 코드에 comment를 단 후 finish your review 클릭.

comment(댓글), approve(merge 승인), request changes(수정 요청).

 

2 - 5. 합치기 전 내 로컬에서 먼저 충돌 테스트하기

git pull origin branch name으로 충돌사항 확인 및 충돌 해결.

충돌이 안 나더라도 앱을 실행해서 테스트를 해봐야 안전함.

 

2 - 6. merge

수정 사항이 있는 경우 git push.

pull request를 merge 하기.

 

 

또 다른 기능을 만들려면 develop의 코드를 pull 해주고 다른 이름의 브랜치를 생성해서 2번의 과정을 반복하면 된다.

 


 

오늘 공부 내용 정리 및 회고

오늘은 git 협업 강의를 듣느라 개인 공부 할 시간이 없었다(강의를 들으면서 개인 공부까지 하기에는 내 머리에 과부하가 온다).

git 협업 강의의 내용은 대부분 알고 있는 내용이기는 했으나, 다시 한번 상기시키는 데에는 충분했다.

알고리즘은 계속 기하학 문제를 풀 생각이다.

728x90