[문제] 두 해의 월별 매출기록을 나타내는 데이터를 생성합니다. 첫 해 12개월의 실적값은 50~100 사이로 랜덤으로 생성한다. 두 번째 해의 실적값은 첫 번째 해의 해당 월 실적값에서 –20 ~ +20 사이로 랜덤하게 증감시킵니다. [ 1월] 70 65 => -5 [ 2월] 60 50 => -10 [ 3월] 95 82 => -13 [ 4월] 77 59 => -18 [ 5월] 86 84 => -2 [ 6월] 81 101 => +20 [ 7월] 50 53 => +3 (2단계) 위의 데이터를 월별 증감값으로 오름차순 정렬하여 출력합니다. (3단계) 증감값이 최대와 최소인 월을 찾습니다 [1단계 문제해결 방법] 첫해의 월별 매출기록을 12개 생성하여 리스트에 저장합니다. 매출 기록은 50~100 사이의 랜덤..
앞의 글에서 만들었던 학생 점수 데이터를 이용하여 다양한 기준으로 정렬하는 방법을 살펴보겠습니다. 우리는 지금 한 학생의 여러 개 정보를 zip을 이용해 묶어 출력하고 있습니다. zip을 하면 얻어진 결과는 리스트가 아니고 generator 값입니다. (제너레이터는 요청될 때 차례로 하나씩 계산하는 함수 또는 수식이고 리스트를 모든 값을 다 계산해서 저장해둔 형태가 됩니다. 이 차이에 대해서는 제너레이터 포스트를 참고하세요. ) 정렬을 하려면 모든 데이터가 리스트에 들어있어야 하므로 우리는 zip으로 여러 개 리스트를 묶은 결과를 다시 list를 통해 바꾸어 주어야 합니다. ziplist = list(zip(alpha, scores, sums)) 이것은 사실 튜플(이름, 점수들, 합계)의 리스트가 되는데..
[문제] 다음은 a~j까지 열명의 학생의 점수(50~100사이 랜덤)과 그 학생의 점수합계, 그리고 전체 점수합의 평균과 이 학생의 점수합의 차이를 보여준다. 이 예에서 평균은 220.1이고 a 학생은 점수합이 평균과 –18.1 차이임을 보여준다. a [59, 81, 62] => 202 (-18.1) b [96, 70, 94] => 260 (+39.9) c [74, 92, 93] => 259 (+38.9) d [53, 75, 52] => 180 (-40.1) e [75, 67, 75] => 217 ( -3.1) f [58, 55, 74] => 187 (-33.1) g [54, 73, 83] => 210 (-10.1) h [58, 50, 89] => 197 (-23.1) i [79, 96, 93] => 2..
printf의 기본 사용법을 요약한 페이지입니다. https://alvinalexander.com/programming/printf-format-cheat-sheet 일반적인 문장은 다음과 같이 생겼습니다. 여기서 %s와 %d 문자의 의미는 무엇일까요? printf("the %s jumped over the %s, %d times", "cow", "moon", 2); 숫자를 출력하는 넓이 조정하기 %3d라는 표시는 정수에 대해 세칸의 넓이로 출력하라는 의미입니다. 기본적으로는 오른쪽 정렬을 디폴트로 합니다. 세 칸을 넘어가는 숫자가 오면 오른쪽으로 더 나가게 됩니다. 전체 넓이를 정해진 크기에 맞추고 앞에 남는 크기만큼 빈칸을 채웁니다. printf("%3d", 0); . . 0 세 칸에 맞춰 오른쪽 정..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dIgmD8/btqAK4l2X1D/2IaSZvwFquqCp1MPusjQXK/img.jpg)
매년말이면 많은 사이트에서 여러 프로그래밍 언어에 대한 조사나 예측을 내놓습니다. 작년 초에 올렸던 2018년 가장 유망한 프로그래밍 언어 포스팅에 이어서 2020년을 예측하는 글들을 모아 다시 한번 정리해 보려고 합니다. 전세계적으로 엄청나게 많은 개발자들을 사용자로 보유하고 있는 스택오버플로우 사이트는 연말에 사용자들을 대상으로 IT의 거의 모든 분야에 대해 설문조사를 하여 분석 결과를 발표합니다. 그리고 이 조사에서 가장 많은 관심을 받는 부분이 (연봉 빼고) 프로그래밍 언어에 대한 내용입니다. 이 조사는 개발자들이 사랑하는 언어(선호도)와 수요가 많은 언어(인기도), 그리고 사라져가는 언어를 조사합니다. 여기서는 인기도와 선호도 결과를 분석한 여러 자료를 정리하여 우리에게 어떤 의미를 가지는지 분..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bam2Fq/btqAIf3Dwqw/6Uar9q8awuuzVldk2osQhk/img.jpg)
요즘은 프로그래밍 언어 중에 파이썬을 처음으로 배우는 경우가 많습니다. 파이썬은 배우기 쉽고 간결한 언어여서 처음 배우는 언어로 좋습니다. 그러나 파이썬 다음으로 C나 자바를 배우려고 할 때는 새로운 개념과 알아야 할 것들이 많습니다. 사실 C는 가장 기본적인 기능을 가지는 언어로 low-level 언어라고 얘기합니다. 그 의미는 프로그램이 가지는 명령어나 기능이 해주는 일이 작고 기본적인 것들이라 파이썬에 비해 프로그래머가 직접 짜주어야 하는 경우가 많습니다. 사실은 파이썬에 비해 해주어야 하는 일이 정~말 많습니다. 그럼 왜 그렇게 불편하고 번거로운 언어를 쓰는 걸까요? 그건 프로그래머가 고생하는 만큼 반대급부가 있기 때문이죠. 가장 큰 장점은 빠르다는 점입니다. C 언어는 정말 빠르고 가볍습니다. ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/wngub/btqAPdLuL8E/Zotsgkkb3nb3d50KTq1uhK/img.jpg)
앞의 글에서 문법에 대해 RDP(Recursive Descent Parser)를 직접 만드는 방법을 살펴보았습니다. 그러나 문법이 아주 큰 경우 모든 넌터미널 심볼에 대해 직접 메소드를 만들고 모든 터미널 심볼을 직접 다루는 것은 결코 쉬운 일이 아닙니다. 그래서 많은 경우 토큰을 읽어들이는 일은 Lexer라는 툴을 많이 이용하고 파서는 역시 파서를 만들어주는 툴을 많이 사용합니다. 그리고 그런 파서는 LL 또는 LR 파싱 방법으로 구현되어 있습니다. 여기서는 LL 파싱 알고리듬이 어떻게 동작하는지를 설명해 보려고 합니다. 사실 이것을 몰라도 바로 파서생성기를 이용하는 것이 가능하나 RDP 방법을 익힌 다음이라면 체계적인 파싱 알고리듬으로서 LL 알고리듬을 이해하는 것이 어렵지 않습니다. 앞의 글에서 살..
프로그램에서 데이터에 대한 반복 계산을 작성하는 방법은 여러 가지가 있습니다. for 루프와 while 루프로 배열이나 입력 등 반복되는 데이터가 있을 때 그것을 하나씩 처리합니다. for (i=0; i 0; } public Student next() { Student st = shuffleList.get(0); shuffleList.remove(st); // 다음 요소를 꺼내 돌려주고 삭제한다 return st; } } } 프로젝트에서 여러 가지 콜렉션에 대해 for-each 문으로 차례로 돌려주며 뭔가 계산하는 기능을 사용하는데 이터레이터 패턴이 매우 유용합니다.
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/osSBB/btqAOdyd947/k0yAwuotosgLLdXEKNc39k/img.jpg)
이전 포스트에서 E -> T { (+|-) T }, T -> num | (E) 라는 문법의 파서를 만들어보았습니다. 여기서는 문법을 좀더 확장하고 수식 계산 과정을 보여줄 수 있는 파서를 만들어보도록 하겠습니다. (완성된 코드와 실행결과는 하단에 링크되어 있습니다.) /* * E -> T { (+|-) T } * T -> F { (*|/) F } * F -> num * | ( E ) */ 이전 포스트에서 +와 - 연산만 지원하는 문법에서 *와 /를 지원하는 문법으로 확장한 것입니다. 우선순위를 고려하기 위해 새로운 넌터미널을 도입하여 괄호()로 둘러싼 부분이 가장 우선순위가 높고 *|/가 그 다음 순위고 +|-가 가장 우선순위가 낮아서 마지막으로 처리되도록 문법을 만든 것입니다. 이렇게 되면 T() 메소..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bi7Pqq/btqABRue8SW/uJ4ZrOAags45LWL6eNT8C0/img.png)
파서는 우리가 많이 쓰면서도 정확하게 그 알고리즘을 알지 못하는 대표적인 방법 중 하나입니다. 컴파일러의 한 분야이고 알아야 하는 용어가 많아서 쉽게 이해하기 어려운 분야입니다. 여기서는 완전 처음부터 자바만 가지고 파서를 구현하는 방법을 알아보려고 합니다. 물론 문맥무관문법(CFG: Context-Free Grammar)나 토큰, 어휘분석기의 개념 등을 알고 있어야 하지만 대략의 개념만 이해한다면 파서의 알고리듬과 구현 코드까지도 들여다 볼 수 있습니다. 함께 출발해 봅시다. 먼저 문법에 대한 간단한 설명입니다. 문맥무관문법은 생성규칙이라는 걸 가지고 왼쪽에 넌터미널 심볼이 나오고 오른쪽에 여러 개의 심볼이 연속해서 나타납니다. 그래서 시작심볼에서 시작해서 차례로 생성규칙을 적용해 가다보면 입력을 처리..
- Total
- Today
- Yesterday
- zip
- indexof
- contains
- 콜렉션
- typedef
- python exercise
- 패턴
- ToString
- sort key
- 스트링
- 자바regex
- max
- 지연계산
- python example
- format
- follow
- rust
- 이터러블
- CompareTo
- APPEND
- C++ 클래스
- TypeError
- Camel Style
- comparable
- contentEquals
- 동적바인딩
- 이터레이터
- 스트링 +
- Lazy evaluation
- Iterator
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |