문제의 조건은 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가 넘어설때 자동으로 ...처리가 되는것을 확인할 수 있다.


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

그럼 수고링



우리는 자바스크립트 코드를 볼 때 $ 기호가 있는것을 자주볼수있다.

다른 코드는 대충 이해하겠는데 대체 $ 기호는 무엇이며 왜 사용하는것일까?


결론부터 말하자면 $기호는 자바스크립트 라이브러리인 JQuery(제이쿼리)의 '선택자'이다.

잉? 라이브러리는 무엇이고, JQuery는 무엇이며, 선택자는 또 무엇이냐?

지금부터 설명들어간다. 머릿속에 때려박자. (외울필요는 없다. 이해만 하자.)


라이브러리는 프로그래밍 언어에서 사용자가 자주 사용하는 (또는 필요로하는)

함수의 집단이라고 생각하면 된다.


쉽게말해, 내가 웹으로 계산기를 만들고 싶은데 해야할일을 대충 나열해보자.

HTML과 CSS를 사용하여 화면 레이아웃을 구성하고 각종 컴포넌트(버튼과 같은)의 

위치와 크기를 지정한 후 자바스크립트 함수를 통해 각각의 컴포넌트들이 사용자로부터 

눌러졌을 때 값을 받아오거나 출력한다.


이를 실제로 코딩한다고 가정하면 프로그래머에 따라 짧게는 몇시간,

길게는 며칠이 걸릴지도 모른다.

그중 가장 시간이 오래걸리는 부분이 당연 UI(UX)부분이다.

UI는 User Interface의 약자로 사용자가 보이는 화면을 말하는것이다.

UX는 User Experience의 약자로 사용자의 경험을 위주로 개발하는것이다.

비슷하긴하지만 엄밀히 따지면 조금 다르다.



아무튼, 화면구성에서 시간이 많이 차지하는것을 빠르고 편리하게 만들어주는것이 바로 

라이브러리이다. (물론 내부 로직, 프로그래밍에서도 마찬가지다.)


(적게쓰고 많이한다... 라고 적혀있다. 같은 기능인데 코드가 짧아진다는 뜻인가보다..)


JQuery는 자바스크립트의 대표적인 라이브러리이며 가장 많이 사용되는 라이브러리이기도 하다.

JQuery Mobile도 존재하는데, 이는 

JQuery를 기반으로한 모바일 환경에서 사용하기 최적화된 라이브러리이다.


JQuery를 사용하는방법은 아주 간단하다.

홈페이지에 접속하여 직접 다운받아서 프로그램에 삽입하는 경우가 있으며

다운받지않고 코드내에서 링크를 걸어 사용하는 방법이 있다.


둘의 차이점은 프로그램에 직접 삽입하는 경우 인터넷이 연결되어있지 않아도 작동하는것이고,

링크로 걸려있는 경우에는 인터넷이 연결되어있어야 작동된다는 점이다.


사실 웹 프로그래밍은 인터넷에 연결해서 사용되는 경우가 많으므로

귀찮을때나 규모가 작거나 테스트할때는 링크로 연결해서 사용한다.


아무튼 지금까지 라이브러리랑 JQuery에 대한 설명을 마쳤다.

그렇다면 '선택자'는 무엇일까?


JQuery(또는 JQuery Mobile)에서 선택자는 $기호를 사용하며, 

DOM의 객체들을 편리하게 호출하는 기능을 한다.

예 1) $('*').css("Color", "red");

예 2) $('.myh1).css("블라블라...") - id로 선택하기(. : 점 사용)

예 3) $('#myul).블라블라... - class(클래스)로 선택하기(# : 샾 사용)


JQuery 선택자 목록과 자세한 설명은 다음 포스팅에서 소개하겠다.

질문사항이나 잘못된 점은 댓글로 지적바란다. 그럼 수고링!




to Top