중간부터 보신분들도 있을 것 같고 어떤 분들을 위한 것인지 다시 한번 말씀을 드리면

 

진짜 알고리즘을 공부하시려면

1. 다른 강좌를 듣고, 좋은 책을 보시고

2. 유명 온라인저지 사이트에서 좋은 문제를 많이 접하시고

3. 유명한 대표적인 알고리즘을 이해하시면

분명 실력이 올라갑니다.

 

다만 상반기 공채를 봐야 하는데 이제 부터 위처럼 할 시간이 없거나.

위처럼 했는데 공채에는 어떤 문제가 나올까? 하시는 분들이 보시면 됩니다.

 

제가 생각하는 것은 다음과 같은 가정에서 시작합니다.

1) 대규모 공채 (1:1 면접은 다 소용없습니다.)

2) 온라인 시험

3) 신입사원 수준

4) 알고리즘이 아니라 업무 역량

5) 시험 볼때 참고자료를 보거나 가져갈수 없슴

 

위와 같다고 보면 어려운 문제를 낼 수 가 없습니다.

토익처음 시작했을때 다들 점수가 낮았는데 지금은 800/900 넘는 분들이 많은 처럼

몇년이 지나면 어려운 문제를 내도 있겠지만 아직은 아닌 같습니다.

 

위와 같은 조건일때 나올만한 문제?/Tip?을 이야기 하고 싶었습니다. 

 

가끔 입력 조건등을 봤을때 출제자는 어려운 알고리즘을 쓰는 것 까지는 바라지 않았는데

이 문제는 DP를 썼어야 했는데, 위상정렬이 필요한 것이었구나 하고 오해?를 하는 경우를 많이 봤습니다.

물론 입력 변수가 많거나 범위가 넓으면 정식 알고리즘을 써야 하지만

그렇지 않은 경우도 많이 있어서 쓰고 있습니다.

 

문제나 TIP관련 내용도 안쓰고 한 회를 때웠네요.

 

 

사실 온라인 공간에 글을 쓰는 것이 창피합니다.

정보 올림피아 금상 정도나 탑코더 우승 해야 내가 고수니까 들어봐 하고 말이 먹힐 있곘지만

 

三人行必有我師 (삼인행 필유아사, 3명이 가면 반드시 내가 배울 것이 있는 사람이 있다.)

란 말을 생각하면서 누군가는 필요한 정보라고 생각해서 쓰고 있습니다.

 

아직 머리에 해주고 싶은 말이 있어 글을 계속 쓰는데 박박 긁어서 없어지면

그만쓰겠습니다.

 

#삼성_소프트웨어_역량_테스트

제가 처음에는 공부를 때는 알려주는 사람도 없어서

온라인저지 사이트가 있는 줄도 몰라서 정보 올림피아드 기출 문제를 가지고 공부를 시작했는데

 

좋아하는 문제였고 풀고나서 많이 깨달음을 얻은 문제가 있습니다.

 

금광문제라고 "중등" 문제 였습니다.

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

 

기출문제이니 찾아보시면 "정식"해법이 있을 텐데 "벤다이어 그램" 형태가 힌트입니다.

(~ 1 사이트에 강좌 뿐만 아니라 기출이 있는데 거기 보시면 해법도 나옵니다.)

 

저의 강좌는 초급 수준이니 초급으로 풀면 아래와 같습니다.

앞에서 말씀드렸던 2차원 완전탐색의 일종이네요

 

금광의 좌표가 넓지 않은 곳에 분포되어 있다면

for (x

  for (y

     for (dx

        for (dy

 

외와 같이 4 포문을 이용하면 풀수 있습니다.

이걸 하다보면 유사한 지역을 반복해서 더하고 있는 것을 알게되고

고민을 하다가 보면 DP 발전할  있습니다.

문제를 DP라고 하기도 그렇고 아니라고 하기도 그런데

DP 배우지 않았다고 하더라도 수학적 감이  있으면 생각할  있는

방법이기도 합니다

 

이것을 이해하면 풀수 있는 유사한 문제가 온라인저지 사이트에 많이 있습니다.

 

어느편에선가 이야기 처럼 문제를 입력변수의 크기를 봐야 합니다.

문제는 " 정수 x y(0 x,y 10^9)" 이렇게 되어 있어서 완전탐색으로

절대 없는 문제라는 것을 알려준 것입니다.

 

하지만 초급 수준에서는 완전 탐색으로 풀어보세요.

 

대부분 온라인저지 사이트에서는 초급 수준은 Fail 처리되기 때문에

Pass하기 위해서는 DP 알고 있어야 하는데 이게 허들이 되어서

포기하게 됩니다.

 

제가 온라인 저지로 사람을 뽑는 회사에 담당자라면 이런 문제를

출제하여서 지원자의 수준을 있을 같습니다,

 

부분점수가 있다고 공지를 하여 초급으로 있는 TC

앞에 높으면 초급으로 풀어도 부분점수를 받을 있어서

 

알고리즘이 많이 필요한 부서에는 고득점인 사람을 배정하고

초급만 푼사람은 일반 부서에 배정하는 방법도 있을 같습니다.

 

#삼성_소프트웨어_역량_테스트

이번 편은 TIP 생각나서 써봅니다.

 

2차원 평면에 사각형을 여러개를 그렸을 (중첩될 있음)

(입력 데이터로 사각형의 대각선 좌표를 주어짐)

 

1. 사각형이 표시하는 면적은 얼마인가?

2. 사각형이 1번만 겹치는 부분의 면적은 얼마인가?

3. 사각형이 겹치지지 않는 부분의 면적은 얼마인가?

 

이런 종류의 문제를 푸는 방법으로 플레인 스위핑이라는 유명한 방법이 있습니다.

http://blog.naver.com/PostView.nhn?blogId=choyi0521&logNo=220020192420

 

하지만 유명한 방법을 모두 없기도 하고

사각형이 표시하는 면적이 적고 사각형의 갯수가 적다면 아주 쉽게 푸는 방법이 있습니다.

 

최대 범위만큼 메모리를 잡고 사각형 마다 안에 면적안에 1 추가합니다.

그럼 겹쳐지지 않는 부분은 1 써있게 되고

2 겹쳐지는 부분은 2, 3 겹쳐지는 부분은 3 됩니다.

 

위의 1 문제는 모든 숫자의 갯수를 세면 되고

2 문제는 2 갯수를 세면 되고

3 문제는 1 갯수만 세면 됩니다.

 

간단한 것인데 쉽게 생각나면 쉽게 풀고 아니면 어렵게 풀어야 하는 문제입니다.

 

하지만 사각형이 무지 크면 사각형에 1 써넣는 작업이 너무 많아서 TimeOut 되는

방법입니다. 초급/입문으로만 쓰세요.

 

#삼성_소프트웨어_역량_테스트

많은 문제가 "전처리" + "모든 경우 탐색" + "조건확인" 이런 식으로 되었다고 말씀을 드렸는데

"전처리" 해당하기도 하고 가벼운 퀴즈/퍼즐에도 사용되는 것이 있습니다.

 

예를 들어 특정 변화를 보여주고 일정 시간 후에 변화된 상태를 묻는 경우가 있습니다.

일정 시간이 100처럼 for문을 돌려서 해볼만한 것도 있고 1000000000 처럼 무지 큰값을 주는 경우도 있는데

이런 경우는 for문을 돌리지 말라는 뜻이겠죠?

 

1. NxN 배열의 1초일때 (1, 1) 있을때 계속 해서 대각선 아래로 이동한다고 하고 경계를 넘으면 다음 줄로 이동 할때

    1 1,1

    2 2,1

    3 1,2

    4 3,1

    5 2,2

    6 1,3

    ......

          n,n

          1,1

    그림이면 쉬운데 글로는 어렵네요.

    10000000000 후에 위치는?

 

    

 

힌트는 NxN 후에는 다시 돌아오니 10000000000%(NxN) 따지면 됩니다.

이것도 대각선이니 조금 처리가 필요합니다.

아마 이동이 대각선이 아니라 수평이나 수직 방향이었으면 쉽게 생각을 있었을거에요.

 

이런 종류가 나온 책이 번역본은 없던데 아마존에서 algorithm quiz Algorithm puzzle 찾아보면

기본적인 형태의 문제가 많이 있습니다

 

보통 문제가 여기서 끝나지 않고 이것은 전처리이고 다른 문제가 겹쳐지는 경우도 많이 있습니다.

 

#삼성_소프트웨어_역량_테스트

전쟁을 하러 가면서 총을 안가져 가는 격이지만

혹시 시험을 보러 갔는데 완전탐색을 있는 문제가 나왔고

코드가 기억나지 않더라도 끝까지 물고 늘어져야 합니다.

 

많은 문제가 ~하는 경우는 가지인가? 라고 묻기도 하지만

~하는 최대 값은 얼마인가? 라고 묻는 경우가 많이 있습니다.

(실제도 경우의 수보다 최대/최소값이 중요합니다.

  ~과제를 하는데 최소 얼마가 필요합니다. 라고 해야지

  "몇가지 방법이 있는데요.""라고 하면

  "이런.. 그래서 어떤 것이 최소냐고?" 라고 하겠죠.)

 

이럴때 순열/조합/중복순열/중복조합을 확인하고 풀어야 하는 경우도

있지만 중복순열로 풀면 되는 경우가 많이 있습니다.

 

왜냐하면 중복순열이 나머지를 포함하기 때문이죠.

 

그리고 모두 몇개를 고르는 것이 모르면 어려운데

(for문을 몇번 쓰는지 모르기 때문에)

예를 들어 항상 8개를 고른다고 하면 8 for 문을 쓰면 됩니다.

for (a1=1;a1<=8;a1++)

  for (a2=1;a2<=8;a2++)

    ......

 

재귀 이런것 몰라도 이렇게 8 for 쓰면 그게 8개를 뽑는 중복순열입니다.

 

어차피 온라인저지는 코드를 보지 않기 때문에 답만 맞으면 되지

어떤 함수를 썼는지는 중요하지 않고 창피한 이런거 없습니다.

 

조합으로 있는 것을 중복순열로 풀면 몇배의 실행시간이 걸리겠지만

답이 같은 경우가 많이 있습니다.

(아닌 것도 분명 있습니다.그러니 도구(외운 기본 코드) 가지고 시험장에 가야죠.)

 

 

그리고 조합의 경우는 "바이너리 카운팅"이라는 방법으로 쉽게? 구할 있습니다.

재귀 같은 없습니다

(재귀를 이해 못하시겠으면 이렇게라도 하시면됩니다.)

 

비트연산을 이용하는 것인데 코드도 있고 하니 아래를 참고하세요.

http://dumpsys.blogspot.kr/2015/03/algorithm-binary-counting-power-set.html

 

많은 경우가 완전 탐색 문제이니 모든 경우의 수를 찾는,

, 순열/조합/중복순열/중복조합/(복합) 어떤 것인지를 빨리 알아내는 것이 중요합니다.

 

 

#삼성_소프트웨어_역량_테스트

초급 알고리즘 책이라면 뒤편에 조금 설명되어 있지만

알고리즘 대회에서는 가장 중요한 것이 Dynamic Program (동적계획법, 동적프로그램, DP) 입니다.

 

완전탐색에 비해 성능차이가 어마어마 하게 많이 나지요. 물론 효율적이고, 알아야 대회를 나갈 있습니다.

하지만 간단한 문제는  DP 풀지 않고 완전탐색으로 풀수 있으면 충분한 경우도 있습니다.

(실행시간은 걸리겠지만)

 

당신은 S사에 입사해서 신입사원입니다.

 

1. 아래 링크의 오른쪽 그림과 같은 배낭(요즘 용어로 백팩) 가지고 출장을 가려고 합니다.

   https://ko.wikipedia.org/wiki/%EB%B0%B0%EB%82%AD_%EB%AC%B8%EC%A0%9C

   15Kg 담을 있는 가방에 최대한 넣을 있는 가장 금액은 얼마인가?

 

2. 갯수가 1개씩이 아니고 여려개가 있을때는 가장 금액은 얼마인가?

 

배낭문제는 대표적인 DP 문제이지만 DP 풀지 말고 완전탐색으로 풀라고 하는 것입니다.

이런 문제를 딱보고 DP 하고 쉽게 정석인 DP 풀수 있으면 강좌를 읽기에는 본인 수준이 높은 것이에요.

 

몇회의 강좌 동안 하고 싶었던 말은 이미 알고 있는 많은 문제들도 완전탐색으로 풀어보자 입니다.

 

언제인가 말했던 처럼 한동안 모든 문제를 완전탐색으로 풀면 세상이 완전탐색으로 보이고

이렇게 있을 같은 착각이 들지만 계산해보면 실제 이렇게 있는 문제는

입력조건이 아주 제한적일 때만 입니다.

 

이걸 느낄때까지 완전탐색으로 하다가 DP 넘어가야 합니다.

 

#삼성_소프트웨어_역량_테스트

이번 편은 쉬어가는(?) 편입니다.

 

온라인저지 시스템에 제출할때 몰라도 크게 상관은 없지만 알면 예상치 못하게 도움이 되는 것입니다.

 

1. 시험을 볼때 C C++ 선택하면 Visual Studio JAVA이면 Eclipse PC에서 TEST

    온라인저지 시스템에 제출하게 되는데 환경이 달라서 PC에서는 문제가 없지만

    서버에 제출하면 문제가 되는 경우도 있고 서버에는 문제가 없으나 PC에서는

    문제가 있는 경우도 있습니다.

   

    표준입출력으로 scanf printf 쓰게 되는데 함수들이 buffer overflow 발생시킬   있는

    문제가 많은 함수라 Visual Studio에서는 못쓰게 하고 대신 scanf_s 같은 함수를 쓰도록 하는데

    검정시스템에서는 scanf 쓰기 때문에 프로젝트를 만들때 SDL 체크 해제하게 합니다.

 

    그런데 SDL 해제 체크하더라도 warning 발생하는데 warning이라서 동작에는 문제가 없는데

    신경이 쓰인다면 

     #pragma warning(disable: 4996) 사용하면 됩니다.

    (warning 번호가 4996 이니 숫자를 외울필요는 없습니다.) 

 

    해당 주제는  아래 글을 참고하세요.

    http://lureout.tistory.com/425

 

    동작에는 문제가 없으니 무시하고 해도 됩니다. 하지만 warning 무시하는 습관이 들면

    다른 warning 무시하고 그냥 하는 경우도 발생해서 괜히 시간을 보내는 경우도 많이 있습니다.

 

2. 입력되는 값의 범위를 봐야 합니다.

 

    입력되는 값들이 경우는 int 대신 long long 써야 합니다.

    C 처음 배울때나 써봤지 이후는 안써봤는데 일부러 입력값들을 크게 해서

    long long 쓰지 않으면 int 범위를 넘게 하는 트릭형 문제들도 있습니다.

 

    물론 계산 과정 중에 곱셈과 나눗셈이 있을때

    곱셈을 했을때 int 범위가 넘어가는 경우도  확인이 필요하고

    0으로 나누어지지 않는지 확인도 필요합니다.

    PC에서는 확인이 쉽지만 저지시스템에 넣으면 확인이 안되고 그냥 error 발생하거나

    틀렸다고 나옵니다.

 

3. 입력되는 값의 범위에 따라 TC 만들어봐야 합니다.

 

    소프트웨어 공학에 Test Case 만드는 것에 대해 나오는데

    입력변수가 여러개라서 모든 조합을 없다면

 

    1) 입력 변수의 경계값

    2) 입력 변수의 경계값의 조합

 

     TEST하고 제출해야 합니다.

    그렇지 않고 주어진 TC TEST하고 넣으면 Fail, 안되는지 고민을 많이 하게 됩니다.

 

4. 많은 분들 아시지만 if 조건에 상수를 앞에 쓰는 습관을 가지면 좋습니다.

 

    if(a == 3) 대신에 if(a = 3)으로 쓰면 문법적으로는 틀리지 않아서 디버깅에 힘들어지는 경우가 있으나

    if(3 == a) 쓰면 혹시 if(3 = a) 실수를 하더라도 컴파일러가 error 발생하니 쉽게 찾을 있습니다.

    (최신 컴파일러는 warning 주기도 합니다. 그래서 warning 무시하면 안됩니다.)

 

#삼성_소프트웨어_역량_테스트

소프트웨어 공학을 에서 간트차트라던가 CPM(Critical Path Method) 배웠는데

이번 편은 경로 탐색 관련인데 이전 어디선가 잠깐 언급했던 주제입니다.

 

당신은 이번 과제의 PM이다.

 

1. 단계의 담당자들에게 일정을 확인하였더니 위키의 오른쪽 그림처럼 산정되었다.

   https://ko.wikipedia.org/wiki/%ED%81%AC%EB%A6%AC%ED%8B%B0%EC%BB%AC_%ED%8C%A8%EC%8A%A4_%EB%B6%84%EC%84%9D%EB%B2%95

 

   과제의 최소 소요일정을 계산하여라.

  

   물론 회사에서는 MS Project등을 써서 실제 손으로 계산하는 경우는 없지만

   일정이 계속 바뀌게 된다면 손으로 계산하는 보다 미리 하나 짜두면

   쉽게? 있습니다. (~ 억지로 문제 만들기 힘듭니다.)

 

2. 그림에는 없지만 시작점과 끝점이 하나로 모이지 않는 경우는 어떻게 있을까?

   시작점도 2 이상, 끝나는 점도 2 이상

 

원래 CPM 위상정렬을 이용하여 푸는 문제인데 제가 문제를 언급한 이유가

위상정렬을 공부하고 위상정렬로 풀라는 뜻이 아닌거 아시지요?

https://ko.wikipedia.org/wiki/%EC%9C%84%EC%83%81%EC%A0%95%EB%A0%AC

 

당연히 위상정렬이 무엇인지는 알아야하지만 그건 기술면접용이나 1:1 면접을 하시는 곳에

지원하시면 하시고

초급? 입사시험용으로는 너무 가혹?합니다.

실제로 내면 있는 사람이 거의 없을 거에요.

 

일단 어떤 문제이든 경우의 수가 적으면 완전탐색으로 가능하다! 라는 자신감을 갖고 나서

하지만 현실은 경우의 수가 크다는 것을 깨닫고

 

한없이 작아진 나를 바라보고 각종 개념이 괜히 나온 것이 아니구나. 깨닫고

이후 공부를 하시면 좋겠습니다.

 

#삼성_소프트웨어_역량_테스트

프로그램을 배웠으나 알고리즘 시험을 봐야 한다면. #21

 

소프트웨어 공학을 에서 간트차트라던가 CPM(Critical Path Method) 배웠는데

이번 편은 경로 탐색 관련인데 이전 어디선가 잠깐 언급했던 주제입니다.

 

당신은 이번 과제의 PM이다.

 

1. 단계의 담당자들에게 일정을 확인하였더니 위키의 오른쪽 그림처럼 산정되었다.

   https://ko.wikipedia.org/wiki/%ED%81%AC%EB%A6%AC%ED%8B%B0%EC%BB%AC_%ED%8C%A8%EC%8A%A4_%EB%B6%84%EC%84%9D%EB%B2%95

 

   과제의 최소 소요일정을 계산하여라.

  

   물론 회사에서는 MS Project등을 써서 실제 손으로 계산하는 경우는 없지만

   일정이 계속 바뀌게 된다면 손으로 계산하는 보다 미리 하나 짜두면

   쉽게? 있습니다. (~ 억지로 문제 만들기 힘듭니다.)

 

2. 그림에는 없지만 시작점과 끝점이 하나로 모이지 않는 경우는 어떻게 있을까?

   시작점도 2 이상, 끝나는 점도 2 이상

 

원래 CPM 위상정렬을 이용하여 푸는 문제인데 제가 문제를 언급한 이유가

위상정렬을 공부하고 위상정렬로 풀라는 뜻이 아닌거 아시지요?

https://ko.wikipedia.org/wiki/%EC%9C%84%EC%83%81%EC%A0%95%EB%A0%AC

 

당연히 위상정렬이 무엇인지는 알아야하지만 그건 기술면접용이나 1:1 면접을 하시는 곳에

지원하시면 하시고

초급? 입사시험용으로는 너무 가혹?합니다.

실제로 내면 있는 사람이 거의 없을 거에요.

 

일단 어떤 문제이든 경우의 수가 적으면 완전탐색으로 가능하다! 라는 자신감을 갖고 나서

하지만 현실은 경우의 수가 크다는 것을 깨닫고

 

한없이 작아진 나를 바라보고 각종 개념이 괜히 나온 것이 아니구나. 깨닫고

이후 공부를 하시면 좋겠습니다.

 

#삼성_소프트웨어_역량_테스트

지난편에 많은 문제가 아래와 같다고 하였는데

"전처리 + 모든 경우의 + 조건 만족 확인"

전처리도 쉽지 않은 경우도 많이 있습니다.

입코딩으로 하기는 쉬운데 실제 손이 안따라가는 경우도 많이 있죠.

 

아래와 같은 경우 입코딩을 한다면

"문자열을 받아서 문자와 연산자를 분리라고

문자의 끝을 보고 진수를 알면 10진수로 바꾸면 되잖아.

그리고 나서 연산자를 case문에 넣고 연산자 별로 계산하면 되지"

 

1. 4567O + 10111B  같이 여러 진수의 +, -, /, * 연산의 결과는?

    O : 8진수, B : 2진수, D :10진수, H: 16진수

 

힌트1) gets 쓰지 않고 scanf로만으로도 충분

힌트2) 4567O 문자열에서 일단 무슨 진수를 알수 있을까?

          문자열의 길이를 끝까지 가고 나서 마지막 문자열을 보고 진수를 파악한 다음

          다시 처음 부터 와서 8진수임을 알고 처리할까?

 

많은 전처리에 대해서는 완전탐색처럼 정해져있지 않아서

과제나 프로젝트를 많이 해본사람이 자신도 모르게 많은 방법을 알고 있을 같습니다.

 

전산관련과를 졸업하고 과제도 했으면 정도는 하겠죠.

, 1시간 30분안에 코딩까지 끝내지 못하는 분이 많이 있을걸요.

연습이 필요합니다.

 

#삼성_소프트웨어_역량_테스트

+ Recent posts