기대 안하고 있다가 다른 사람이 컷이 4문제 정도일 것 같다는 말에 혹시? 했는데..

본선 진출..... ㅋㅋㅋㅋㅋㅋ


가볼까 말까........


(08.11 18:12 수정)


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




예선 참가 도중의 스크린샷도 하나도 없고, 끝나고 완전히 다 닫혀버려서 소스코드도 하나도 없어서 그냥 지나가려고 했지만,,

그래도 재밌었던 경험이라? 조금 부끄럽기도 하지만 짤막하게 남겨본다.


알고리즘 같은걸 제대로 배워본 적도, 공부해본 적도 없어서 보통 이런 대회는 자신이 전혀 없고,,

괜히 쳤다가 참혹한 현실의 결과에 우울할 것 같아 응시를 잘 안하지만,

그래도 잉여로운 나날에 변화점이 될 수 있지 않을까 시도해봄.


예선은 원래 오후 1시 ~ 7시였지만, 당일날 멍때리고 있다가 오후 2시부터 시작하였다.


다행히 문제를 보고 싶다는 동아리 선배의 말에, 스크린샷/복붙을 해둔 친구가 있어서 글 쓰기는 조금 편한 듯.

기본 코드를 제외한 문제 원문이 그대로 있지만, 혹시 모르니 다 올리진 않고 적당히 내 기억에따라 작성...


언어는 C++, Java 2가지였고, 원래 Java 를 별로 안좋아할 뿐더러 C++11 이라 Java 보다 불편할 이유가 없었기에 모두 C++ 로 풀었다.

여튼 문제는 총 6문제!


1 -> 2 -> 4 -> 5 -> 3 순으로 풀었는데, (6은 못품)

1 -> 2 -> 4 까지 2시간 정도 걸렸고, 5번을 푸는데 1시간 정도 투자했던 것 같다.


3번도 1시간 정도 투자했던 것 같지만 결국 못풀었고...

6번은 제대로 시도조차 못해봤다.


결론적으로 1, 2, 4, 5번 이렇게 4개 문제를 풀었음.



Code Festival 문제

1. 카카오 프렌즈 컬러링북


2차원 벡터로 표현된 이미지에서 가로세로 같은색끼리 classification 해서 총 몇개 그룹으로 나뉘는? 뭐 그런 문제였다.

그냥 재귀함수 하나 짜서 돌렸다.


2. 보행자 천국


2차원 맵을 주고 좌측 상단에서 우측 상단까지 최단거리로 가는데, 지점마다 제한(방향전환 불가 / 진입불가)이 있고, 총 몇개의 루트가 있는지를 구하는 문제.

얘도 마찬가지로 재귀로 짰는데, 타임아웃이 났다.

벡터를 하나 더 만들어서, 한번 경우의 수가 구해진 경로는 저장을 했더니 통과.



3. 브라이언의 고민

♚프☆렌☆즈☆레☆이☆싱♚★사전예약★진행중
$지금$예약시♜이모티콘♜100%※증정※
★라이언★카트♨전원♨획@득@기@회
즉시이동 http://...

sentence 

answer 

 HaEaLaLaObWORLDb

 HELLO WORLD

 SpIpGpOpNpGJqOqA

 SIGONG JOA

 AxAxAxAoBoBoB

 invalid


스팸필터를 피하기 위한 규칙적인 광고글을, 원래 문구로 복구시켜보는 문제.


파이썬을 사용하지 않는 문자열 처리를 싫어해서 젤 뒤로 미뤘는데, 결국 마감시간에 쫓겨 제출하지 못했다.

나름 짠다고 짰는데, 경우의 수를 제대로 고려해주지 못했다.

급하게 작성을 하다가 결국 풀지 못한 문제...

중간에 안놀고 1시부터 제때 풀기 시작했으면 풀 수 있지 않았을까 싶어서 아쉬움이 많이 남는다.



4. 4단 고음


어.. 음...

시작음이 1이라고 할때, x3 +1 +1 순서로 높아지는 3단 고음을 구현하는 아이유가,

삼단고음을 중간중간 섞어서 당일 컨디션에 따라 원하는 고음 높이를 구현하기 위한 가지수를 구하는...(뭔소리야)


(생략)

3단 고음은 다음과 같이 적용된다. 1단계에서는 음높이가 세 배가 되며, 2단계와 3단계에서 음높이가 각각 1씩 증가한다. 이를 기록으로 남길 때 * 와 + 기호를 사용하기로 했다. 즉, 3단 고음을 한 번 한 경우는 문자열로 나타내면 다음과 같다.

*++

(생략)

3단 고음의 2단계를 마친 후 3단 고음을 새로 시작한 다음, 나머지 단계를 이어서 하는 경우는 *+*+++

(생략)


 *

 x3

+1 

x3 

+1 

+1 

+1 


최종 음높이: 15



위 문제들과 마찬가지로 그냥 재귀로 역으로 찾으면서 내려갔다.

당연히 그냥 전체 돌면 타임아웃이 나고 중간에서 적당히 빠져나와줘야 하는데...


역계산 하면서 나오는 + 갯수상, 반드시 나와야하는 * 갯수(예를 들어 +가 3개라면 남은 *은 2개, 즉 현재 계산 중인 높이가 3^2 = 9 이상)로 먼저 걸렀는데 또 타임아웃.

그래서 다음으로 최종 음높이를, 밑을 3으로 하는 로그(log(n) / log(3)) 를 취한 값을 구해서, * 이 나올 수 있는 최대 갯수를 구한 다음에 이걸 기준으로 한번 더 걸러주니 정답처리 되었다.



5. 캠핑


쐐기의 좌표를 주고, 외곽선을 제외한 내부에 다른 쐐기가 없는, 대각선으로 쐐기 두개를 고르는 문제였다. (설명을 못하겠네.. ㅈㅅ..)


얘는 그냥 루프로 돌렸지만,, 당연히 그냥 다 돌면 타임아웃...


주어진 쐐기에 대한 좌표들을 x에 대해서, 그 다음 y에 대해서 정렬을 했고, 루프 안에서 인덱스 몇개를 저장하는 방식으로 루프 횟수를 줄이니 8.5초(...)로 통과가 되었다.



6. 신비로운 유적 탐험


트리의 최대 공통부분의 크기를 구하는 문제. 위 예시의 경우 답은 7


바이너리 트리였다면 좀 시도를 해봤을텐데, 시간도 없었고 감이 잘 안와서 시도도 못해본 문제...

1학년때 특허의 claims 항목과 관련하여 비슷한 논문(?)을 봤었는데, 그냥 그 기억만 떠오르고 말았다.




------


5문제 쯤 풀면 괜찮게 풀었다고 말할 수 있지 않을까.. 했는데 4문제로 그쳐 아쉬웠다.
사실 푼 4문제도 잘 풀었다고 말할 수 없을 것 같기도 하고...ㅠㅠㅠ

코드를 백업하지 못해 아쉽다고 생각하기도 했지만, 지금 생각해보니 있어봤자 부끄럽기만 했을 것 같기도 하다.
잘 푼 사람이나 모범답안(?) 같은거 몇개 공개해주면 정말 고마울 것 같은데....ㅠㅠㅠㅠ

결과가 어떤식으로 나올지, 잘한 사람들 코드를 공개해줄지 기대하며, 끝!


배틀그라운드를 하고싶어만 하던 와중에, 곧 입대하는 선배가 본인의 그래픽카드를 조금 저렴하게 판다고 하셔서,

약간의 고민 끝에 바로 질러버렸다.


eGPU 에 대한 궁금증 + 관심이 예전부터 조금 있기도 했고...


비싼 듯 싼 듯....


Mac 및 Bootcamp 를 공식지원하지 않는다곤 하지만, 이런저런 편법을 사용하면 된다고 하여 구매하도록 하였다.

그래픽카드를 바로 되팔아도 몇만원 이득보게 구매하기도 하였고, eGPU Box 도 크게 감가가 없는 듯 하기도 하였고.



     


비교군은 갤럭시s6.. 생각보다 너무 큰 택배상자가 와서 놀랐다


설명서, 나사, 전원케이블, 30cm TB3 케이블이 함께 온다.

저 파란 타이? 는 뭔지 모르겠고...




이건 선배가 쓰다가 나에게 판 그래픽카드!

어릴땐 형이 알아서 컴을 맞췄고 고등학생때부턴 맥을 사용해왔으니,

내 소유의 그래픽카드는 처음이다. 여전히 잘 모르기도 하고..ㅋㅋㅋ

어련히 좋겠거니....


장패드도 같이 주셨는데 나에겐 부담스럽다..ㅠㅠ



    


그래픽카드에 비해 eGPU BOX 가 너무 커서 그래픽카드 2개 설치하는 용도인가 했는데,

안에 두꺼운 팬? 이 자리하고 있다.

mini 제품도 따로 있던데,, 뭐 들고 다니면서 쓸건 아니니 아쉽지만 큰 사이즈는 그러려니...




TB3 케이블이 너무 짧아서 후면을 앞으로 배치하였다.




전원을 종료한 상태에서 연결하고 켜야한다고 하던데, 나의 경우엔 Mac, Windows 둘다 켜진 후에 연결해도 별 문제는 없었다.

물론 연결해도 될 뿐 정상작동한다는 소리는 아님..

또한, AKiTiO Node 가 전원도 공급해준다.



Windows 는 그래픽드라이버 잡고 재부팅하니 별문제 없이 바로 사용가능.

다만 후에 부팅하려고 하니 처음 로고화면에서 멎어서 부팅이 안되는 경우가 발생했다.

부팅 상태에서 연결하면 장치관리자에 error 12, 리소스 부족으로 사용할 수 없다는 메시지가 나오는데,,

egpu.io 에 가보면 아예 상단 메뉴로 [GUIDE] Macbook Pro: solving eGPU error 12 in Windows 10 가 링크되어 있다.


난 저 가이드를 하기 싫어서 부팅 상태에서 연결 후 가만히 있으니 윈도우가 재부팅해야한다고 하고, 재부팅 후에 다시 잘 되더라.

한번 더 부팅하면 어떻게 될지 모르겠다.... 바로 배틀그라운드 결제 후 재밌게 하고 옴..ㅋㅋ


USB-C 허브가 하나 있는데, eGPU 연결된 상태에서 얘를 추가로 연결하면 컴퓨터가 바로 재부팅된다.

HDMI 때문에 그런 것 같기도 하고... 이건 좀 불편함..



Mac 은 모델에 따라 조금 다른 것 같다.


나는 USB-C 지원 맥북을

Macbook Pro Touchbar (15", 2016) 모델과, 

뉴맥북 레티나 (12", 2016 early) 모델을 가지고 있는데,


맥북프로의 경우에는

부팅 전후 연결에 별 문제가 없다. 시스템 리포트에 정상 연결됨을 확인할 수도 있고.



다만 외장 그래픽으로써 사용이 되진 않는 것 같은데,

automate-eGPU 라는 스크립트가 있다.

루트리스를 꺼야하는게 귀찮고 맥북프로에서는 외장그래픽이 딱히 필요가 없어서 시도해보지 않았다.

tensorflow 를 돌려보고 싶어서 구동해봤다.

외장모니터가 반드시 물려있어야 작동한다는 점을 제외하면 그럭저럭 잘 됨.



뉴맥북은 연결되면 좋을 것 같아서 rootless 를 끄고 시도해보기로 했다.

다만 뉴맥북은 연결하자마자 아래와 같은 메시지가 뜨고 연결이 되지 않는다.

스크립트 역시 장치가 검색되지 않아서 작동하지 않고... 대역폭이 부족해서 안되나부다..

알고보니 뉴맥북은 썬더볼트3 지원이 아니였다....ㅠ







외장그래픽 연결 후 해본건 오버워치 훈련장이랑 배틀그라운드..

배틀그라운드는 첫판을 자동 설정 그대로, 모두 울트라로 진행하였고, 별로 렉이 없었다.


그 후론

안티 앨리어싱: 울트라

포스트 프로세싱: 매우 낮음

그림자: 매우 낮음

텍스쳐: 울트라

효과: 매우 낮음

식생: 매우 낮음

거리 보기: 중간

으로 무리 없이 플레이 하였다.


총 5판 정도?에 듀오로 팀 2위 까지(1킬이지만...ㅋㅋ) 가보고 멀미할 것 같아서 그만함..ㅋㅋㅋㅋ





한동안 재밌게 하다가, 게임 외에 사용처를 못찾으면 팔아버려야겠다.


내가 만든 Lambda 함수에서는 AWS RDS 에 접근도 필요했고, 외부 인터넷으로의 접근도 필요했다.

RDS SG(Security Group) 설정상 Lambda 를 VPC 내에 뒀는데, 이러면 Lambda 에서 외부 인터넷으로 접근이 안된다..!


현재 내가 찾은 해결법들은 꼼수 포함 4가지.

1. RDS의 SG설정을 전체 허용, 혹은 Amazon EC2 IP 목록 허용한다.

SG를 전체허용한다면 Lambda 를 VPC 내에 두는 이유가 사라진다.


후자는 Lambda 가 있는 리전의 Amazon EC2 IP 들을 RDS 의 SG 에 때려박아두는 방법.


Amazon 이 사용하는 IP 주소 목록은

https://ip-ranges.amazonaws.com/ip-ranges.json

이 주소에서 JSON 형태로 확인할 수 있다.


관련 설명은 https://docs.aws.amazon.com/ko_kr/general/latest/gr/aws-ip-ranges.html 여기 참고.



대충 위의 접어둔 파이썬 코드를 이용해서,

ap-northeast-2 region 의 EC2 service ip prefix 만 가져온 다음에, 이걸 Security Group 에 넣으면 해결.


Source 에 쉼표로 구분된 값을 넣고 저장하면 알아서 분리된다.


2. AWS에서 제공하는 Managed NAT Gateway를 사용한다.

 VPC 에 Managed NAT Gateway 를 생성하여, VPC 내의 Private subnet 이 외부 인터넷 접속이 가능해주게끔 구성하는 방법

다만 이 NAT Gateway 비용이 월 $40가 넘는다...


3. 외부 인터넷으로 접근하는 함수, VPC 내에서 DB에 접근하는 함수 두개를 만들어 함께 사용한다.

Lambda 비용이 두배로 들겠지만, 어차피 1백만회를 초과할 것 같지도 않고, 초과해도 NAT Gateway 비용보다는 쌀 것 같달까...


다만, VPC 설정이 된 람다함수는 다른 람다함수를 호출할 수 없다. 람다 호출 자체가 외부 인터넷을 사용하는 셈이라..

VPC 밖의 함수를 A(외부 인터넷 연결 가능), VPC 안의 함수를 B 라고 한다면,

항상 A 호출 -> A에서 B를 호출하여 DB작업 -> A에서 결과를 받아서 후처리 -> 반환

의 형태를 취해야한다. 경우에 따라 상관없을 수도 있지만 비효율적으로 될 수도 있는 방법.


4번의 방법을 몰랐기 때문에 난 이렇게 구성해뒀다.


4. ec2 로 NAT instance 를 직접 구축한다.

AWS 에 문서가 있다. -> VPC NAT Instances


후에 시간있을때 적용해볼 예정.

위 글에선 미리 만들어진 AMI를 사용하는데, 나는 기존 Ubuntu Instance 를 어떻게 활용해볼 예정이다.


+ Recent posts