https://www.acmicpc.net/problem/6988

 

6988번: 타일 밟기

첫째 줄에는 타일의 개수 N이 주어진다. N은 3 이상 3,000 이하이다. 둘째 줄에는 N개의 타일에 적힌 자연수들이 증가하는 순서로 빈칸을 사이에 두고 주어진다. 타일에 적힌 자연수들은 각각 1,000,000 이하이다.

www.acmicpc.net

백준 6988번 문제이자, 정보올림피아드 초등부 2008년도 전국본선 3번문제 타일 밟기 문제이다.

 

문제 분석

타일이 최대 3000개가 주어지고, 타일 번호는 정렬되어 있다.

 

최소 3개 이상 연속된 타일의 숫자 합 중 최대값을 구해야 하고, 연속된 타일이라 함은

타일들 간에 값의 차이가 일정해야 한다는 것이다.

 

등차수열을 이루는 타일 값들의 합이 최대여야 한다는 것

 

타일에 적힌 수는 100만까지 나올 수 있다.

 

알고리즘 설계 및 시간복잡도 분석

타일에 적힌 수는 자연수이므로 1부터 100만의 범위이다.

그러면 타일 간 값의 차이는 1부터 50만 정도가 된다고 볼 수 있다 대충

1 50만 100만1 이렇게 하면 3개가 된다.

 

즉 1 500000 1000001 이렇게 인데, 사실 100만1은 안나오지만, 대충 타일 값 차이가 50만 가까이가

최대값이라고 보면 된다.

 

따라서 타일간 차이값인 diff값을 모두 다 찾아보면서 순회하려면 diff값이 50만개가 될 것이고

 

diff값 별 타일 모두를 다 훑어야 하므로 for-loop 도는 횟수는 50만 * 3천 정도 인데

 

이 값은 15억 정도 되므로, 15초 이상 걸리는 알고리즘 이라고 볼 수있다. 고로 Time Limit Exceed가

자명한 알고리즘이라는 뜻

 

그러면 이 계산량을 줄여야 하는데, N값이 3000이므로 꽤나 작다.

 

3000이라면 //(O(N^2)//)알고리즘을 짜도 돌아간다는 뜻.

 

 

여기서 잘 모르겠어서 아래의 알고리즘 분류를 "보기"를 눌러서 확인해 보았는데

다이나믹 프로그래밍이라고 힌트를 얻었다.

 

그러면 N값을 기준으로 메모이제이션 배열을 활용하면 될 것 같은데, N크기에 맞는 2차원 디피까지는 가능할 것 같다.

 

그렇다면 dp 배열 인덱스에 diff값을 넣을 수는 없다. 메모리 문제도 있고 시간 문제도 있고

 

그래서 //(dp[3000][3000]//)식으로 잡고, //(dp[i][j]//)라 했을 때, //(i//)가 마지막 인덱스고 //(j//)가 직전 인덱스로 해서

 

//(arr[i] - arr[j]//)로 diff값을 구할 수 있으니, 이를 활용해 보기로 했다.

 

dp[i][j] = i번째에서 끝나고, 그 직전에 arr[j]의 값을 갖는 시퀀스 합의 최대값

이라고 정의해보자.

 

처음 3개짜리만 대상으로 dp배열을 모두 전처리 해 놓은 뒤,

모든 dp배열을 돌면서, arr[j], arr[i]를 통해서 다음에 나올 수 있는 값을 구해서, 그 값이 존재하는 지

확인한 뒤, 존재한다면 그 인덱스를 //(k//)라 하고, //(dp[k][i]//)에 //(dp[i][j] + arr[k]//)를 넣는 식으로 구하면 될 듯하다.

 

값이 존재하는지는, 값의 범위가 1부터 100만이므로 배열을 잡기 보다는 c++ stl map같은 자료구조를 쓰면 좋을 것 같다.

배열로 잡는다면 값 자체는 3000개라서 sparse한 배열이 될 것이고, 메모리가 터질 수 있으므로

 

구현 코드

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
int arr[3005];
map<int, int> mm;
ll dp[3005][3005]; // dp[i][j] => i번째에서 끝나고, 이전이 j인 시퀀스의 최대 누적합
int main() {
	ll ans = 0;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int tmp;
		cin >> tmp;
		arr[i] = tmp;
		mm[tmp] = i;
	}
	for (int i = 1; i < n; i++) {
		int cur = arr[i];
		for (int j = 0; j < i; j++) {
			int prev = arr[j];
			ll next = cur + (cur - prev);
			if (mm.find(next) != mm.end()) {
				int next_idx = mm[next];
				dp[next_idx][i] = cur + prev + next;
				ans = max(ans, dp[next_idx][i]);
			}
		}
	}
	for (int i = 1; i < n; i++) {
		int cur = arr[i];
		for (int j = 0; j < i; j++) {
			if (dp[i][j]) {
				int prev = arr[j];
				ll next = cur + cur - prev;
				if (mm.find(next) != mm.end()) {
					int next_idx = mm[next];
					dp[next_idx][i] = dp[i][j] + next;
					ans = max(ans, dp[next_idx][i]);
				}
			}
		}
	}
	cout << ans << endl;

	return 0;
}

 

https://www.acmicpc.net/problem/6986

 

6986번: 절사평균

첫째 줄에 절사평균(N, K)를, 둘째 줄에 보정평균(N, K)를 각각 소수점이하 셋째 자리에서 반올림하여 둘째 자리까지 출력한다. 예를 들어 결과값이 9.667인 경우 9.67로, 5인 경우 5.00으로, 5.5인 경우에는 5.50으로 출력한다.

www.acmicpc.net

문제 내용

 

2008년도 초등부 문제 풀어보다가 1번 문제라서 쉽겠거니 하고 했다가 우수수 하고 틀려버렸다 ㅡㅡ

 

문제 내용은 크게 어려운 것은 없다.

 

규칙에 맞게 절사평균과 보정 평균을 구해주면 되는데, 배열로 받은 뒤 소팅해서

 

앞에 k개 만큼을 날리던지, 근처 값으로 변경해주던지 하면 된다.

 

 

하 그놈의 Floating Point 정확도 문제

 

Floating Point precision 문제때문에 하....

 

 

일단 입력값 중 점수는 0 ~ 10범위의 실수에 소숫점 한자리까지 나오는 floating point이고

전채 개수가 10만개 까지 나올 수 있다.

 

10만개라는 이유 때문에 precision 문제가 발생할 수 있다.

컴퓨터에서 사용하는 부동소수점 방식은 작은 에러값이 발생할 수 있다.

따라서 이게 누적되면 정확하지 않은 값이 나올 수 있는데

 

 

따라서 정수로 환원해서 풀어야 한다.

 

 

결과값은 소수점 2자리까지 출력해야하고, 이로 인해서 100을 곱하면 되겠지만, 소수점 셋째자리에서

 

반올림을 해야 하므로 1000을 곱해서 소수점 셋째자리까지 일단 표현 가능하게 정수로 받았다.

 

그리고 마지막에 5를 더해서 반올림을 구현했다.

 

출력할때는 1000을 나눈 정수 부분과 1000로 모듈러 연산을 한 소수부분(fraction)을 따로 출력해주었다.

 

5가 정답일 때 5.00라고 출력해야 하므로 포맷 스트링에 0 extension도 해 주어야 한다.

 

%02d와 같이 하면 너비 2만큼 0을 꽉채워서 출력해준다.

 

구현 코드

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
int main() {
	int n, k;
	vector<ll> arr;
	cin >> n >> k;
	arr.resize(n);
	for (int i = 0; i < n; i++) {
		double tmp;
		cin >> tmp;
		arr[i] = (ll)(tmp * 1000);
	}
	sort(arr.begin(), arr.end());
	ll s = 0;
	for (int i = k; i + k < arr.size(); i++) {
		s += arr[i];
	}
	ll ans = s / (arr.size() - k - k) + 5;
	printf("%lld.%02lld\n", ans / 1000, ans % 1000 / 10);
	s = 0;

	s += k * arr[k];
	for (int i = k; i + k < arr.size(); i++) {
		s += arr[i];
	}
	s += k * arr[arr.size() - 1 - k];
	ans = s / arr.size() + 5;
	printf("%lld.%02lld\n", ans / 1000, ans % 1000 / 10);
}

 

요즘 SW에 대한 관심이 높아지면서, 한번 공부를 해 보려는 사람들이 많아지고 있다.

 

만약 대학교에서 컴퓨터공학과나 소프트웨어학과를 전공했다면, 자연스럽게 배울 수 있지만,

 

여러가지 사정으로 인해 해당 테크트리로 코딩에 입문하지 못한 사람들이 있을 것이다.

 

오늘은 이러한 사람들이 독학으로 코딩에 입문하려고 할 때 유용한 강의 사이트들을 추천해보고자 한다.

 

 

 

일단 이 글의 예상 독자는 "코딩을 아예 접해본 적 없거나", "거의 접해보지 않은" 일반인, 대학생들이 대상이다.

 

 

코딩에 대해 거의 모르는 사람들 중에서도 기본 선수 지식의 양이 다를 수 있는데

 

수준에 따라 크게 두가지 강의 카테고리를 나누겠다.

 

1. 블럭 코딩

실제 프로그래밍 언어를 바로 다루는 것이 아닌, 블럭 코딩을 다룬다. 코드 블럭을 조립해서 프로그래밍을 하는 방식으로

초, 중등생에게 좀 더 낮은 문턱으로 입문할 수 있는 장점이 있다.

 

또한 게임 형식으로 배우는 경우가 많아서, 초반에 흥미를 좀 더 가져올 수 있다.

 

단점으로는 이 블럭 코딩은 실제 프로그래밍과는 조금 차이가 있을 수 있다는 것이다.

 

2. 프로그래밍

곧바로 적용할 수 있는 프로그래밍에 대하여 배운다. 강의 내용이 대학교 수업 같은 느낌이 많이 들 수 있으며, 좀 더 전문적으로 강의 내용이 전달되지만, 조금 따분해 보일 수 있는 방식이다.

 

자신이 고학력자이거나, 좀더 제대로 전문적으로 배우고 싶다거나, 한다면 이 쪽 카테고리를 보는 것을 추천한다.

 

 

이 글에서는 프로그래밍쪽에 해당하는 사이트들을 다루겠다.

 

혹시 블럭 코딩에 관심있으면 이 링크를 클릭하면 된다.

 

 

프로그래밍 언어

코딩을 입문한다는 것은, 생에 첫 프로그래밍 언어를 배우는 것이라고 생각합니다.

일단 하나 이상의 프로그래밍 언어를 잘 다루게 되면, 그 다음 부터 다른 언어를 배우는 속도는 매우 빨라지고,

컴퓨터 공학과 컴퓨터에 대한 이해에도 많은 도움이 됩니다.

이러한 프로그래밍 언어를 입문할 만한 사이트들을 알아보겠습니다.

 

TCP School

http://tcpschool.com/

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

서울에 있는 코딩 교육기관인데, 간단한 온라인 강좌들을 웹 사이트에 공개해 놓았다.

하나하나 따라해보면 좋을 듯 하다.

 

SoEn:소프트웨어 공학 연구소

http://soen.kr 

 

SoEn:소프트웨어 공학 연구소

 

soen.kr

예전에 winapi.com 과 같은 도메인을 쓰던 사이트인데, 사이트 명을 바꾸면서 soen.kr로 도메인도 바꾸었다.

C/C++ 언어에 대한 무료 텍스트 강의가 공개되어 있고, 매우 자세하게 설명되어 있다.

C/C++를 어느정도 알고 있는 사람이라도 해당 문서들에 디테일한 부분에 대한 설명이 많아서, 한번 쯤 다시 공부할 겸 읽어볼 만한 문서들이 많다.

 

첫 입문 언어로써 C를 선택했다면, 해당 사이트에서 공부해 보는 것도 나쁘지 않다. (첫 언어로 C++은 비추!)

 

사이트 주인분이 안드로이드 관련 책도 냈던데, 해당 책도 사서 본 적 있다. 해당 책도 자세히 잘 설명되어 있어서 도움이 많이 되었다.

 

IT Note 블로그

https://www.it-note.kr/268

 

C Programming Language 문법

1. C 프로그래밍 언어는? 2. C언어 개발 환경 (실습 환경) 3. C언어의 컴파일 과정 4. C 소스 파일 구성 5. 주석문(Comment) 6. 식별자 명명 규칙 7. C 프로그래밍의 시작 - 함수 8. 변수와 상수 (정수형) 9. 변..

www.it-note.kr

C언어에 대하여 설명이 잘 되었다고 추천되는 블로그이다. soen.kr의 경우 꽤나 오래된 자료라서, 레거시 내용들이 조금 섞여있는데 비해 이 블로그 자료는 비교적 최신이라고 볼 수 있다.

 

모두의 코드

https://modoocode.com/

 

모두의 코드

C 언어 문법을 아시는 분들이라면, 씹어먹는 C++ 강좌를 통해 C++ 기초 부터 최근의 C++ 17 까지 모든 내용을 배우실 수 있습니다. C 언어와 C++ 의 기본적인 문법이 비슷하기 때문에, C 언어를 어느 정도 아는 독자를 가정하여 쓰여져 있습니다. 현재 강좌는 연재 진행 중이며, 총 44 개의 강좌가 준비되어 있습니다.

modoocode.com

C/C++ 언어 관련된 자료로 또 추천되는 사이트 중 하나이다.

블로그들 특성상, 어느정도 틀린 내용이 있을 수 있으나 전체적으로 틀을 잡는데는 도움이 많이 될 것이다.

 

 

컴퓨터 공학 입문

 영어권에서는 컴퓨터 과학(Computer science)이라는 단어로도 자주 쓰이는데 엄밀하게는 컴퓨터 공학과 과학은 다르긴 하지만, 여기서는 그러한 단어의 엄밀한 뜻 보다는 "프로그래밍을 지속적으로 하기 위한 기초체력과 같은 지식"라고 이해하시면 편하다. 우선 이러한 지식을 알려줄 수 있는 강의 사이트들을 추천해보도록 하겠다.

 

edwith

https://www.edwith.org/

 

에듀케이션위드 : edwith

에드위드(edwith)는 네이버(NAVER)와 커넥트재단(CONNECT)이 제공하는 온라인 강좌(MOOC : Massive Online Open Course) 교육 플랫폼입니다. 에듀케이션위드(education with) 에드위드(edwith)로 분야별 명품 강좌를 무료(Free Course)로 수강하세요.

www.edwith.org

네이버와 커넥트재단이 제공하는 MOOC 교육 플랫폼입니다. 간단한 회원가입만 하면 무료로 강의들을 들어볼 수 있습니다.

 

특히나 이 플랫폼에서 추천하는 양질의 강의가 있는데, 컴퓨터 사이언스의 세계 1Top이라고 볼 수 있는 MIT에서 공개한 MIT Open Courseware 강의에 한글 자막을 단 강의들이 있습니다.

 

강의를 들어보면, 과연 MIT답게 세계 최고수준의 강의력을 자랑하는데요, 영어강의라서 이해 속도가 떨어지는 단점을 edwith에서 달아준 자막을 통해 보완하면 매우 효율적으로 공부할 수 있습니다.

 

글을 작성하는 현재 기준으로는, MIT OCW를 번역한 강의는 3개 뿐이지만, 데이터 사이언스 기초 및 파이썬을 이용한 알고리즘 이해, 이 2가지 수업만 들어도 매우 탄탄한 기본기를 다질 수 있다고 생각합니다.

 

만약 영어 강의도 괜찮다면, MIT OCW 페이지에 직접 들어가서 원하는 강좌들을 찾아서 들어보는 것도 좋습니다.

또한 강의들은 유투브에도 일부 공개되어 있으므로 들어볼 수 있습니다.

 

 

코세라

https://www.coursera.org/

 

Coursera | Online Courses & Credentials by Top Educators. Join for Free

Learn online and earn credentials from top universities like Yale, Michigan, Stanford, and leading companies like Google and IBM. Join Coursera for free and transform your career with degrees, certificates, Specializations, & MOOCs in data science, compute

www.coursera.org

미국의 MOOC 플랫폼이다. 여러 명문대학교들의 강의를 온라인에서 들어볼 수 있다.

온라인 학위 과정도 있는데, 이 부분은 유료인듯 하다.

다양한 분야에 대하여 강의가 있는데 컴퓨터 과학이나, 데이터 과학이 우리가 배우려는 코딩과 관련성이 꽤 있는

과목들이라고 볼 수 있다.

 

강의들이 영어로 진행되기 때문에 영어 듣기, 읽기에 익숙하지 않다면 공부하기에 난감할 수 있다.

 

유다시티

udacity.com

코세라와 쌍벽을 이루는 MOOC 플랫폼이다. 둘다 무료였다가, 유다시티는 이제 아예 유료 서비스로 선회한 듯하다. 무료강좌가 없는 것 같으므로 여기에 쓰기는 하지만, 추천은 하지 않는다.

 

웹 개발

생활코딩

https://opentutorials.org/

 

opentutorials.org

오픈튜토리얼스 업데이트

opentutorials.org

흔히 생코라고 줄여서 많이 부르는 이 사이트는, 같은 이름의 페이스북 그룹 등도 있다.

모두 무료 강의이고, 목소리만 출연하는 영상 형식의 강의들이 있다. 이고잉이라고 하는 분이  만들고 운영하고 있다.

 

웹과 데이터베이스, 언어 등의 강의가 잘 설명되어 있으며, 왜 이러한 개념들을 알아야 하는지 등을 알기쉽게 잘 설명해준다.

 

 

w3schools

https://www.w3schools.com/

웹 개발 입문 시, HTML에 대하여 공부하는 것이 첫 단계라고 볼 수 있는데, 이 HTML을 공부할 때 유용한 사이트

 

항목 당 글자수가 많지 않은 편이라서, 빠르게 빠르게 모든 항목 슉슉하고 읽어보기에는 괜찮다. 영어로 된 사이트기 때문에 영어 읽기가 익숙한 사람에게 편하다.

 

코드카데미

https://www.codecademy.com/

 

Learn to Code - for Free | Codecademy

Learn the technical skills you need for the job you want. As leaders in online education and learning to code, we’ve taught over 45 million people using a tested curriculum and an interactive learning environment. Start with HTML, CSS, JavaScript, SQL, Pyt

www.codecademy.com

사람들이 코드아카데미라고 잘못 읽는 경우가 많은 코드카데미이다. 웹 개발을 배울 수 있으며, 단계별로 하나하나 따라해볼 수 있는 UI를 제공한다.

 

유명한 프로그래밍 교육 단체인 멋쟁이 사자처럼에서도 기본 조건으로 코드카데미 코스 몇개를 끝내고 오라고 하는 것으로 알고 있다.

 

웹 개발을 하려면 기초 단계중 하나라고 볼 수있다. 일부 강좌는 돈을 내야지 수강할 수 있다고 한다.

 

종합 강의 플랫폼

다양한 분야에 대한 강의가 모여있는 플랫폼들이다. 프로그래밍 언어부터, 안드로이드 개발, 웹 개발 등등의 강의들이 모여있다. 강의가 많은 만큼 유료 강의도 꽤 비중을 차지한다.

 

인프런

https://www.inflearn.com/

불러오는 중입니다...

국내 강의 플랫폼이다. 강사로 활동하고 싶은 사람들이 동영상 형태의 온라인 강의 및 강의 자료를 제작하여 업로드 하고,

 

수강을 원하는 사람은 일정 금액을 내고 강의를 구매하여 들을 수 있는 식이다. 무료 강의도 간간히 있다.

 

대체적으로 IT관련 강의, 개발, Excel 자동화 등의 강의들에 포커스 되어 있다.

 

강의들은 가격이 저렴하고, 기초적인 내용들의 비중이 큰 편이다.

 

 

에듀캐스트

https://educast.com/

 

에듀캐스트

에듀캐스트는 세상 모든 배움을 담는 온라인 강의 플랫폼입니다. 외국어, 프로그래밍, 비즈니스, 대학전공 등 무엇이든 에듀캐스트에서 배울 수 있습니다.

educast.com

인프런과 비슷한 느낌의 플랫폼이다. 무료 강의도 있고, 강의들이 저렴한 편이다. IT/프로그래밍 외의 분야에 대한 강의들도 꽤나 있다.

 

유데미

https://www.udemy.com/ko/

불러오는 중입니다...

위에서 소개한 강의 플랫폼과 비슷하지만, 국내 사이트가 아니다. 따라서 다 영어로 되어 있다.

 

강의들은 비싼 편인 것 같은데 이번에 블랙 프라이데이라고 할인을 하는 듯 하다. 관심있으면 들어보는 것도 괜찮아 보인다.

+ Recent posts