본문 바로가기
개발 공부 일지/JavaScript

[프로그래머스] 그림 확대

by yelimu 2025. 3. 10.

https://school.programmers.co.kr/learn/courses/30/lessons/181836

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제 설명

직사각형 형태의 그림 파일이 있고, 이 그림 파일은 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"]

주어진 picturn 배열 각 요소의 문자열 길이도 k배, 개수도 k배 하여 리턴하는 함수


[나의 풀이]

function solution(picture, k) {
    let answer = []
    picture.map(v => [...v].map(inner=> inner.repeat(k)).join(""))
                    .map(v => v+"/").map(v=> v.repeat(k)).map(v=> v.split("/")).map(v=> v.map(inner => answer.push(inner)))
    return answer.filter(v=> v !== "")
}

 

한땀 한땀 기워서 제출한 나의 코드 ^^ 

메서드 너무 많이 썼고.. 가독성 구리고,, 더럽다..


[다른 사람이 제출한 코드]

function solution(picture, k) {
    var answer = [];

    picture.forEach((line) => {
        const expanded = [...line].reduce((acc, cur) => acc + cur.repeat(k), '');

        for(let i=0; i<k; i++) answer.push(expanded);
    });

    return answer;
}

picture 배열 내부의 요소를 line이라 하고, 순회하면서 

line을 배열로 펼쳐서, reduce 내부에서 각 요소를 k 번 반복한 문자열 expanded를 빈배열 answer에 push

 

요렇게 깔끔하게 풀 수 있당 ^- ^ 


function solution(picture, k) {
    let result = [];

    picture.map((v) => {
        const cur = [...v].map((c) => c.repeat(k)).join('');
        for(let i = 0; i < k; i++) result.push(cur);
    });

    return result;
}

또는 이렇게 

reduce 대신 map을 사용해서 풀이하는 것도 비슷한 방법.. 


[지피티 코드]

function solution(picture, k) {
    return picture.flatMap(row => {
        let expandedRow = [...row].map(char => char.repeat(k)).join(""); // 각 문자 확대
        return Array(k).fill(expandedRow); // k배 확장된 행을 k번 반복
    });
}

 

flatMap 을 사용하면 평탄화한 결과를 반환하여 쓸데없이 "/" 를 더했다가 split했다가 빈배열"" 을 filter할 필요도 없다고 한다 ^ ^


메서드 사용하는거에 너무 집착하게 되었는지;; 요상하게 문제를 풀이했다는 생각이 든다.. 

불필요한 메서드 체이닝을 줄이고 코드에 의도가 분명히 드러나도록 가독성이 좋은 코드를 작성하자