Study/JS Algorithm Rocket

[JS] 1, 2차원 배열 탐색 (가위바위보, 등수, 격자판, 봉우리)

이안92 2021. 5. 24. 14:06
반응형

큰 수 출력
<script>
  function solution(arr){         
    let answer=[];
    answer.push(arr[0]);
    for(let i=1; i<arr.length; i++){
      if(arr[i]>arr[i-1]) answer.push(arr[i]);
    }
    return answer;
  }
  let arr=[7, 3, 9, 5, 6, 12];
  console.log(solution(arr));
</script>

 

보이는 학생
<script>
  function solution(arr){
    // 맨 앞자리 학생은 보이므로 1부터 시작
    let answer=1, max=arr[0];
    for(let i=1; i<arr.length; i++){
      if(arr[i]>max){
        answer++;
        max=arr[i];
      }
    }
    return answer;
  }
  let arr=[130, 135, 148, 140, 145, 150, 150, 153];
  console.log(solution(arr));
</script>

 

가위바위보
<script>
  function solution(a, b){         
    // A가 이기면 A, B가 이기면 B, 비기면 D
    // 1:가위, 2:바위, 3:보
    let answer="";
    for(let i=0; i<a.length; i++){
      if(a[i]===b[i]) answer+='D'+' ';
      else if(a[i]===1 && b[i]===3) answer+='A'+' ';
      else if(a[i]===2 && b[i]===1) answer+='A'+' ';
      else if(a[i]===3 && b[i]===2) answer+='A'+' ';
      else answer+='B'+' ';
    }
    return answer;
  }
  let a=[2, 3, 3, 1, 3];
  let b=[1, 1, 2, 2, 3];
  console.log(solution(a, b));
</script>

 

점수 계산
<script>
  function solution(arr){         
    let answer=0, count=0;
    for(let x of arr){
      if(x===1){
        count++;
        answer+=count;
      }
      else count=0;
    }
    return answer;
  }

  let arr=[1, 0, 1, 1, 1, 0, 0, 1, 1, 0];
  // 1+1+2+3+1+2 = 10
  console.log(solution(arr));
</script>

 

등수구하기

 

Array.from() 메서드는 유사배열객체(array-like object)나 반복가능한객체(iterable object)를 복사해 새로운 Array객체를 만든다.

<script>
  function solution(arr){  
    let n=arr.length;
    let answer=Array.from({length:n}, ()=>1); // 배열의길이, 1로 초기화
    for(let i=0; i<n; i++){
      for(j=0; j<n; j++){
        if(arr[j]>arr[i]) answer[i]++;
      }
    }
    return answer;
  }

  let arr=[87, 89, 92, 100, 76];
  console.log(solution(arr));
</script>

 

격자판 최대합
<script>
  function solution(arr){  
    let answer=Number.MIN_SAFE_INTEGER;
    let n=arr.length; // 5
    let sum1=sum2=0; // sum1은 행, sum2는 열
    for(let i=0; i<n; i++){
      sum1=sum2=0;
      for(let j=0; j<n; j++){
        sum1+=arr[i][j]; // 앞이 고정되고 뒤가 돈다 [0][1] [0][2]..
        sum2+=arr[j][i];
      }
      answer=Math.max(answer, sum1, sum2);
    }
    sum1=sum2=0;
    for(let i=0; i<n; i++){
      sum1+=arr[i][i]; // 대각선
      sum2+=arr[i][n-i-1]; // 0 5-0-1, 0 5-0-2
    }
    answer=Math.max(answer, sum1, sum2);
    return answer;
  }

  let arr=[[10, 13, 10, 12, 15], 
           [12, 39, 30, 23, 11],
           [11, 25, 50, 53, 15],
           [19, 27, 29, 37, 27],
           [19, 13, 30, 13, 19]];
  console.log(solution(arr));
</script>

 

봉우리
<script>
  function solution(arr){  
    let answer=0;
    let n=arr.length; // 5
    // 12시, 3시, 6시, 9시 네방향 2중 for문 돌면서 순서대로 확인
    let dx=[-1, 0, 1, 0]; // 행
    let dy=[0, 1, 0, -1]; // 열
    for(let i=0; i<n; i++){
      for(let j=0; j<n; j++){
        let flag=1;
        for(let k=0; k<4; k++){ // 네방향
          let nx=i+dx[k]; // 가려고 하는 행좌표 방향
          let ny=j+dy[k]; // 가려고 하는 열좌표 방향
          // arr[nx][ny] 상하 좌우 보는 좌표. 크거나 같으면 arr[i][j]는 봉우리가 아니다
          // nx, ny가 0보다 크고 n보다는 작아야 범위안에 들어와 있는 것.
          if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny]>=arr[i][j]){ 
            flag=0; // 봉우리가 아닐 때
            break;
          }
        }
        if(flag) answer++; //0이면 거짓, 1이면 참;
      }
    }
    return answer;
  }

  // 격자의 바깥부분은 0
  let arr=[[5, 3, 7, 2, 3], 
         [3, 7, 1, 6, 1],
         [7, 2, 5, 3, 4],
         [4, 3, 6, 4, 1],
         [8, 7, 3, 5, 2]];
  console.log(solution(arr));
</script>
반응형