[프로그래머스-기초] 그림 확대

JE·2024년 9월 8일
0

코테/코플릿

목록 보기
57/57

문제 설명

직사각형 형태의 그림 파일이 있고, 이 그림 파일은 1 × 1 크기의 정사각형 크기의 픽셀로 이루어져 있습니다. 이 그림 파일을 나타낸 문자열 배열 picture과 정수 k가 매개변수로 주어질 때, 이 그림 파일을 가로 세로로 k배 늘린 그림 파일을 나타내도록 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

제한사항

1 ≤ picture의 길이 ≤ 20
1 ≤ picture의 원소의 길이 ≤ 20
모든 picture의 원소의 길이는 같습니다.
picture의 원소는 '.'과 'x'로 이루어져 있습니다.
1 ≤ k ≤ 10

입출력 예

picturekresult
[".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

예제 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

예제 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);

-> mdn-repaet


마치며

repeat 메서드를 알고 있지 않았다면 더 오래 문제를 풀어야하지 않았을까 싶다.

코테는 많이 풀어보면서 여러 메서드를 활용할 수 있다는 점이 좋다.
오랜만에 다시 코테를 풀려고 하니 머리가 굳어 있어서
다시 1일 1코테는 힘들더라고 조금씩 습관화 하려고 한다.

언젠간 3레벨 코테까지 푸는 날이 왔으면 좋겠다.

profile
[프론트 애송이] 작은 깨달음도 기록하기

0개의 댓글