[Programmers] #181925 - 수 조작하기 2 [Java][C++][Python]
수열의 인접한 값 차이로부터 w/a/s/d 조작 문자열을 복원하는 워밍업 문제.
[Programmers] #181925 - 수 조작하기 2 [Java][C++][Python]
1. 아이디어
numLog에서 인접한 두 값의 차이를 확인해서 어떤 조작이 있었는지 역으로 알아내는 문제다. 이전 값과 현재 값의 차이가 +1이면 w, -1이면 s, +10이면 d, 그 외의 경우(즉 -10)는 a로 판단해서 순서대로 이어 붙이면 조작 문자열이 복원된다.
2. 복잡도
| 접근 | 시간 | 공간 |
|---|---|---|
| 풀이 | $O(N)$ | $O(N)$ |
($N$ = numLog의 길이)
3. 코드
풀이 [Java][C++][Python]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public String solution(int[] numLog) {
StringBuilder sb = new StringBuilder();
for (int i = 1; i < numLog.length; i++) {
int prv = numLog[i - 1];
int cur = numLog[i];
if (prv + 1 == cur) {
sb.append("w");
} else if (prv - 1 == cur) {
sb.append("s");
} else if (prv + 10 == cur) {
sb.append("d");
} else {
sb.append("a");
}
}
return sb.toString();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>
using namespace std;
string solution(vector<int> numLog) {
string s;
for (int i = 1; i < numLog.size(); i++) {
int prv = numLog[i - 1];
int cur = numLog[i];
if (prv + 1 == cur) {
s += 'w';
} else if (prv - 1 == cur) {
s += 's';
} else if (prv + 10 == cur) {
s += 'd';
} else {
s += 'a';
}
}
return s;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
def solution(numLog):
ans = []
for prv, cur in zip(numLog, numLog[1:]):
if prv + 1 == cur:
ans.append("w")
elif prv - 1 == cur:
ans.append("s")
elif prv + 10 == cur:
ans.append("d")
else:
ans.append("a")
return "".join(ans)
Python은 numLog와 numLog[1:]를 zip으로 묶어 인접한 두 값을 (prv, cur) 쌍으로 바로 순회했다. 인덱스를 직접 다루지 않고도 이전 값과 현재 값을 나란히 꺼낼 수 있어, 인덱스 기반으로 순회하는 Java/C++보다 간결하다.
This post is licensed under CC BY 4.0 by the author.