ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바스크리트 문법 10 - 2차원 배열과 배열의 확장 해답
    프론트엔드/Javascript 연습과제 해답 2022. 1. 14. 15:12
    728x90

     

    * 연습과제 1

    const _2dArray = []
    
    for(let i=0; i<5; i++){
        _2dArray[i] = [2*i+1, 2*i+2]
    }
    
    console.log(_2dArray)

     

    * 연습과제 2

    function build2DArray(rows, columns){
        const _2dArray = new Array(rows).fill(0)
        for(let i=0 ; i<_2dArray.length; i++){
            _2dArray[i] = new Array(columns).fill(0)
        } 
        return _2dArray
    }
    
    console.log(build2DArray(7, 3))

     

    * 연습과제 3

    해답1

    const fruits = [['apple', 570], ['orange', 270], ['strawberry', 30]]
    
    for(let i in fruits){
        fruits[i] = {name: fruits[i][0], price: fruits[i][1]}
    }
    
    console.log(fruits)

    해답2

    const fruits = [['apple', 570], ['orange', 270], ['strawberry', 30]]
    
    for(let i in fruits){
        const fruit = {}
        for(let j in fruits[i]){
            switch(j){
                case '0':
                    fruit['name'] = fruits[i][j]
                    break;
                case '1':
                    fruit['price'] = fruits[i][j]
                    break;
            }
        }
        fruits[i] = fruit
    }
    
    console.log(fruits)

     

    * 연습과제 4

    const fruits = [['apple', 570, 32], ['orange', 270, 65], ['strawberry', 30, 120]]
    
    for(let fruit of fruits){
        fruit.splice(1, 2, fruit[1] * fruit[2])
    }
    
    for(let i in fruits){
        fruits[i] = {name: fruits[i][0], totalPrice: fruits[i][1]}
    }
    
    console.log(fruits)

     

    * 연습과제 5

    해답 0 

    const graph = document.getElementById('graph')
    
    let points = [] // 포인트 배열
    let x = 0 // degree
    let offset = 0 // 추출 시작점
    
    function degreeToRad(x){
        return x * (Math.PI / 180)
    }
    function calSinVal(x){
        return Math.sin(x)
    }
    function clearWindow(el){
        el.innerHTML = ''
    }
    function getPoint(x){
        return [x, calSinVal(degreeToRad(x))]
    }
    function isArrayFull(len){
        return len > 360
    }
    
    function displayPoint(point){
        const [x, y] = point
        const xScale = 2, yScale = 100, yShift = 100
    
        const pointEl = document.createElement('div')
        pointEl.className = 'dot'
        pointEl.style.left = `${(x - offset) * xScale}px` // x-scale: 2배 (offset 만큼 좌표이동)
        pointEl.style.top = `${(y* yScale) * -1 + yShift}px` // y-scale : 100배 (반전 + 좌표이동)
        graph.appendChild(pointEl)
    }
    
    function redraw(){
        clearWindow(graph)
        
        points.push(getPoint(x)) // 포인트 추가
        x++ // x 좌표 변경
    
        if(isArrayFull(points.length)){
            points.shift() // 첫번째 요소를 제거함으로써 360개 유지
            offset++ //  offset 증가
        }
        points.forEach(displayPoint) // 화면에 그래프 그리기
      
    }
    
    setInterval(redraw, 5)

    해답1

    const graph = document.getElementById('graph')
    
    const points = []
    const dx = 1 // degree
    let x = 0 // degree
    let y = 0
    let radx = 0 // radian
    let offset = 0 // 추출 시작점
    let points360 = [] // 360개만 추출하기
    const range = 360 // 추출 갯수
    
    // 다음 (X,Y) 포인트 값 계산
    function getNextPoint(){
        radx = x * (Math.PI / 180)
        y = Math.sin(radx)
        points.push([x, y])
        x += dx
    }
    
    
    // (X,Y) 포인트 값으로부터 DOM 객체 생성 및 화면에 표시
    function displayPoint(point){
        const pointEl = document.createElement('div')
        pointEl.className = 'dot'
        pointEl.style.left = `${(point[0] - offset) * 2}px` // x-scale: 2배 (offset 만큼 좌표이동)
        pointEl.style.top = `${point[1]* 100 * -1 + 100}px` // y-scale : 100배 (반전 + 좌표이동)
        graph.appendChild(pointEl)
    }
    
    function redraw(){
        graph.innerHTML = '' // 화면 초기화
        getNextPoint()
    
        if(points.length <= 360){
            points.forEach(displayPoint)
        }else{
            points360 = points.slice(offset, offset + range) // 360개만 추출하기
            points360.forEach(displayPoint)
            offset++
        }
    }
    
    // (X,Y) 포인트 값을 요소로 가지는 2차원 배열 생성
    const timerID = setInterval(redraw, 5)

    해답2

    const graph = document.getElementById('graph')
    
    let points = []
    const dx = 1 // degree
    let x = 0 // degree
    let y = 0
    let radx = 0 // radian
    let offset = 0 // 추출 시작점
    let points360 = [] // 360개만 추출하기
    const range = 360 // 추출 갯수
    
    // 다음 (X,Y) 포인트 값 계산
    function getNextPoint(){
        radx = x * (Math.PI / 180)
        y = Math.sin(radx)
        points.push([x, y])
        x += dx
    }
    
    
    // (X,Y) 포인트 값으로부터 DOM 객체 생성 및 화면에 표시
    function displayPoint(point){
        const pointEl = document.createElement('div')
        pointEl.className = 'dot'
        pointEl.style.left = `${(point[0] - offset) * 2}px` // x-scale: 2배 (offset 만큼 좌표이동)
        pointEl.style.top = `${point[1]* 100 * -1 + 100}px` // y-scale : 100배 (반전 + 좌표이동)
        graph.appendChild(pointEl)
    }
    
    function redraw(){
        graph.innerHTML = '' // 화면 초기화
        getNextPoint()
    
        if(points.length > 360){
            points.shift() // 360개를 초과한 경우 첫번째 요소를 제거함으로써 360개 유지
            offset++
        }
        points.forEach(displayPoint)
        // console.log(points)
    }
    
    // (X,Y) 포인트 값을 요소로 가지는 2차원 배열 생성
    const timerID = setInterval(redraw, 5)

     

    * 연습과제 6

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>자바스크립트 연습</title>
        <link rel='stylesheet' href='style.css'/>
    </head>
    <body>
        <div id='sign'></div>
        <script src="app.js"></script>
    </body>
    </html>
    body{
        margin: 0;
        padding: 0;
        background: black;
    }
    #sign{
        width: 100px;
        height: 100px;
        margin: 100px auto;
        background: black;
    
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
        align-items: center;
    }
    .cell{
        width: 10px; 
        height: 10px;
        background: blue;
    }
    .bright{
        background: red;
    }
    const signDiv = document.getElementById('sign')
    
    const sign1 = [
        [0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
        [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
        [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
        [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
        [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
        [0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
        [0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
        [0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
        [0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    ]
    const sign2 = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1, 1, 1, 1, 1, 0, 0, 1, 0],
        [0, 0, 0, 0, 1, 0, 0, 0, 1, 0],
        [0, 0, 0, 1, 0, 0, 0, 0, 1, 0],
        [0, 0, 1, 0, 1, 0, 0, 0, 1, 0],
        [0, 1, 0, 0, 0, 1, 0, 0, 1, 0],
        [0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
        [0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
        [0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
        [0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
    ]
    const sign3 = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
        [0, 0, 1, 1, 1, 0, 0, 0, 1, 0],
        [0, 1, 0, 0, 0, 1, 0, 0, 1, 0],
        [0, 1, 0, 0, 0, 1, 1, 1, 1, 0],
        [0, 1, 0, 0, 0, 1, 1, 1, 1, 0],
        [0, 1, 0, 0, 0, 1, 0, 0, 1, 0],
        [0, 0, 1, 1, 1, 1, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    ]
    const sign4 = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 1, 0, 1, 0],
        [0, 1, 1, 1, 0, 0, 1, 0, 1, 0],
        [0, 0, 0, 1, 1, 1, 1, 0, 1, 0],
        [0, 0, 0, 1, 1, 1, 1, 0, 1, 0],
        [0, 0, 0, 1, 0, 0, 1, 0, 1, 0],
        [0, 1, 1, 0, 0, 0, 1, 0, 1, 0],
        [0, 0, 0, 0, 0, 0, 1, 0, 1, 0],
        [0, 0, 0, 0, 0, 0, 1, 0, 1, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    ]
    const sign5 = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 1, 1, 1, 0, 0, 1, 1, 0],
        [0, 1, 0, 0, 0, 1, 0, 1, 1, 0],
        [0, 1, 0, 0, 0, 1, 0, 1, 1, 0],
        [0, 1, 0, 0, 0, 1, 0, 1, 1, 0],
        [0, 0, 1, 1, 1, 0, 0, 1, 1, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 1, 1, 1, 1, 1, 1, 0],
        [0, 0, 0, 1, 0, 0, 0, 0, 1, 0],
        [0, 0, 0, 1, 1, 1, 1, 1, 1, 0],
    ]
    
    const signs = [sign1, sign2, sign3, sign4, sign5]
    let index = 0
    
    
    function displayCell(value){
        const cellEl = document.createElement('div')
        cellEl.className = value === 0 ? 'cell' : 'cell bright'
        signDiv.appendChild(cellEl)
    }
    
    function displaySign(sign){
        const rows = sign.length
        const columns = sign[0].length
    
        for(let i=0; i<rows; i++){
            for(let j=0; j<columns; j++){
                displayCell(sign[i][j])
            }
        }
    }
    
    function redraw(){
        const sign = signs[index % signs.length]
        signDiv.innerHTML = '' // 화면 초기화
        displaySign(sign)
        index++
    }
    
    setInterval(redraw, 1000)
    728x90
Designed by Tistory.