[백준 1937] - 욕심쟁이 판다(Kotlin)[골드3]

2023. 8. 13. 00:30· CodingTest/Baekjoon
목차
  1. 문제
  2. 문제 설명
  3. 코드

문제

https://www.acmicpc.net/problem/1937

 

1937번: 욕심쟁이 판다

n × n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에

www.acmicpc.net

 

문제 설명

문제 초반에는 단순하게 dfs를 진행해서 최대로 갈 수 있는 칸 수를 기록하면서 진행했다.

골드 3치고 문제가 너무 쉽다고 생각했는데,

34% 정도에서 시간초과가 발생했다.

생각해 보면 당연하다. 최대 배열 크기가 500이고, 500x500을 계속해서 무식하게 탐색하면 시간초과가 나는 건데 왜 이 생각을 못했을까.

 

그렇다면 수정해야 될 것은 탐색을 하는 범위라고 생각했다.

해결방법은 2가지정도로 생각했다.

  1. 탐색의 범위를 줄이기
  2. 방문처리를 해서 탐색한 지점을 다시 탐색하지 않기

첫 번째 방법은 어느 지점에서 출발할지도 선택해야 하고, 탐색의 범위를 줄이는 것이 불가능하다고 판단했다.

따라서 이미 탐색한 범위를 다시 탐색하지 않는다면 시간을 줄일 수 있을 것이라고 판단했다.

 

이미 탐색함 지점을 다시 탐색하지 않기 위해서 어떻게 해야할까에 대해서 고민을 많이 했다.

방문처리는 다양한 것인데, 이 방문처리를 통해서 어떠한 결과를 이끌어낼까에 대해서 고민을 한 결과

해당 지점에서 최대로 갈 수 있는 칸 수를 기록하면 방문처리도하고, 최종 목표인 최대 지점까지의 결과를 알 수 있을 것이라고 판단했다.

예를 들어서 9를 탐색한다고 가정하자. 

처음 탐색에서 아래방향으로 탐색을 한다고 가정할 시 , 끝까지 탐색을 하고 9에는 3이, 11에는 2가, 15에는 1이 저장될 것이다.

다른 방향을 탐색할 시, 최댓값을 계속해서 갱신한다.

이렇게 하면, 만약 내가 다른지점에서 탐색을 하다가 9,11,15에 도착하면 그때는 이미 구한 값이 있기 때문에 탐색을 진행하지 않고

이미 구한값을 그대로 넣어주면 된다. (DP의 개념과 비슷하다)

자세한 코드는 주석을 참고하시면 됩니다

코드

import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.max
class `1937` {
val br =BufferedReader(InputStreamReader(System.`in`))
var size =0
var answer =0
private lateinit var graph : Array<Array<Int>>
private lateinit var accum : Array<Array<Int>>
val x = arrayOf(1,-1,0,0)
val y = arrayOf(0,0,1,-1)
init{
input()
search()
print(answer)
}
fun input(){
size = br.readLine().toInt()
graph = Array(size, {Array(size, {0})})
accum = Array(size, {Array(size, {1})})
for(i in 0 until size){
val line = br.readLine()
val token = line.split(" ")
for(j in 0 until size){
graph[i][j] = token[j].toInt()
}
}
}
fun search() : Int{
for(i in 0 until size){
for(j in 0 until size){
answer = max(answer,dfs(i,j))
}
}
return answer
}
fun dfs(row : Int, col : Int) : Int{
val now = graph[row][col]
if(accum[row][col]!=1) //이미 한번 거친 좌표라면 탐색을 하지 않고 넣어줌.
return accum[row][col]
for(dir in 0 until 4){
val mx = row + x[dir]
val my = col + y[dir]
if(mx !in graph.indices || my !in graph.indices) //배열 범위를 벗어날 경우
continue
if(now >= graph[mx][my]) //now가 작아야함. 반.드.시
continue
accum[row][col] = max(accum[row][col],dfs(mx,my)+1)
}
return accum[row][col]
}
}
fun main(){
val solution = `1937`()
}

 

저작자표시 (새창열림)

'CodingTest > Baekjoon' 카테고리의 다른 글

[백준 1106] - 호텔(Kotlin)[골드5]  (0) 2023.08.14
[백준 17135] - 타워디펜스(Kotlin)[골드3]  (0) 2023.08.13
[백준 2146] - 다리만들기(Kotlin)[골드3]  (0) 2023.08.11
[백준 14502] - 연구소(Kotlin)[골드4]  (0) 2023.08.10
[백준 11967] - 불 켜기(C++)[골드2]  (2) 2023.07.05
  1. 문제
  2. 문제 설명
  3. 코드
'CodingTest/Baekjoon' 카테고리의 다른 글
  • [백준 1106] - 호텔(Kotlin)[골드5]
  • [백준 17135] - 타워디펜스(Kotlin)[골드3]
  • [백준 2146] - 다리만들기(Kotlin)[골드3]
  • [백준 14502] - 연구소(Kotlin)[골드4]
재한
재한
안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (504)
    • Skils (118)
      • Android (52)
      • C++ (5)
      • Kotlin (36)
      • Algorithm (24)
      • Server (1)
    • CodingTest (228)
      • Programmers (45)
      • Baekjoon (183)
    • Experience (8)
      • 후기(코딩테스트,프로그램,프로젝트) (8)
    • Computer Science (70)
      • Design Pattern (2)
      • OOP (2)
      • Computer Architecture (14)
      • OS (2)
      • Software Engineering (3)
      • DataBase (8)
      • Network (39)
    • 학교 (75)
      • R프로그래밍 (26)
      • 회계와 사회생활 (17)
      • 컴퓨터학개론 (20)
      • it기술경영개론 (12)

블로그 메뉴

  • 홈
  • 태그
  • 카테고리
  • 글쓰기
  • 설정

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
재한
[백준 1937] - 욕심쟁이 판다(Kotlin)[골드3]
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.