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

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

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

 

출처: unsplash.com

 

코드카타 문제풀이

쉬운 최단거리(Silver 1, 14940번)

문제 내용

 

문제 풀이 방법

지도의 크기 n, m이 주어지고 지도의 크기만큼 숫자가 주어진다.

0은 갈 수 없는 땅이고, 1은 갈 수 있는 땅, 2는 목표지점이다.

각 칸에 목표 지점까지 가는 데 필요한 거리를 출력한다.

목표 지점까지 갈 수 없는 칸에는 -1을 출력한다.

 

 

해결 코드(스포 주의)

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

private var visited = arrayOf<BooleanArray>()
private var map = arrayOf<Array<Int>>()

private val dx = listOf(-1, 1, 0, 0)
private val dy = listOf(0, 0, -1, 1)

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val bw = BufferedWriter(OutputStreamWriter(System.out))
    val (sizeY, sizeX) = readLine().split(" ").map { it.toInt() }
    visited = Array(sizeY) { BooleanArray(sizeX) { false } }
    map = Array(sizeY) { Array(sizeX) { 0 } }

    var startPoint = emptyList<Int>()
    for (i in 0 until sizeY) {
        val mapData = readLine().split(" ").map { it.toInt() }
        map[i] = mapData.map { if (it != 0) -1 else 0 }.toTypedArray()

        if (startPoint.isEmpty()) {
            for (j in mapData.indices) if (mapData[j] == 2) startPoint = listOf(i, j)
        }
    }

    bfs(startPoint)

    for (i in map.indices) {
        bw.write("${map[i].joinToString(" ")}\n")
    }

    bw.flush()
    bw.close()
}

private fun bfs(startPoint: List<Int>) {
    val queue = ArrayDeque<List<Int>>()
    queue.addFirst(startPoint)
    visited[startPoint[0]][startPoint[1]] = true
    map[startPoint[0]][startPoint[1]] = 0

    while (queue.isNotEmpty()) {
        val data = queue.removeLast()

        for (i in dx.indices) {
            val mx = data[1] + dx[i]
            val my = data[0] + dy[i]

            if (mx in 0..< map[0].size && my in map.indices) {
                if (!visited[my][mx] && map[my][mx] != 0) {
                    visited[my][mx] = true
                    map[my][mx] = map[data[0]][data[1]] + 1
                    queue.addFirst(listOf(my, mx))
                }
            }
        }
    }
}

 

풀이 과정

방문 여부를 체크할 visited와 지도의 정보를 저장할 map을 생성한다.

상하좌우로 움직이는 경우를 체크할 dx, dy를 생성한다.

 

지도의 크기를 sizeY, sizeX에 입력받는다.

visited, map을 입력받은 값을 이용해 초기화한다.

 

시작점을 저장할 변수 startPoint를 생성하고 지도의 값을 입력받는다.

지도 데이터를 mapData로 정의하고, map에 넣어준다.

map에 넣어줄 때는 0(이동할 수 없는 칸)이 아닌 값은 -1로 넣어주고, 아니면 0을 넣어준다.

startPoint가 비어 있으면 반복으로 목표 지점(2)이 있는지 체크해 있으면 해당 위치의 index값을 list로 저장한다.

 

너비 우선 탐색 함수(bfs)를 수행한다.

ArrayDeque인 queue를 생성한다.

첫 데이터로 이전에 초기화한 startPoint 정보를 저장한다.

visited의 해당되는 위치를 true로 설정하고, map에 해당되는 부분에 0(안 움직여도 목표 지점이므로)을 넣어 준다.

다음으로 dx, dy로 움직일 수 있는 경우를 체크한다.

움직인 값이 map의 범위에 있는지 체크하고, 방문 여부와 옮긴 값이 0이 아닌지 체크한다(이동할 수 있는 칸인지 체크).

조건을 만족하면 이동한 visited값을 true로 설정하고, map의 이동한 index 값을 queue에서 뺀 값의 index의 +1 값을 넣어준다.

queue에서 빼낸 값과 거리가 1칸 있기 때문이다.

값을 변경해 주고, 이동한 index를 queue에 넣어 준다.

 

bfs 종료 후, map 값이 변경된 결과를 출력한다.

 

 

문제 해결 과정

bfs를 이용해 푸는 문제.

어렵지는 않았다.

 

 

나는야 포켓몬 마스터 이다솜(Silver 4, 1620번)

문제 내용

 

문제 풀이 방법

포켓몬의 이름이 영어로 주어지고, 포켓몬의 번호가 주어지면 해당 번호의 포켓몬 이름이, 포켓몬 이름이 주어지면 해당 포켓몬의 번호를 출력.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val bw = BufferedWriter(OutputStreamWriter(System.out))
    val (pokeCnt, case) = readLine().split(" ").map { it.toInt() }
    val dictionaryName = mutableMapOf<Int, String>()
    val dictionaryNumber = mutableMapOf<String, Int>()

    for (i in 1 .. pokeCnt) {
        val pokeName = readLine()
        dictionaryName[i] = pokeName
        dictionaryNumber[pokeName] = i
    }

    for (i in 0 until case) {
        val searchValue = readLine()

        runCatching {
            bw.write("${dictionaryName[searchValue.toInt()]}\n")
        }.onFailure {
            bw.write("${dictionaryNumber[searchValue]}\n")
        }
    }

    bw.flush()
    bw.close()
}

 

풀이 과정

포켓몬의 개수와 입력 case를 입력받고, 번호를 key로 가지는 map dictionaryName과 이름을 key로 가지는 map dictionaryNumber를 생성한다.

포켓몬을 입력받으면서 두 개의 dictionary 변수에 각각 key와 value를 설정해 준다.

 

case의 수만큼 반복해 주면서

검색할 포켓몬의 이름 또는 번호를 입력받는다.

runCatching을 이용해 number인 경우에는 dictionaryName의 searchValue를 toint()로 변환해 이름을 찾아서 출력하고

예외가 발생해 onFailure로 이동한 경우에는 dictionaryNumber의 searchValue를 이용해 번호를 찾아서 출력한다.

 

 

문제 해결 과정

map을 이용해 값을 찾아내서 출력하는 문제.

찾는 포켓몬이 번호로 주어질 때와 이름으로 주어지는 경우를 구분을 잘해서 출력해야 한다.

 

 

팀 프로젝트 개발

연락처 추가 기능 구현

공부 내용 간단 정리

상단에 + icon button을 만들어서 사용자 연락처를 추가할 수 있도록 구현함.

DialogFragment를 이용해 커스텀 Dialog를 만들어 주었음.

Dialog 안에 Spinner를 넣어서 알람을 울릴 시간을 설정해 주었다.

리스트 갱신은 ListAdapter를 활용함.

 

결과 화면

왼쪽: 연락처 추가 후 리스트, 오른쪽: 연락처 추가 Dialog

 


 

오늘 공부 내용 정리 및 회고

오늘은 연락처 추가 기능을 구현하고 팀원들과 현재 작업 사항들을 merge 하는 일을 했다.

튜터님이 오셔서 아이디어에 대한 피드백을 주고 가셨다.

우리의 앱만의 기능이 어떤 게 있을지 생각해 봐야겠다.

일단 나는 필수 구현 기능은 오늘로 끝났다.

728x90