공원산책
현재 좌표에서 주어진 route의 방향과 거리만큼 이동하고 만약 장애물이나 범위를 벗어난다면 해당 route는 이동하지 않는다. 마지막에 위치한 좌표를 반환한다.
나의 코드
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
}
}
park[i].indexOf('S')
pTemp[0] !in park.indices // 이동한 행(row)의 좌표가 park의 행 범위에 포함하지 않는 조건
다른사람의 풀이
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()
}
}
// 불변 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"
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를 하는데 나머지계산(%)도 복합연산자가 가능하다는 걸 알았다. %의 복합연산자는 쓸 일이 많이 없었어서 이제 알게된 듯 싶다.