Simulation
시뮬레이션에 대한 개념과 문제 풀이
Simulation
1. 개념
시뮬레이션 문제 풀이에 염두할 두 가지는 다음과 같다.
- 하나의 문제를 최대한 여러 개로 분리한다.
- 예외 처리가 필요하다면 독립 함수로 구현한다.
1.1. 행렬 연산
각 행렬에서 같은 위치에 있는 값끼리 더하거나 빼는 연산이다.
1.2. 전치 행렬
arr[i][j]
를 arr[j][i]
로 바꾸는 연산이다.
1.3. 좌표 연산
좌푯값에 해당하는 배열의 위치를 활용한다. (3,4) 위치를 arr[4][3] = 1 과 같이 저장한다.
1.4. 좌표 이동을 오프셋 값으로 쉽게 표현하기
좌표 이동을 다음과 같이 오프셋 값을 이용해 for문으로 이동이 가능하다.
dy[] = (-1, -1, -1, 0, 0, 1, 1, 1, 0), dx[] = (-1, 0, 1, -1, 1, -1, 0, 1, 0)
1.5. 대칭, 회전 연산
- 대칭 :
A[i, j] = A[i, (N-1)-j]
- 회전 :
A[i, j] = A[(N-1)-j, i]
2. (문제) 이진 변환 반복하기
2.1. 설명
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
- x의 모든 0을 제거한다.
- x의 길이를 c라고 하면 x를 ‘c를 2진법으로 표현한 문자열’로 바꾼다.
예를 들어 x = “0111010” 이면 이진 변환 과정은 “0111010” -> “1111” -> “100” 입니다. 0과 1로 이루어진 문자열 s가 주어지고 s가 “1”이 될 때까지 계속해서 이진 변환을 할 때 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 배열에 담아 반환하는 solution() 함수를 완성해주세요.
2.2. 제약 조건
- s의 길이는 1 이상 150,000 이하입니다.
- s에는 ‘1’이 하나 이상 포함되어 있습니다.
2.3. 입출력의 예
s | result |
---|---|
"110010101001" | [3,8] |
"01110" | [3,3] |
"1111111" | [4,1] |
2.4. 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fun solution(s: String): IntArray {
var string = s
var numberOfConversions = 0
var numberOfRemoval = 0
// 1. string이 1이 될 때까지 무한 반복
while (string != "1") {
// 1.1. 0의 개수를 센 후 numberOfRemoval에 더한다
numberOfRemoval += string.count { it == '0' }
// 1.2. string에서 0을 제거한다
string = string.replace("0", "")
// 1.3. numberOfConversions을 1 올린다
numberOfConversions++
// 1.4. string의 크기를 2진수로 변환한 후 string에 저장한다
string = string.length.toString(2)
}
return intArrayOf(numberOfConversions, numberOfRemoval)
}
val message = solution("110010101001").toList()
println(message)
Reference
This post is licensed under CC BY 4.0 by the author.