프론트엔드 개발자가 될거야./코딩테스트

[TIL] Today I Learned : 코드카타 Day1 & 프로그래머스 직사각형 별찍기

정니정은니 2022. 7. 4. 23:25

오늘은 코드카타를 한 첫날이다.

코딩테스트를 준비해야지 하고 있었는데 제대로 사기를 돋아준 것 같다....

문제는 어찌어찌 풀었는데 푼 것 같지 않은 이 느낌.....

코딩테스트 문제를 많이 풀어봐야겠다고 뼈저리게 느끼고

프로그래머스에서 문제 하나를 또 풀었다.


코드카타 Day1

<문제>

twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.

nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열

예를 들어,

nums은 [4, 9, 11, 14] target은 13

nums[0] + nums[1] = 4 + 9 = 13 이죠?

그러면 [0, 1]이 return 되어야 합니다.

# 가정
target으로 보내는 합계의 조합은 배열 전체 중에 2개밖에 없다고 가정하겠습니다.

<나의 방법>

const twoSum = (nums, target) => {
  for(let i = 0; i < nums.length; i++) { 
      for(let j = 0; j < nums.length; j++) {
        if (i < j && (target === nums[i] + nums[j])) {
         return [i, j]
        }                
       } 
     }     
  } 
  
  console.log(twoSum([4, 9, 11, 14], 13))

이중 반복문을 사용했다.

그리고 i와 j가 겹치지 않게 하기 위해  i < j 조건을 넣어주었다.

i < j 이고 target === nums[i] + nums[j] 이면 원하는 값을 얻을 수 있다.

 

<다른 방법>

const twoSum = (nums, target) => {
  let answer = [];
  for(let i =0; i < nums.length; i++) {
    for(let j = 0; j < nums.length; j++) {
      if(nums[i]!== nums[j]) {
        if(nums[i] + nums[j] === target) {
          answer.push(i)
      }
     }
    }
  }
  return answer 
}

console.log(twoSum([4, 9, 11, 14], 13))

비슷하지만 i와 j가 겹치지 않게 하기 위한 조건으로

nums[i]!== nums[j] 를 주었다.

그리고 또 if문을 사용했고

answer에 i를 넣어줬다.

 

지금 생각해보니

i와 j가 겹치지 않게 하기 위한 조건은

1. i < j
2. nums[i] !== nums[j]
3. i !== j

이렇게 세 가지나 있다... wow..


프로그래머스 직사각형 별찍기

<방법 1>

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" "); // n = [5, 3]
    const a = Number(n[0]), b = Number(n[1]); // a = 5, b = 3
    let out = "";
    for(let i = 0; i < b; i++){
        for(let j = 0; j < a; j++){
            out = out + "*";
        } 
        out = out + "\n";     
    } 
    console.log(out);   
});

a를 5번 반복하여 *****넣어준 후 \n로 줄 바꿈 해주고

이것을 b개수만큼 반복해주면 된다.

 

<방법 2>

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" "); // n = [5, 3]
    const a = Number(n[0]), b = Number(n[1]); // a = 5, b = 3
    const row = '*'.repeat(a)// row = *****
    for(let i =0; i < b; i++){
        console.log(row)
    }
});

repeat메서드를 쓰면 *를 원하는 만큼 반복할 수 있다.

 

<방법 3>

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" "); // n = [5,3]
    const a = Number(n[0]), b = Number(n[1]); // a = 5, b = 3
    const star = `${'*'.repeat(a)}\n`; // star = *****\n
    console.log(star.repeat(b));

});

a처럼 b도 repeat 해줄 수도 있다. 단 ${'*'.repeat(a)} 에 \n 해주어야 한다. 

안 그러면 ***************이렇게 붙어서 나온다.