문제 설명
직사각형 형태의 그림 파일이 있고, 이 그림 파일은 1 × 1 크기의 정사각형 크기의 픽셀로 이루어져 있습니다. 이 그림 파일을 나타낸 문자열 배열 picture과 정수 k가 매개변수로 주어질 때, 이 그림 파일을 가로 세로로 k배 늘린 그림 파일을 나타내도록 문자열 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
1 ≤ picture의 길이 ≤ 20 1 ≤ picture의 원소의 길이 ≤ 20 모든 picture의 원소의 길이는 같습니다. picture의 원소는 '.'과 'x'로 이루어져 있습니다. 1 ≤ k ≤ 10
나의 코드
class Solution {
public String[] solution(String[] picture, int k) {
int row = picture.length;
int col = picture[0].length();
int newRow = row * k;
int newCol = col * k;
String[] answer = new String[newRow];
for(int i=0; i<newRow; i++) {
StringBuilder sb = new StringBuilder();
for(int j=0; j<newCol; j++) {
sb.append(picture[i/k].charAt(j/k));
}
answer[i] = sb.toString();
}
return answer;
}
}
다른 사람 코드
class Solution {
public String[] solution(String[] picture, int k) {
String[] answer = new String[picture.length * k];
int idx = 0;
for(int i=0; i<picture.length; i++) {
for(int j=0; j<k; j++) {
StringBuilder sb = new StringBuilder();
for(int l=0; l<picture[i].length(); l++) {
sb.append(String.valueOf(picture[i].charAt(l)).repeat(k));
}
answer[idx++] = sb.toString();
}
}
return answer;
}
}
느낀 점
행을 반복하는 건 반복문을 통해 해결할 수 있는데 열을 반복하는 로직이 생각보다 어려웠다. 나의 코드 중 핵심은 sb.append(picture[i/k].charAt(j/k));
를 이해하는 것이다.
picture[i/k]
는 주어진 k 중 몇 번째 행인지를 나타내고,
이 것의 charAt(j/k)
는 해당 행의 주어진 k 중 몇 번째 열인지 나타낸다.
그리고 문자열이 빈번하게 추가되므로 성능상 유리한 StringBuilder
를 사용해주었다.
다른 사람 코드를 보면 결과 인덱스를 따로 지정하고 열과 행 반복문을 valueOf()
, repeat()
함수 등을 사용하여 직접 돌려 결과를 도출하는 방법도 존재했다.