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

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

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

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


오늘은 자바스크립트에서 자주 사용하는 문자열 함수에 대해 알아보도록 한다.

우리는 자바스크립트를 사용하면서 문자열을 상당히 많이 다루게된다.

자주 사용되지만 할때마다 까먹는게 우리 현실이다.


매번 찾아다니기도 귀찮고 문자열 관련 함수들을 예제코드와 함께 정리해놓을테니

즐겨찾기를 추가하거나 링크를 따로 저장해서 필요할때마다 써먹도록 하자.

해당 토픽에 대한 추가적인 사항은 매번 업데이트 할 예정이다.


자바스크립트에서 문자열을 자르는 방법은 여러가지가 존재한다.

아래 함수들을 살펴보자.

설명보다 예제코드와 실행 결과를보면 어떻게 사용하는지 쉽게 알수있을것이다.


  • substring() 함수
var str1 = "열코의 프로그래밍 일기";
var str2 = str1.substring(0, 2) // str2의 값은 "열코"

자르고자하는 문자열은 "열코의 프로그래밍 일기"이며 str1 이라는 이름의 변수(var)에 저장되어있다.

여기서 나는 "열코"만 자르고싶다.

이때 사용하는 함수가 substring() 함수이다. (물론 아래 다른 함수들을 사용해도 자를순있다.)



2번째 줄을 보면 str1.substring(0, 2); 가 보인다.

자르고자하는 문자열 변수에서 substring() 함수를 호출하는것이다.

substring() 함수를 호출할때에는 기본적으로 2개의 매개변수를 넘겨줘야한다.

=> 시작인덱스, 종료인덱스

(인덱스가 뭐냐고 묻는다면 그냥 번호라고 생각해라.)

위의 예제코드에서는 0과 2를 콤마(,)를 사용하여 함수를 호출했다.


참고1) 대부분의 프로그래밍 언어에서 인덱스의 시작은 1이아닌 0부터 시작한다.

문자열 

코 

의 

(공백) 

프 

로 

그 

래 

밍 

(공백) 

일 

기 

인덱스 

10 

11 



종료 인덱스는 포함하지 않는다. 

따라서 인덱스 0부터 1까지만 자르게 되므로 "열코"만 잘리게 되는것이다.

"프로그래밍"을 자르고 싶다면 substring(4, 9)을 사용하면 될것이다.


그렇다면 매개변수를 1개만 주면 어떻게될까?

위의 str1변수를 아래와 같이 첫번째 매개변수만 줘보자.

str1.substring(0, ); 

str1.substring(5, ); 

위의 두 코드의 결과는 어떻게 될까? (실제로 저 코드가 출력이 되지는 않는다. 자른 문자열만 반환할 뿐)

첫번째 코드 반환 문자열 : "열코의 프로그래밍 일기"

두번째 코드 반환 문자열 : "로그래밍 일기"

두번째 매개변수를 주지않는 경우 자동으로 끝 인덱스까지 포함하여 자르는것을 알 수있다.



그렇다면 첫번째 매개변수를 생략하는 경우에는?

첫번째 매개변수를 생략하거나, 첫번째와 두번째 매개변수를 모두 생략하는 경우

다음과 같은 자바스크립트 문법 에러(Syntax Error)가 발생한다.

Uncaught SyntaxError : Unexpected token ,

에러가 뜨면 무섭다. 두번째 매개변수만 생략하는것이 가능하다.


참고2) 문자열 자체에서 "열코의 프로그래밍 일기".substring(0, 3); 이런식으로 자르는 방법도 존재한다.


  • substr() 함수

substr() 함수는 substring() 함수와 비슷한 역할을 한다.

(생긴것도 비슷하지 않은가?)

사용방법도 똑같다. 결과값만 다를뿐.

var str1 = "이번엔 다른 문자열로 좀 해보자";

var str2 = str1.substr(0, 6);


자 이번엔 substr() 함수가 어떤 기능을 하는지 알려줄테니 출력값을 유추해보자.

substr() 함수의 매개변수로 0과 6을 주었다.

첫번째 매개변수인 0은 위 substring() 함수와 동일하게 "시작인덱스"를 뜻한다.

두번째 매개변수인 6은 위 substring() 함수와 조금 다른 "자를 문자열 길이"를 뜻한다.

자 그렇다면 결과 값은 어떻게 될까??


여러분들은 나보다 똑똑하니 이해력이 좋을거라 생각된다.

(아니라면 위로 올라가서 다시한번 정독하자. 열코 블로그를 구독하고 모든 강좌글들을 정독해도 좋다.)


결과는 "이번엔 다른"이다.

시작인덱스가 0이므로 완전 처음부터 시작한다.

길이가 6이므로 6자리만큼만 자른다.(공백도 인덱스 셀때 포함시켜라)


또한 substring() 함수와 마찬가지로 두번째 인덱스를 생략하면 문자열 끝까지 포함해서 자르는것이고

첫번째 매개변수를 생략하거나 둘 다 생략했을 경우 문법 오류가 발생한다.


참고3) substring()이나 substr() 함수나 둘 중하나만 알고있어도 서로의 기능은 하나의 함수로

구현이 가능하다. 둘 다 사용해보고 자신한테 맞는 하나만 알고있으면 된다.


  • split() 함수

split() 함수는 매우 다양하게 사용되며 중요한 함수이니 꼭 기억하기 바란다.

var str1 = "열코의 프로그래밍 일기";

자 위와 같은 문자열이 있다고 한다. (문자열이 너무 식상하지만 그냥 봐주자.)

이런 경우가 생길 수도 있다.

"저 문자열을 공백을 기준으로 자르고 싶어"


본인은 프로그래밍하면서 그런 경우는 생기지 않았다고?

그렇게 생각한다면 split() 함수는 따로 보지않고 나가도 괜찮다.

(하지만 다시 들어온다고 장담하지.)


위의 문자열을 공백을 기준으로 자르는 방법은 아래와 같다.

var str2 = str1.split(" ");

자르고자하는 문자열(또는 변수)에서 매개변수로 자르는 기준이 되는 문자(또는 문자열)를 입력하여 호출.

위의 문자열은 아래와 같이 잘리게 된다.(잔인)

str2[0] = "열코의";

str2[1] = "프로그래밍";

str2[2] = "일기";

인덱스는 0부터 시작하여 자른 문자열 개수만큼의 배열이 생성된다.



실제로 split() 함수는 아주 다양한곳에서 유용하게 사용되는 함수이다.

지금 당장 사용되지 않아도 함수(또는 내 블로그)를 알고 있다면 문자열을 다룰 때

언젠가는 한번 사용하게 될 함수라고 단언할 수 있다.


혹시 위 강좌글을 보면서 더 궁금한 점이나 질문 또는 오타가 발생했다면 댓글로 남겨주기바란다.

참고로 비회원이 비밀댓글로 달고 나중에 확인못하는 경우가 대다수니 

다른 프린이(프로그래밍 어린이)들도 볼 수 있게 공개 댓글로 달아주는 센스를 발휘하자.

또한 강좌글 요청은 대환영이다. (제발 요청해줘)






2020년 정보처리기사 필기시험 과목이 변경된다.

구 분

현 행

변 경(2020년 적용)

비고

시험과목

필기시험

1. 데이터베이스

2. 전자계산기구조

3. 운영체제

4. 소프트웨어공학

5. 데이터통신

1. 소프트웨어 설계

2. 소프트웨어 개발

3. 데이터베이스 구축

4. 프로그래밍 언어 활용

5. 정보시스템 구축관리

국가직무능력표준(NCS)을 활용하여 현장직무중심으로 개편

실기시험

정보처리 실무

변경없음


기존 과목이었던 데이터베이스, 전자계산기구조, 운영체제, 소프트웨어공학, 데이터통신에서

변경될 과목은 소프트웨어설계, 소프트웨어개발, 데이터베이스구축, 프로그래밍언어활용, 

정보시스템 구축관리로 변경된다.


지난 2017년 정보처리기사 실기 유형이 변경된 후

이번엔 필기 유형이 변경된다.


전공자 입장에서 문제은행식의 기출문제를 몇회만 풀어봐도 간단히 합격할 수 있었던

난이도였는데 문제 유형이 바뀜에 따라 기출문제를 전혀 접하지 못하기 때문에

자격증 만료가 없는 정보처리기사 자격증은 올해 2019년에 꼭 따길 바란다.


본 블로그에도 2018년 필기시험 기출문제 풀이 및 해석이 존재하니 참고하기 바란다.


다음은 2019년 정보처리기사 시험 일정이다.

시험은 총 3회로 나누어져있다.


구분필기원서접수(인터넷)필기시험필기합격
(예정자)발표
실기원서접수실기시험최종합격자 발표일
2019년 정기 기사 1회2019.01.25 ~ 2019.01.312019.03.032019.03.142019.03.15 ~ 2019.03.212019.04.13~2019.04.272019.05.22
2019년 정기 기사 2회2019.03.29 ~ 2019.04.042019.04.272019.05.172019.05.20 ~ 2019.05.232019.06.29~2019.07.122019.08.16
2019년 정기 기사 3회2019.07.05 ~ 2019.07.112019.08.042019.08.302019.09.02 ~ 2019.09.052019.10.12~2019.10.252019.11.22



2회 접수시기가 곧 다가오므로 서둘러 준비하기바란다.

아직 부족하다고 생각되는 사람은 올해 하반기를 3회를 노려보자.



div 나 span의 길이가 유동적으로 변하는 반응형 웹에서 텍스트의 길이가 element를 넘어가서 줄이 바뀌는 경우가 있다.

이럴때 css를 사용하여 텍스트를 자동으로 자르고 넘어간 텍스트를 ...으로 처리하는 방법에 대해 알아보자.


구글링을 하면 많은 자료들이 등장한다.

대부분 고정된 element에서 text를 처리하는 방법이다.

하지만 내가 원하는것은 element의 width가 %로 설정되어있어 브라우저 창을 변경했을때

width의 길이도 변하는것이다.


검색한 방법은 width가 px값으로 고정되어있는 상태에서 처리하는 방법이었다.

해당 방법이 필요한 사람들도 있으니 먼저 소개하겠다.


1. 고정된 width의 element에서 css로 text 처리방법

해당 text를 감싸고있는 element에 css를 다음과 같이 추가한다.

width : 100px; (px을 고정 값으로 설정한다. 이는 자신이 원하는 만큼 설정하면 될것이다.)

white-space : nowrap; (text의 길이가 길어지면 자동으로 줄이 바뀌는데 이를 한줄로 설정한다.)

overflow : hidden; (width가 고정되어있는 상태에서 text가 길어지면 해당 element를 넘어서는데 이를 표시하지 않는다.)

text-overflow : ellipsis; (넘어간 text대신 ...으로 text를 대체한다.)

* 만약 줄이 여러개인 경우에 처리하는 방법은 구글링에 검색하기 바란다.

* 그래도 모르겠다면 댓글로 질문을해라. 답변해주겠다.



2. 유동적인 width (%값)의 element에서 css로 text 처리방법

유동적인 width인 element에서 위의 방법을 설정하려고하니 width가 %로 설정되어있어 해당 방법이 통하지 않는다.

이럴때는 height를 고정값으로 설정하여 위 방법을 적용시킬 수 있다.

위와 같이 1줄의 경우만 설명한다.

css를 다음과 같이 추가해보자.

overflow : hidden;

text-overflow : ellipsis; (width를 설정하지 않고 여기까진 위와 동일하다.)

height : 20px; (대신 height를 설정해준다. 텍스트 크기에 맞춰 height가 1줄인 경우를 생각하자.)

word-wrap : brek-word; 

display : -webkit-box;

-webkit-line-clamp : 1; (줄 개수를 설정한다. 만약 2줄이상이라면 height와 해당 값을 수정한다.)

-webkit-box-orient: vertical; 

위와 같이 설정했다면 유동적인 width의 element에서도 text가 넘어설때 자동으로 ...처리가 되는것을 확인할 수 있다.


오타나 질문 사항은 댓글로 남겨주기 바란다.

그럼 수고링


to Top