자바스크립트는 런타임 스크립트 언어라 실행을 해야 오류를 발견할 수 있다.

요즘엔 크롬 개발자도구 (F12) 등 가볍고 좋은 기능이 많이 있어서 오류찾기가 수월하다.


일단 이 오류에 대해 알아보자.


SyntaxError 라는 뜻은 쉽게 말해 문법오류라는 뜻이다.

문법에 맞게 작성되지 않은 경우 나타나는 오류인데 이는 비교적 해결하기가 쉽다.

에러가 난 줄 수나 위치, 틀린 문법 등을 바로 알려주기 때문이다.


해당 파일 이름을 클릭하면 실제로 코드를 보여주며 빨간색 밑줄 쳐져있는 부분이 보일것이다.


실제로 가장 자주 나타나는 ) 나 '' 오류는 해당 줄에서 괄호, 따옴표를 열기 또는 닫기를 제대로 해주지 않아서이다.

따라서 해결방법은 간단하다.

오류가 난 코드의 행으로 이동하여 자신이 무엇을 잘 못 표기했는지(오타), 괄호나 따옴표 등이 열리고 닫힌것이 정확한지만 찾아내면 끝이다.


이런 오류를 방지하기 위해서는 들여쓰기(탭)을 사용하여 코드 가독성을 높이고

띄어쓰기를 해서 문자와 변수, 괄호 사이에 가독성을 높인다.


예를들어 필자는 이런식으로 사용한다.


$(document).on('click' , '.class_name' , function() {

블라블라....

});


띄어쓰기와 문법 사이에 공간을 두어 가독성을 높인다.



또한 폰트도 개발자의 코드 가독성에 영향을 주는데,

보통 기본적인 프로그래밍 폰트는 consolas이며 윈도우 내장 폰트이다.

간혹 폰트를 바꾸는 경우가있는데 필자의 경우는 기본 폰트(consolas)가 가장 가독성이 좋았다.

(소문자 l (엘)과 대문자 I(아이)와 숫자 1(일)이 햇갈려서는 안된다.)

물론 개발자마다 다른 취향이 있으니 이는 자신이 사용해보고 가장 최적화된 폰트를 사용하기 바란다.


그럼 이만





좌우로 스크롤되는 리스트가 있다.

리스트에는 각각의 아이템들이 있으며 스크롤 할때 멈춘위치에서 가까운 아이템에 딱 맞춰서 이동하는 코드가 필요해서 만들어봤다.

코드는 아래와 같고 설명은 밑에 적어두겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var scroll_left; // 좌우 스크롤 값
var item_width; // 아이템 width
var current_left; // 현재 스크롤
var current; // 현재위치
var isScrolling = false// 스크롤중인지 체크
 
// 리스트 좌우 스크롤 이벤트
$(".스크롤 element").scroll(function() {
    scroll_left = $(".스크롤 element").scrollLeft(); 
    item_width = $(".스크롤 안의 아이템").width() + 8
    current_left = scroll_left % item_width; 
    current = parseInt(scroll_left / item_width);
    isScrolling = true;
});
// 스크롤이 멈췄을 때
$.fn.scrollStopped = function(callback) {
    var that = this, $this = $(that);
    $this.scroll(function(ev) {
        clearTimeout($this.data('scrollTimeout'));
        $this.data('scrollTimeout'setTimeout(callback.bind(that), 100, ev));
    });
};
// 스크롤 엔드 이벤트
$(".스크롤 element").scrollStopped(function(ev){
    if(current_left > (item_width * 0.4)) { // 일정 범위 이상 넘어가면 
        $(".스크롤 elementt").animate({scrollLeft:(current+1)*item_width}, 500); // 부드럽게 이동 
        //$(".map_store_list").scrollLeft((current+1)*item_width); // 다음페이지
    }
    else { // 아니면 
        $(".스크롤 element").animate({scrollLeft:current*item_width}, 500);
        //$(".map_store_list").scrollLeft(current*item_width); // 현재페이지
    }
});
cs

 

8번줄) .스크롤 element라고 적힌곳에 스크롤이되는 div같은 element의 클래스나 id명을 적어준다.

window라면 그냥 $(window)로 수정하도록.

scroll(function() 은 리스트가 스크롤 될 때 발생하는 이벤트이다.

.스크롤 안의 아이템은 스크롤 내에 존재하는 아이템 element이다.

+8은 패딩값때문에 줬다.

current_left는 스크롤바가 길기 때문에 현재 스크롤 위치를 구하기 위해 item의 width만큼 나눈 나머지값이 된다.

current는 나머지값이 아니라 나눈값인데,

아이템이 넘어갈때마다 1씩 증가하는 셈이된다. (나중에 인덱스로 활용하기 위해 사용했다.)

 

16번줄) 스크롤이 멈췄을때 콜백함수인데 이건 구글링해서 찾은것이다. 그대로 복사하면 된다.

 

20번줄) 100이라는 값은 스크롤이 멈추고난 후 시간을 잰것이다 100이면 0.1초

 

24번줄) 이제 콜백함수를 호출하면 스크롤이 멈췄을때 발생하게 된다.

25번줄) 0.4라는 수치는 해당 아이템의 길이를 일정수치이상 넘어갔을때 작동하도록 만들었다.

이는 자신이 직접 실행해보고 맞춰서 바꾸면 된다.

 

26번줄) animate는 스크롤이 이동되는것을 애니메이션처럼 보여주기위함이다.

좌우 스크롤이 아닌 상하 스크롤이라면 scrollLeft를 scrollTop으로 바꿔주자.

current+1은 다음 아이템으로 넘어가는것이며 current는 현재 아이템으로 돌아가는 뜻이다.

500의 값은 변경되는 속도인데 이게 크면 클수록 느려진다. 0.5초만에 돌아간다는 뜻이다.

 

질문이나 오류사항은 댓글로 남겨주길.



문제의 조건은 3가지로 단순합니다. 

1. 금메달 수가 더 많은 나라  
2. 금메달 수가 같으면, 은메달 수가 더 많은 나라 
3. 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라  

얼핏보면 if문을 사용하여 조건을 걸어 풀 수 있지만  

'전체 메달 수의 총합은 1,000,000 이하이다.' 라는 입력 전제조건을  활용하여 
금,은,동 메달에 각각 점수를 부여하여 각각의 메달의 최대치(1,000,000)를 획득해도 
그보다 높은 메달 1개 보다 낮은 점수를 부여하여 풀 수있는 알고리즘입니다. 

다음은 score배열에 각각의 메달에 가중치를 부여하여 계산하여 저장하는 구문입니다. 

for (int i = 0; i < country_num; i++)  { 
     score[i][0] = arr[i][0]; // 1) 
     score[i][1] = (arr[i][1] * 1000000000000) + (arr[i][2] * 1000000)+ (arr[i][3] * 1); // 2) 


country_num은 입력받은 국가 개수입니다. 
score 배열은 국가 넘버, 국가 별 점수를 저장한 배열입니다. 
arr는 입력받은 배열입니다. 
1. 첫번째 열이 모두 국가 넘버이기 때문에 score배열 첫번째 행에 모두 저장합니다. 
2. arr배열의 두번째, 세번째, 네번째 열이 금,은,동메달 순이므로 각각에 가중치를 곱한 후 score배열에 저장합니다. 


두번째로 동일 점수에 대한 등수 계산법입니다. 
간단하게 구현 가능합니다. 

int count = 1; 
for (int i = 0; i < country_num; i++){ 
     if (score[i][0] == country){ 
          for (int j = 0; j < country_num; j++){ 
               if (score[i][1] < score[j][1]) count++; 
          
          break; 
     

cout << count; 

두번째로 들어온 입력 (등수를 알고싶은 국가K)을 country변수에 저장한 후 
반복문을 사용하여 배열의 인덱스를 알아냅니다(각 국가가 순서대로 입력되지 않기 때문에) 
인덱스를 알아낸 상태에서 다시 반복문을 사용하여 자신의 점수보다 큰 점수를 count하면 됩니다. 
break 사용 이유는 인덱스를 이미 찾은 상태이므로 더이상 반복문을 실행하지 않아도 되기 때문입니다. 

다음 실행 코드 전체입니다. 

 * score 배열의 자료형을 unsigned long long으로 한 이유는 가중치의 총 합이 10^19이 넘어가는 숫자이기 때문에 long long을 사용해도 범위(-9x10^19~9x10^19)안에 속하지만 가중치에 음수가 없기 때문에 편의상 unsigned long long으로 표현했습니다.

*전체 소스코드 

#include <iostream> 

using namespace std; 

int main() 

     int country_num = 0; 
     int country = 0; 
     int **arr = NULL; 
     unsigned long long **score = NULL; 

     cin >> country_num >> country; 

     arr = new int*[country_num]; 
     score = new unsigned long long*[country_num]; 

     for (int i = 0; i < country_num; i++) { 
          arr[i] = new int[4]; 
          score[i] = new unsigned long long[2]; 
     

     for (int i = 0; i < country_num; i++) 
          for (int j = 0; j < 4; j++) 
               cin >> arr[i][j]; 

     for (int i = 0; i < country_num; i++) { 
          score[i][0] = arr[i][0]; 
          score[i][1] = (arr[i][1] * 1000000000000) + (arr[i][2] * 1000000) + (arr[i][3] * 1); 
     

     int count = 1; 
     for (int i = 0; i < country_num; i++) { 
          if (score[i][0] == country) { 
               for (int j = 0; j < country_num; j++) { 
                    if (score[i][1] < score[j][1]) 
                         count++; 
                    
               break; 
          
     
     cout << count; 

     for (int i = 0; i < country_num; i++) 
          delete[] arr[i]; 
     delete[] arr; 

     return 0; 



질문사항은 댓글로 달아주세요!


'자료구조, 알고리즘' 카테고리의 다른 글

정렬 알고리즘 종류  (0) 2018.09.12
검색 알고리즘 종류  (2) 2018.09.11
자료구조 그래프(Graph)  (1) 2018.09.06
자료구조 힙(Heap)  (0) 2018.09.05
자료구조 이진 탐색 트리(Binary Search Tree)  (0) 2018.09.01
자료구조 트리(Tree)  (0) 2018.08.30
[자료구조] 큐 QUEUE  (0) 2018.08.19
[자료구조] 스택 STACK  (0) 2018.08.19

to Top