간단하게 앱 개발과 코틀린 공부를 같이 시작했는데 우선 간단한 로딩 화면을 생성해보았다.

 

매니패스트 파일을 우선 아래와 같이 바꾸어 주는데 상단바를 없애고 싶어서 스타일을 추가해주었다.

나머지 intent-filter는 초기 메인 액티비티에 있는 것을 복붙하면 된다.

 

<AndroidManifest.xml>

<activity android:name=".SplashActivity"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity">
        </activity>

 

코틀린이 익숙하지 않아서 조금 헷갈리는 부분은 있지만 자바로 작성했을 때와 크게 차이가 없는 것 같다.

 

<SplashActivity.kt>

import android.content.Intent
import android.os.Bundle
import android.os.Handler
import androidx.appcompat.app.AppCompatActivity

class SplashActivity : AppCompatActivity() {

    private val SPLASH_TIME_OUT:Long = 3000
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.splash)

        Handler().postDelayed({
            startActivity(Intent(this, MainActivity::class.java))

            finish()
        }, SPLASH_TIME_OUT)
    }
}

programmers.co.kr/learn/courses/30/lessons/49191

 

코딩테스트 연습 - 순위

5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2

programmers.co.kr

python으로 코테를 준비할 때 고득점 킷/그래프 이론에서 풀었던 문제이다. 처음 접근법을 생각해내긴 했는데 그것을 잘 가공해서 구현을 했어야 했는데 그걸 실패해 결국 다른 사람의 풀이를 보고 풀 수 있었다.

 

파이썬 set의 활용에 대해서 좀 더 공부하면 좋을 것 같다.

 

이 문제에서 중요한 것은 인접행렬과 비슷하게 승리와 패배 셋을 잘 만들어주고(A가 B를 이겻다면 A의 승리셋에 B를 넣어주고 B의 패배셋에 A를 넣어준다.)

 

승 갯수와 패 갯수가 n-1이 되는 사람이 답이라는 것을 캐치하는 것이 중요한 것 같다.

 

def solution(n, results):
    answer = 0
    win = {x:set() for x in range(1, n+1)}
    lose = {x:set() for x in range(1, n+1)}
    for a, b in results:
        win[a].add(b)
        lose[b].add(a)
    
    for i in range(1, n+1):
        for winner in lose[i]:
            win[winner].update(win[i])
        for loser in win[i]:
            lose[loser].update(lose[i])
            
    for i in range(1, n+1):
        if len(win[i]) + len(lose[i]) == n-1:
            answer += 1
    
    return answer

programmers.co.kr/learn/courses/30/lessons/68645#

 

코딩테스트 연습 - 삼각 달팽이

5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

programmers.co.kr

쉬운 문제인 줄 알고 접근했는데 생각보다 어려워서 시간을 많이 썻다..

 

처음 접근할 때 3가지 방향을 나눠서 하는 법은 생각했지만 좌표를 설정해서 조절하는 것을 생각하지 못한 것이 잘못했다고 생각한다.

 

그래서 풀이를 위해서

 

1. 위에서 왼쪽 아래로 나가는 방향, 일직선 가로로 나가는 방향, 아래 오른쪽에서 위쪽 대각선으로 나가는 방향으로 모드를 나누었다. (이 부분은 모듈러 연산을 사용하는 것이 더깔끔할듯?)

 

2. x,y 좌표를 만들어서 n, n-1, n-2...씩 연산을 해주고 각 모드의 연산이 끝나면 x,y좌표를 재설정해주었다.

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int dal[1001][1001];

vector<int> solution(int n) {
    vector<int> answer;
    int mode = 1;
    int cnt = 1;
    int x = 0, y = 0;
    for(int i = n; i >= 1; i--){
        if(mode == 1){
            for(int j = 0; j < i; j++){
                dal[x+j][y] = cnt;
                cnt++;
            }
            x += i-1;
            y += 1;
            mode++;
        }else if(mode == 2){
            for(int j = 0; j < i; j++){
                dal[x][y+j] = cnt;
                cnt++;
            }
            x -= 1;
            y += i-2;
            mode++;
        }else{
            for(int j = 0; j < i ; j++){
                dal[x-j][y-j] = cnt;
                cnt++;
            }
            x -= i-2;
            y -= i-1;
            mode = 1;
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = 0; j < i; j++){
            answer.push_back(dal[i-1][j]);
        }
    }
    return answer;
}

+ Recent posts