[백준 2661] - 좋은수열(Kotlin)[골드4]

2023. 9. 13. 16:58· CodingTest/Baekjoon
목차
  1. 문제
  2. 문제 풀이
  3. 코드

문제

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

 

2661번: 좋은수열

첫 번째 줄에 1, 2, 3으로만 이루어져 있는 길이가 N인 좋은 수열들 중에서 가장 작은 수를 나타내는 수열만 출력한다. 수열을 이루는 1, 2, 3들 사이에는 빈칸을 두지 않는다.

www.acmicpc.net


문제 풀이

전형적인 백트래킹 문제의 예시라고 할 수 있다.

 

백트래킹에 대해 간단히 얘기하자면 사전적 정의는 되추적 알고리즘이라고 불린다.

결과를 찾는 도중 막히면 다시 되돌아가서 결과를 찾고, 모든 노드를 탐색해서 만드는 DFS와 비슷하다.

DFS와 다른 점은 노드를 탐색하기 전에 특정한 조건을 걸고 해당 조건에 부합하지 않는다면 탐색을 진행하지 않는다.

해당 문제에서 특정한 조건이 이제 인접한 두 개의 부분 수열이 동일한가에 대한 여부라고 생각하면 될 것이다.

 

요약하자면 백트래킹은 DFS를 진행하면서 모든 노드가 아닌 특정한 조건에 부합하는 노드만 탐색한다.

해당 문제에서 특정한 조건은 인접한 두 부분수열이 동일한가!이다.

 

해당 부분이 DFS 함수이다.

만약 평범한 DFS 문제였다면 if(check())를 통해서 조건을 걸지 않고, 모든 노드에 대해 탐색했을 것이다.

이제 백트래킹을 하는 조건에 대한 함수이다.

  • 여기서 subStr은 기준문자열이다. 1글자,2글자,3글자 ... 서서히 늘어난다.
  • 그러한 기준문자열을 잡고, 그 다음 글자부터 기준문자열만큼의 문자열을 뽑아서 두 개의 문자열이 동일한지 판단해서 만약 같다면 조건에 부합하지 않고, 같지 않다면 탐색을 진행한다.
  • 무사히 for 문을 완수했다면 조건에 부합한다는 뜻이다.

 

내가 한가지 놓쳤던 점은 처음으로 solution을 통해서 만들어진 문자열은 최솟값일 수밖에 없다는 뜻이다.

따라서 비교를 하지 않고, 출력하고 종료하는 식으로 구현했다.

 

코드

package BOJ.BackTracking.`2661_좋은수열`.ljh
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.system.exitProcess
class `2661` {
private val br = BufferedReader(InputStreamReader(System.`in`))
private var n = 0
private val items = arrayOf("1", "2", "3")
private var answer = ""
init {
n = readln().toInt()
}
fun solution(cnt: Int) {
if (cnt == n) {
println(answer)
exitProcess(0)
} else {
for (item in items) {
answer += item
if (check()) {
solution(cnt + 1)
}
answer = answer.dropLast(1)
}
}
}
fun check(): Boolean { //같은 패턴이 있는지 확인을 하는 법.
if (answer.length == 1)
return true
for (j in answer.indices) { // == j until answer.length
for (i in j..< answer.length) {
val substr = answer.substring(j..i)
if (i + 1 >= answer.length || i + substr.length >= answer.length)
break
val mainstr = answer.substring(i + 1..i + substr.length) //i+1부터 i까지 검사
if (substr == mainstr)
return false
}
}
return true
}
}
fun main() {
val solution = `2661`()
solution.solution(0)
}
저작자표시 (새창열림)

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

[백준 15659] - 연산자 끼워넣기(3)(Kotlin)[골드4]  (0) 2023.09.17
[백준 1062] - 가르침(Kotlin)[골드4]  (0) 2023.09.17
[백준 2631] - 줄 세우기(Kotlin)[골드4]  (0) 2023.08.16
[백준 15486] - 퇴사2(Kotlin)[골드5]  (0) 2023.08.15
[백준 1106] - 호텔(Kotlin)[골드5]  (0) 2023.08.14
  1. 문제
  2. 문제 풀이
  3. 코드
'CodingTest/Baekjoon' 카테고리의 다른 글
  • [백준 15659] - 연산자 끼워넣기(3)(Kotlin)[골드4]
  • [백준 1062] - 가르침(Kotlin)[골드4]
  • [백준 2631] - 줄 세우기(Kotlin)[골드4]
  • [백준 15486] - 퇴사2(Kotlin)[골드5]
재한
재한
안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (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
재한
[백준 2661] - 좋은수열(Kotlin)[골드4]
상단으로

티스토리툴바

개인정보

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

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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