직사각형 별찍기

Sheryl Yun·2023년 8월 20일
0

저번에 인풋 형태를 보다가 헉 해서 미뤄둔 후 다시 보게 된 문제이다.

제공되는 인풋 형태

이 문제는 언어를 자바스크립트로 선택해도 function solution~대신 아래와 같은 특이한 형태로 인풋이 제공된다.

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    console.log(a);
    console.log(b);
});

당황하지 말고 하나씩 살펴보자.

  • utf8 라인은 인코딩 형태를 제시하는 역할인 것 같다.

  • process.stdin.on('data',)는 data를 받아서 뭔가를 처리하겠다는 뜻이다.

  • 문제를 보면 처음에 인풋 n, m이 띄어쓰기를 하나 두고 '5 3' 이라는 문자열 형태로 들어오기 때문에 split으로 나눠서 ['5', '3']이라는 문자열 배열 형태로 만들어준다.

  • 이후 const n 배열의(위의 인풋 n과 다르다 이것 때문에 헷갈림) 배열의 0번째(m)와 1번째(n)를 각각 숫자 타입으로 변경(Number)해준다.

    • const a~ 줄은 const 하나에 a, b 두 개의 변수를 선언하는 것이다.개인적으로는 가독성을 위해 각각 별개의 변수 키워드로 선언하는 것을 선호한다.
  • 마지막으로 console.log를 통해 a와 b를 각각 찍어 확인했다.

    주의할 점
    process.~ 형태의 문제는 function solution~과 달리 반환 값을 return answer 문이 아닌 console.log로 인식한다. 따라서 문제를 다 푼 후 실제 답을 도출할 때 중간에 값을 확인하는 용도였던 console.log들은 모두 지워줘야 실제 답이 제대로 도출된다.

처음 풀이

process~ 인풋 형태를 이해하기 위해 찾은 블로그의 코드를 참고해서 풀었다.

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]); 
    const b = Number(n[1]); // const를 두 줄로 나눠주고
    
    for (let i = 0; i < b; i++) { // b for문을 먼저 돌리면서
        let answer = ''; // 한 줄씩 출력할 문자열 선언
        
        for (let j = 0; j < a; j++) { // a for문을 돌리면서
            answer += '*'; // 가로로 한 줄씩 별 찍어주기
        }
        
        console.log(answer); // 마지막으로 b for문이 끝나기 전에 a for문을 통해 만들어진 answer 문자열을 하나씩 출력
    }
});

b for문이 끝나기 전에 console로 answer를 출력해주면 다음 b for문이 돌 때 let answer = ''; 문으로 answer가 초기화되어 '\n' 없이도 자동 줄바꿈이 된다.

새로운 풀이

for문을 좀 더 줄이는 방법이 없을까 해서 찾아보니 repeat 메서드를 이용하는 방법이 있었다.

자주 쓰는 메서드가 아니어서 그런지 간단한 형태인데도 매번 까먹는다

String.repeat(count)
count 갯수만큼 앞에 있는 String을 반복한다.

repeat을 사용해서 다시 풀어보았다. (처음 풀이의 코드는 사실 제출 시 1점 뜸..)

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]);
    const b = Number(n[1]);

    const row = '*'.repeat(a);
    
    for (let i = 0; i < b; i++) console.log(row);
});

이중 for문이 사라져서 시간복잡도가 O(N2)(제곱)에서 O(N)으로 줄었고 코드도 훨씬 간결해졌다.

더 개선하기 위해 맨 마지막의 b for문도 repeat으로 처리해보려 했지만, 줄바꿈을 위한 '\n'를 추가하기가 애매해졌다.

그런데 이 문제를 해결한 코드도 있었다.

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]);
    const b = Number(n[1]);

    const row = `${'*'.repeat(a)}\n`;
    
    console.log(row.repeat(b));
});

a를 만들 때 '\n'를 미리 추가해주는 방식

템플릿 리터럴로 전체를 감싼 상태에서 '*'.repeat(a)을 변수로 삽입(${ })하고 끝에 '\n'을 붙여줘서 a만큼 별이 찍힌 후에 '\n'을 통해 자동 줄바꿈이 되게 했다.

이렇게 하니 맨 마지막 줄 for문을 repeat 메서드로 교체할 수 있었다 😙

repeat 메서드와 새로운 인풋 제공 코드를 알 수 있었던 문제였다.

profile
영어강사, 프론트엔드 개발자를 거쳐 데이터 분석가를 준비하고 있습니다 ─ 데이터분석 블로그: https://cherylog.tistory.com/

0개의 댓글