직사각형 형태의 그림 파일이 있고, 이 그림 파일은 1 × 1 크기의 정사각형 크기의 픽셀로 이루어져 있습니다. 이 그림 파일을 나타낸 문자열 배열 picture과 정수 k가 매개변수로 주어질 때, 이 그림 파일을 가로 세로로 k배 늘린 그림 파일을 나타내도록 문자열 배열을 return 하는 solution 함수를 작성해 주세요.
1 ≤ picture의 길이 ≤ 20
1 ≤ picture의 원소의 길이 ≤ 20
모든 picture의 원소의 길이는 같습니다.
picture의 원소는 '.'과 'x'로 이루어져 있습니다.
1 ≤ k ≤ 10
picture | k | result |
---|---|---|
[".xx...xx.", "x..x.x..x", "x...x...x", ".x.....x.", "..x...x..", "...x.x...", "....x...."] | 2 | ["..xxxx......xxxx..", "..xxxx......xxxx..", "xx....xx..xx....xx", "xx....xx..xx....xx", "xx......xx......xx", "xx......xx......xx", "..xx..........xx..", "..xx..........xx..", "....xx......xx....", "....xx......xx....", "......xx..xx......", "......xx..xx......", "........xx........", "........xx........"] |
["x.x", ".x.", "x.x"] | 3 | ["xxx...xxx", "xxx...xxx", "xxx...xxx", "...xxx...", "...xxx...", "...xxx...", "xxx...xxx", "xxx...xxx", "xxx...xxx"] |
예제 1번의 picture는 다음과 같습니다.
.xx...xx.
x..x.x..x
x...x...x
.x.....x.
..x...x..
...x.x...
....x....
이를 가로 세로로 k배, 즉 2배 확대하면 그림 파일은 다음과 같습니다.
..xxxx......xxxx..
..xxxx......xxxx..
xx....xx..xx....xx
xx....xx..xx....xx
xx......xx......xx
xx......xx......xx
..xx..........xx..
..xx..........xx..
....xx......xx....
....xx......xx....
......xx..xx......
......xx..xx......
........xx........
........xx........
따라서 ["..xxxx......xxxx..", "..xxxx......xxxx..", "xx....xx..xx....xx", "xx....xx..xx....xx", "xx......xx......xx", "xx......xx......xx", "..xx..........xx..", "..xx..........xx..", "....xx......xx....", "....xx......xx....", "......xx..xx......", "......xx..xx......", "........xx........", "........xx........"]를 return 합니다.
예제 2번의 picture는 다음과 같습니다.
x.x
.x.
x.x
이를 가로 세로로 k배, 즉 3배 확대하면 그림 파일은 다음과 같습니다.
xxx...xxx
xxx...xxx
xxx...xxx
...xxx...
...xxx...
...xxx...
xxx...xxx
xxx...xxx
xxx...xxx
따라서 ["xxx...xxx", "xxx...xxx", "xxx...xxx", "...xxx...", "...xxx...", "...xxx...", "xxx...xxx", "xxx...xxx", "xxx...xxx"]를 return 합니다.
function solution(picture, k) {
let result = [];
for(let i = 0; i < picture.length; i++){
let repaetArr = [...picture[i]].map((v) => v.repeat(k)).join("")
for(let j = 0; j < k; j++){
result.push(repaetArr)
}
}
return result
}
해당 문제의 핵심은 내부에 있는 문자열을 k 만큼 반복해야 한다는 점이였다.
repeat
메서드를 활용해 수월하게 문제를 해결 할 수 있었다.
picture를 순회하고 picture각 요소들(picure[i]
)을 스프레드 연산자를 활용해 각각 나열된 배열로 만들어 줬다.
map 메서드는 가공된 새로운 배열로 반환해 준다.
k
수 만큼(repeat(k)
) 문자열을 복사하여 join("")
해 주었다.
이후 k 순 만큼 result에 push해 result를 반환했다.
for문을 활용해 순회 했지만 forEach
를 통해 가독성 있게 수정 할 수 있다.
❗️
forEach
메서드 는for
문 보다 가독성이 좋지만
break, continue 같은 제어문을 사용할 수 없어 중간에 멈출 수 없는 단점을 가지고 있다. 그래서 데이터 양이 많을 경우 성능 측면에서 불리할 수 있다.
function solution(picture, k) {
let result = [];
picture.forEach((el) => {
let repeatArr = [...el].map((v) => v.repeat(k)).join("")
for(let j = 0; j < k; j++) result.push(repeatArr)
})
return result
}
또한 for문도 내부 코드가 한줄이라면 다른 메서드 처럼 한줄로 표현 할 수 있다.
repaet?
- 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열을 반환합니다.
str.repeat(count);
repeat
메서드를 알고 있지 않았다면 더 오래 문제를 풀어야하지 않았을까 싶다.
코테는 많이 풀어보면서 여러 메서드를 활용할 수 있다는 점이 좋다.
오랜만에 다시 코테를 풀려고 하니 머리가 굳어 있어서
다시 1일 1코테는 힘들더라고 조금씩 습관화 하려고 한다.
언젠간 3레벨 코테까지 푸는 날이 왔으면 좋겠다.