프로그래머스[programmers] - 여행경로(Kotlin)[LV3]

2024. 3. 8. 23:35· CodingTest/Programmers
목차
  1. 문제
  2. 문제 풀이
  3. 전체 코드

문제

https://school.programmers.co.kr/learn/courses/30/lessons/43164

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

평소와 같이 DFS/BFS로 생각을 하고 풀었지만, 평범한 DFS/BFS 문제는 아니었다.

테스트케이스에서 주는 혼란을 주는 것도 있었다.

 

테스크케이스를 예로 들어서 설명해보겠다.

[ ICN, SFO] , [ICN, ATL] , [SFO, ATL] , [ATL, ICN], [ATL, SFO]라는 티켓이 있다.

0번 index -> 1번 index로의 값은 항공권으로 갈 수 있다는 뜻이다.

여기서 생각해야 볼 것은 경로가 여러 개라면 알파벳 순서로 앞서는 것이 정답이기 때문에 알파벳 순서로 정렬을 해줘야 한다.

val list = tickets.sortedBy{it[1]}

1번째 index가 도착지점이기 때문에 도착지점을 알파벳 순서로 정렬을 해줬다.

 

탐색은 DFS를 사용했다.

 

재귀의 조건은 재귀의 깊이가 tickets의 깊이와 같다면, 즉 모든 티켓을 사용할 경우이다.

 

해당 티켓을 이미 사용했는지, 안 했는지를 검사하기 위해서 boolean 배열이 필요하다.

반복문은 티켓의 개수만큼 반복하고, 사용하지 않은 티켓 중에서 출발지점이 현재 재귀의 출발지점과 동일한 지역과 같아야 한다.

for(i in 0 until tickets.size){
if(!visited[i] && tickets[i][0] == cur){
visited[i] = true
dfs(tickets[i][1], cnt+1, tickets, visited)
if(!isFinished){
result.removeLast()
visited[i]=false
}
}
}

 

dfs로 갈 수 있는 항공권을 모두 검사했지만, 티켓을 모두 사용하지 못했다면 해당 순서에서 티켓의 사용은 올바르지 않다는 뜻이므로,

경로의 마지막 값을 제거하고, 티켓의 사용을 취소한다.

 

문제의 특이한 점은 모든 지점을 방문했냐가 아닌 티켓을 모두 사용했는가라는 점이었다.

실제로 A->B->C를 모두 방문했더라도, 티켓을 모두 사용하지 않았다면 해당 경로는 적절하지 않다는 점이었고,

이 점이 해당 문제의 차별점이자 어려운 점이었던 것 같다.

 

전체 코드

class Solution {
val result = mutableListOf<String>()
var isFinished = false
fun solution(tickets: Array<Array<String>>): Array<String> {
val visited = Array(tickets.size){false}
var start = "ICN"
val list = tickets.sortedBy{it[1]}
dfs(start,0,list,visited)
return result.toTypedArray()
}
fun dfs(cur: String, cnt: Int,tickets:List<Array<String>>, visited:Array<Boolean>){
if(cnt==tickets.size){ //다 뽑았을때
isFinished = true
}
result.add(cur)
for(i in 0 until tickets.size){
if(!visited[i] && tickets[i][0] == cur){
visited[i] = true
dfs(tickets[i][1], cnt+1, tickets, visited)
if(!isFinished){
result.removeLast()
visited[i]=false
}
}
}
}
}

 

저작자표시 (새창열림)

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

프로그래머스[programmers] - 연속된 부분 수열의 합(Kotlin)[LV2]  (1) 2024.03.11
프로그래머스[programmers] - 두 원 사이의 정수 쌍(Kotlin)[LV2]  (0) 2024.03.11
프로그래머스[programmers] - 섬 연결하기(Kotlin)[LV3]  (0) 2024.03.07
프로그래머스[programmers] - k진수에서 소수 개수 구하기(Kotlin)[LV3]  (0) 2023.11.23
프로그래머스[programmers] - 표현 가능한 이진 트리(Kotlin)[LV3]  (0) 2023.11.01
  1. 문제
  2. 문제 풀이
  3. 전체 코드
'CodingTest/Programmers' 카테고리의 다른 글
  • 프로그래머스[programmers] - 연속된 부분 수열의 합(Kotlin)[LV2]
  • 프로그래머스[programmers] - 두 원 사이의 정수 쌍(Kotlin)[LV2]
  • 프로그래머스[programmers] - 섬 연결하기(Kotlin)[LV3]
  • 프로그래머스[programmers] - k진수에서 소수 개수 구하기(Kotlin)[LV3]
재한
재한
안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (502)
    • Skils (116)
      • Android (50)
      • 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
재한
프로그래머스[programmers] - 여행경로(Kotlin)[LV3]
상단으로

티스토리툴바

개인정보

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

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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