
n개의 문자가 보여지는 전광판이 있습니다.
전광판은 1초에 한 글자씩 흘러가며, 처음에는 .이 가득 찬 상태로 시작하여 문자열을 완전히 흘려 보내고 나면 다시 .을 띄우고, 문자열을 띄우는 형태를 반복합니다.
전광판의 크기가 n, 전광판에 노출될 문자가 s일 때, t 초 후 전광판에 표시될 문구를 리턴하세요.
이때 n과 s는 1 이상 20 이하이며, t는 1초 이상 1000초 이하입니다.
전광판은 예를 들어 이렇게 흘러갑니다.
t: 0초 → 1초 → 7초 → 12초 → 16초
....... ......D Display ay..... .....Di
우선, 전광판은 .과 문자열로 이루어져 있습니다. 따라서 임의의 변수 text를 선언하고 그 안의 구조를 .*n(전광판 크기 = .의 길이) + s(문자열)로 대입합니다.
한번 문자열이 전광판의 왼쪽 끝으로 전부 이동하는데 걸리는 시간은 n+ s.length입니다. 처음 .의 길이와, 문자열의 길이를 더한 값으로, 이 주기가 지날 때마다 전광판에 새로운 text가 표시됩니다.
time은, 몇 번 돌았는지 신경쓰지 않고, 현재 주기에서 어디까지 왔느냐를 구하고자 선언한 변수입니다. (나누기의 몫이 아닌 나머지, 대분수에서 진분수의 분자만..)
인수로 받은 t값을 duration(전체 주기)로 나눠서 구합니다.
function solution(n, s, t) {
const text = '.'.repeat(n) + s;
const duration = n + s.length;
const time = t % duration;
let result = '';
for (let i = 0; i < n; i++) {
result += text[(time + i) % text.length];
}
return result;
}
결과값은 두 가지 방법으로 구할 수 있으며, 첫 번째 방법을 설명하겠습니다.
우선 result라는 결과 값을 빈 문자열로 선언합니다.
첫 문자는, time 값을 초기 문자열의 길이로 나눈 나머지 값 만큼의 수를 받아 초기 문자열에서 몇 번째 문자인지를 탐색합니다.
result는 문자열을 받아야 함으로, 이를 칸 수만큼 반복하여 첫 문자부터 시작하여 해당 칸을 꽉 채우는 문자열을 반환합니다.
여기서 text.length로 나누는 이유는, time과 i의 합이 text.length보다 크게 되면 text 배열의 인덱스를 초과하여 문자를 구할 수 없기 때문입니다.
function solution(n, s, t) {
const text = '.'.repeat(n) + s;
const duration = n + s.length;
const time = t % duration;
result = text.slice(time, time + n);
return result;
}
두 번째 방법입니다.
result 값은, text를 slice(혹은 substring)하여 구할 수 있습니다.
결과값은, 현재 시간(text의 첫 문자부터 뒤로 넘어간, 반환할 문자열의 첫 문자 위치)부터 전광판의 크기 n 만큼을 차지하는 문자열을 반환하게 됩니다.