TIL #36

loci·2024년 6월 5일
0

TIL

목록 보기
34/103

공원산책

현재 좌표에서 주어진 route의 방향과 거리만큼 이동하고 만약 장애물이나 범위를 벗어난다면 해당 route는 이동하지 않는다. 마지막에 위치한 좌표를 반환한다.

  1. 어떻게 현재좌표를 구할 것 인지
  2. 해당 route로 어떻게 이동시킬 것 인지
  3. 장애물이나 범위를 벗어났는지 어떻게 검사할 것인지(만약 2칸을 이동한다고 하면 그사이에 장애물이 있으면 안된다.)

나의 코드

class Solution {
    fun solution(park: Array<String>, routes: Array<String>): IntArray {
        var answer: IntArray = intArrayOf()
        var p = intArrayOf(0,0)
        //현재위치
        for(i in park.indices){
            var sIndex = park[i].indexOf('S')
            if(sIndex != -1){
                p[0] = i
                p[1] = sIndex
                break
            }
        }
        
        for(i in routes){
            var next = i.substring(2).toInt()
            var pTemp = p.copyOf()
            var pass = true
            for(j in 1..next){
                when(i[0].toString()){
                    "N" -> pTemp[0] -= 1
                    "S" -> pTemp[0] += 1
                    "W" -> pTemp[1] -= 1
                    else -> pTemp[1] += 1
                }
                //장애물, 범위 검사
                if(pTemp[0] !in park.indices || pTemp[1] !in park[0].indices || park[pTemp[0]][pTemp[1]] =='X') {
                    pass = false
                    break
                }
            }
            if(pass){
                p = pTemp
            }
            
        }
        return p
    }
}
  1. 현재좌표를 알아내 저장해줌 (해당요소가 없으면 -1반환)
park[i].indexOf('S')
  1. routes를 순회해 when으로 해당 방향으로 1씩 이동시킴
  2. 1씩 이동할때 장애물이 있는 좌표거나 범위를 벗어나면 false로 바꾸고 루프를 종료시킴
pTemp[0] !in park.indices // 이동한 행(row)의 좌표가 park의 행 범위에 포함하지 않는 조건
  1. 장애물이 없고 범위를 벗어나지 않았다면 임시좌표를 현재좌표로 바꿔줌

다른사람의 풀이

class Solution {
    private fun findStart(park: Array<String>): MutableList<Int> {
        for (i in park.indices)
            for (j in park[i].indices)
                if (park[i][j] == 'S')
                    return mutableListOf(i, j)
        return mutableListOf(0, 0)
    }

    fun solution(park: Array<String>, routes: Array<String>): IntArray {
        val directions = mapOf('E' to (0 to 1), 'W' to (0 to -1), 'N' to (-1 to 0), 'S' to (1 to 0))
        return routes.map { it[0] to it.drop(2).toInt() }
                .fold(findStart(park)) { pos, (direction, distance) ->
                    val prevPos = pos.toMutableList()
                    val nextPos = pos.toMutableList()
                    repeat(distance) {
                        nextPos[0] += directions[direction]!!.first
                        nextPos[1] += directions[direction]!!.second
                        if (!(0 <= nextPos[0] && nextPos[0] < park.size && 0 <= nextPos[1] && nextPos[1] < park[0].length && park[nextPos[0]][nextPos[1]] != 'X')) 
                            return@fold prevPos
                    }
                    return@fold nextPos
                }.toIntArray()
    }
}

Collection Map

Map 선언 및 초기화

// 불변 Map
val readOnlyMap: Map<Int, String> = mapOf(1 to "one", 2 to "two", 3 to "three")

// 가변 Map
val mutableMap: MutableMap<Int, String> = mutableMapOf(1 to "one", 2 to "two")

map은 기본적으로 non-nullable이기 때문에 value를 nullable로 사용하는 법

// nullable value
val numberMap: MutableMap<Int, String?> = mutableMapOf(1 to "one", 2 to null)
{1=one, 2=null}

key도 nullable이 가능하다고 하는데 거의 사용하지 않는 것 같다.

// nullable key
val numberMap: MutableMap<Int?, String?> = mutableMapOf(1 to "one", 2 to null, null to "unknown")
// {1=one, 2=null, null=unknown}

요소접근

val numberMap = mapOf(1 to "one", 2 to "two", 3 to "three")
// 키를 사용하여 값 접근
val one = numberMap[1]  // "one"
// get 메소드를 사용하여 값 접근
val two = numberMap.get(2)  // "two"

가변 Map(mutableMap)일 때 추가 및 수정

val mutableMap = mutableMapOf(1 to "one", 2 to "two")
// 해당 key에 value 추가(요소 추가), 해당 키가 없어야함
mutableMap[3] = "three" // {1=one, 2=two, 3=three}

// 해당 key의 value 수정(요소 수정)
mutableMap[2] = "Two" // {1=one, 2=Two}

// 키를 사용하여 요소 제거 
mutableMap.remove(1) 

// 키와 값을 모두 지정하여 요소 제거
mutableMap.remove(3, "three")

반복문 사용

// 반복처리
for ((key, value) in numberMap) { println("Key: $key, Value: $value") }

기타 사용법

// 해당 key가 존재하는지 체크 
val containsKey = numberMap.containsKey(2) // true

//해당 value가 존재하는지 체크
val containsValue = numberMap.containsValue("four") // false 

// map의 크기 
val size = numberMap.size // 3 

// 비어 있는지 체크 
val isEmpty = numberMap.isEmpty() // false

오늘 2주차 과제 calculator Lv1을 완료하고 Lv2를 하는데 나머지계산(%)도 복합연산자가 가능하다는 걸 알았다. %의 복합연산자는 쓸 일이 많이 없었어서 이제 알게된 듯 싶다.

profile
편리한 개발자

0개의 댓글