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할 필요도 없다고 한다 ^ ^
메서드 사용하는거에 너무 집착하게 되었는지;; 요상하게 문제를 풀이했다는 생각이 든다..
불필요한 메서드 체이닝을 줄이고 코드에 의도가 분명히 드러나도록 가독성이 좋은 코드를 작성하자
'개발 공부 일지 > JavaScript' 카테고리의 다른 글
[프로그래머스] 2차원 배열 (0) | 2025.03.12 |
---|---|
[프로그래머스] 특별한 이차원 배열 1 (0) | 2025.03.10 |
[프로그래머스] 기초 - 전국 대회 선발 고사 (0) | 2025.03.07 |
[프로그래머스] 기초 - 배열의 길이를 2의 거듭제곱으로 만들기 (0) | 2025.03.05 |
[코어 자바스크립] 실행 컨텍스트 / 호이스팅 (1) | 2025.02.19 |