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

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

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

 

 

코드카타 문제풀이

프린터 큐(Silver 3, 1966번)

문제 내용

 

문제 풀이 방법

문서의 개수인 N과 큐에서 출력할 데이터의 index인 M이 주어지고 중요도가 숫자로 N개가 주어질 때, M에 해당하는 데이터가 몇 번째로 뽑히는지 출력.

 

출력 순서가 많이 헷갈릴 수 있는 문제이다.

입력 예시가

6 0
1 1 9 1 1 1

이면, 0번째 index의 값인 첫 번째 1을 값으로 잡아야 한다. 하지만 1이 첫 번째에 있다고 무턱대고 뽑으면 안 된다. 뒤에 우선순위가 더 높은 9가 있기 때문이다. 9를 먼저 빼고 나면 다음과 같이 된다.

1 1 1 [1] 1

가장 큰 값이었던 9를 출력했으니 출력을 1번 한 상태이다.

이제 위 큐에서 최댓값은 1이기 때문에 1을 계속 제거해 나가다 보면 [1]을 뺄 시간이 된다 그 시간이 출력을 5번째이기 때문에 답은 5이다.

큐에서 값을 빼낼 때만 출력을 하는 것이기 때문에 답이 5가 된다.

이렇게 큐를 순환시키면서 문제를 풀어야 한다.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.LinkedList
import java.util.Queue
import java.util.StringTokenizer

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    // 첫 줄에 테스트케이스의 수가 주어진다. 각 테스트케이스는 두 줄로 이루어져 있다.
    //
    // 테스트케이스의 첫 번째 줄에는 문서의 개수 N(1 ≤ N ≤ 100)과, 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue에서 몇 번째에 놓여 있는지를 나타내는 정수 M(0 ≤ M < N)이 주어진다. 이때 맨 왼쪽은 0번째라고 하자. 두 번째 줄에는 N개 문서의 중요도가 차례대로 주어진다. 중요도는 1 이상 9 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.
    //
    // 테스트 케이스의 개수.
    // N(문서의 개수) M(원하는 문서가 있는 index)
    // 문서들 목록.

    // 1 1 9 1 1 1
    val case = readLine().toInt()
    for (i in 0 until case) {
        val (docCnt, index) = readLine().split(" ").map { it.toInt() }
        val queue: Queue<String> = LinkedList()
        val docData = StringTokenizer(readLine())

        for (j in 0 until docCnt) {
            if (docData.hasMoreTokens()) {
                if (j == index) queue.add(docData.nextToken()+"*")
                else queue.add(docData.nextToken())
            }
        }

        var print = 0
        while (queue.isNotEmpty()) {
            if (queue.peek() == queue.max()[0].toString()) {
                queue.poll()
                print++
            } else {
                if (queue.peek() == queue.max() && queue.peek().contains("*")) {
                    queue.poll()
                    print++
                    break
                } else {
                    val moveBackValue = queue.poll()
                    queue.add(moveBackValue)
                }
            }
        }

        println(print)
    }
}

 

풀이 과정

처음에 문서를 하나하나 StringTokenizer로 뽑아와 queue에 넣어주는 작업을 해줌. 출력해야 할 M번째 index가 되면 들어가는 숫자에 * 기호를 넣어 표시해 줌(같은 숫자인 경우를 구분하기 위함).

몇 번째에 출력되는지 판단할 print변수를 생성하고 queue가 빌 때까지 반복함.

만약 큐의 첫 번째 데이터가 큐의 최댓값과 같지 않다면 else로 넘어감(0번째 index를 넣어준 이유는 max값이 * 표시를 해놓은 값이면 5*와 같은 문자로 뽑히기 때문이다).

if의 조건(위의 조건)을 만족한다면 그 값을 빼고 print를 1 증가.

else에서는 큐의 첫 번째 값이 최댓값과 같고, 뽑아야 할 값에 *기호가 포함되어 있으면 값을 빼주고, print를 1 증가시키고 반복을 끝낸다.

위 조건에도 해당되지 않으면 첫 번째 값을 큐의 맨 뒤로 넘긴다.

 

 

문제 해결 과정

큐를 순환시키면서 가장 큰 값을 빼는 것을 반복하면 풀리는 문제였다.

문제 이해를 하는 게 좀 힘들었었다. 하지만 이해를 하고 코드를 작성하면 쉽게 풀린다.

 

 

 

최대 힙(Silver 2, 11279번)

문제 내용

 

문제 풀이 방법

큐에 입력받은 자연수 x를 넣는데, 자연수가 0인 경우는 데이터에서 가장 큰 값을 출력하고 출력한 값을 버린다.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val numbers = readLine().toInt()
    val priorityQueue = PriorityQueue<Int>(Comparator.reverseOrder())
    val printValue = StringBuilder()

    for (i in 0 until numbers) {
        val number = readLine().toInt()
        if (number == 0) {
            if (priorityQueue.isEmpty()) printValue.append(0).append("\n")
            else printValue.append(priorityQueue.poll()).append("\n")
        } else priorityQueue.offer(number)
    }

    println(printValue)
}

 

풀이 과정

데이터를 저장할 우선순위 큐 변수를 생성한다(priorityQueue) 시간 초과를 고려한 StringBuilder() 타입의 printValue도 생성한다(StringBuilder()는 굳이 안 써도 될 것 같다).

numbers(숫자의 개수)만큼 반복하면서 입력되는 숫자가 0이면 큐가 비어있는지를 확인 후 조건을 만족하면 0을 출력한다. 그 외의 경우는 큐에서 가장 큰 값을 출력한다(우선순위 큐는 poll()을 할 때, 가장 작은 값을 삭제하지만 처음에 우선순위 큐를 만들 때, reversedOrder()를 적용해서 가장 큰 값을 출력한다).

0이 아닌 경우에는 큐에 입력받은 number를 넣어 준다.

 

 

문제 해결 과정

우선순위 큐를 이용하면 쉽게 해결할 수 있다. kotlin에는 PriorityQueue를 지원해서 쉽게 풀 수 있었지만, 다른 언어는 풀기 힘들 수도 있겠다.

우선순위 큐가 데이터를 뺄 때 우선순위가 높은 값부터 뺀다고 해서 큐 안의 데이터가 정렬된다고 생각해서는 안된다. 정렬이 되어있지 않기 때문에 숫자의 범위가 넓다면 시간 초과가 날 수 있다는 점을 주의해야 한다.

 

 

안드로이드 앱 개발 입문 강의 수강

안드로이드 앱 개발 입문 1주 차

Android의 개요

소비자의 라이프 스타일을 주도하는 안드로이드(Android)

모바일 운영 체제이자 모바일 플랫폼이다

 

운영 체제(Window)란?

시스템 하드웨어를 관리할 뿐 아니라 응용 소프트웨어를 실행하기 위해 하드웨어 추상화 플랫폼과 공통 시스템 시비스를 제공하는 시스템 소프트웨어이다.

Window: 운영 체제, Excel: 응용 프로그램, Android: 모바일 운영 체제, Android 앱: 응용 소프트웨어

 

Android OS의 특성

오픈 소스: 개발자에게 개방되어 있으며 아파치 2.0 라이선스를 사용합니다.
자바 개발 언어: 안드로이드 개발할 때 사용하는 언어는 자바와 코틀린이다.
스마트폰을 위한 완벽한 컴포넌트 제공:핵심적인 커널 부분만 제공하고 다른 부분들은 개발자에게 맡기는 방식이 아니라 제공된 소스를 사용하면 스마트폰이 만들어지므로 대부분의 개발자는 그 위에 올라가는 앱만 만들면 된다.
쉬운 앱 간 연동: 안드로이드로 만든 앱은 다른 앱에서 제공하는 기능을 쉽게 사용할 수 있다. 예를 들어, 사진을 찍기 위해 단말의 사진 앱을 역동하면 카메라 미리 보기 화면을 직업 만들지 않아도 된다.
다양한 기능 지원: 안드로이드는 리눅스 기반이라서 새로운 하드웨어의 기능을 쉽게 만들 수 있다. 또한 빠른 업그레이드를 통해 플랫폼에서 다양한 기능을 제공하고 있다.

 

모바일 플랫폼

모바일 앱 실행을 쉽게 해주는 모바일 운영체제

모바일 앱 개발을 쉽게 해주는 애플리케이션 프레임워크

 

안드로이드 탄생 일화

  • 2005.07: 구글이 안드로이드 회사를 인수
  • 2007.11: oha(Open Handset Alliance) 결성
  • 2008.10: 안드로이드 오픈 소스 공개

 

안드로이드 앱 개발 입문 2주 차

Android Studio 프로젝트 구조

Android 탭과 Project탭이 존재함. Project 파일 구조를 볼 일은 자주 없으므로 Android 쪽 파일만 잘 보면 된다.

북마크는 코딩을 하다가 파일의 라인이 길어질 경우 f3을 눌러 북마크를 지정하고, ctrl + f3을 눌러 저장해 놓은 북마크를 쫓아갈 수 있다(다른 파일에 있어도)

Build Variants는 앱을 빌드할 때 debugging 용인지 release 용인지 정해 별도의 옵션을 지정할 수 있음.

Structure는 파일의 함수와 변수를 한눈에 볼 수 있게 함.

Version Control은 git을 연결해 놓으면 git commit log를 볼 수 있음.

Profiler는 앱을 실행하고 CPU나 메모리 사용량, 네트워크 사용량을 분석할 수 있다.

Logcat은 에러 로그와 특정 로그를 파악할 수 있음(가장 많이 쓰임)

 

 

Android Studio 프로젝트 실습

랜덤 주사위 숫자를 뽑는 간단한 예제를 구현함.

https://github.com/ImGaram/nb_pre_camp/tree/master/Lab3_Dice

 

 

개인 공부

그리디 알고리즘 공부

공부 내용 간단 정리

그리디 알고리즘 개념을 공부함

https://rkdrkd-history.tistory.com/125

 

[알고리즘] 그리디 알고리즘(Greedy Algorithm)

그리디 알고리즘이란?그리디 알고리즘(탐욕법)이란 현재 상황에서 가장 좋은 것(최선의 선택)을 고르는 알고리즘을 뜻한다. 그리디 알고리즘은 동적 프로그래밍(DP)을 간단한 문제 해결에 사용

rkdrkd-history.tistory.com

 


 

오늘 공부 내용 정리 및 회고

오늘부터 팀이 바뀐다. 새로운 팀원들과 같이 처음으로 팀 프로젝트를 한다. 이번 주에 팀원과 이야기를 많이 진행해 보고 싶다.

팀이 바뀜과 동시에 코틀린 문법에서 벗어나 안드로이드 입문으로 넘어간다. 본격적인 안드로이드 개발을 시작하는 주차이다.

그리디 알고리즘을 공부하면서 어떨 때 써야 하는지 대충 감은 잡았다. 이제 어떨 때 써야 하는지 직접 문제를 풀어보면서 공부해야 할 때다.

728x90

댓글