글

Palindrome 기초

이미지
 Palindrome - 회문 거꾸로 뒤집어도 똑같은 (ex: 토마토, 기러기) 문자 찾기 알고리즘 검색 해보니 manacher 알고리즘이 나오는데 감을 찾는 중이라 가장 easy 문제로 접근해보았다.  9. Palindrome-number

오라클 invalid Object 이슈

데이터베이스에서 사용되고 있는 테이블에 대하여 컬럼을 추가 또는 수정 될 때가 있다. 이게 기존 회사에서는 큰 작업 사항으로 여겨지지 않았는데 이번에 바뀐 환경에서는 해당 작업을 굉장히 신중하게 진행 하기에 해당 부분을 찾아보았다. invalid Object? Object에는 프로시저, 함수, 트리거 등등이 포함된다. 테이블 컬럼의 변경으로 해당 작업들의 컴파일이 해제된 상태가 되고 진행되지 못한다. 작업 자체가 이루어 지지 않는 상황이라는 것을 알았다. 구글링해서 얻은 정보로는 일반적인 상황에서 쿼리를 통해 invalid 상태인 오브젝트 들을 검색하고 해당 작업을 재 컴파일 해주면 된다고 한다.  현재 우리 회사에서 사용하고 있는 SQL gate 기준으로는 도구>개체 재컴파일 에서 유효하지 않은(invalid) 상태인 개체를 검색하고 해당 작업이 무엇인지 살펴봐야 한다. 왜 오라클만?  구글에 "오라클 invalid object" 이라고 검색하면 관련된 결과가 여러가지 나오지만, "mysql invalid object" 이라고 검색하면 관련해서 나오지 않는다. 여기에 대해서는 조금 더 찾아봐야 할듯 ... 왜 이전 회사에서는 큰 이슈가 아니었을까? 오라클 요금제의 차이라고 하는데 오라클 공식에서도 관련해서 상세히 설명된 부분이 없다. 일단 현재 시스템 내에서는 아래 일련의 과정을 거쳐서 테이블 컬럼을 추가한다. 개발 DB 에서 바꾸고자 하는 테이블의 컬럼을 추가한다.  도구 > 개체 재컴파일에서 유효하지 않은 상태 개체 검색 해당 개체들이 운영 상 치명적인(회원, 주문, 결제 관련) 로직 이거나 재컴파일 시 시간이 과하게 오래 걸리는 부분이면 컴파일 이전 시간 진행  유효하지 않은 개체가 검출되지 않거나 해당 개체들이 치명적이지 않은 경우 서비스 운영 시간에 반영 가능  이런 식으로 진행한다. 
이미지
실용주의 프로그래머(20주년 기념판)  데이비드 토머스•앤드류 헌트 2장 - 실용주의 접근법 (~Topic 9)

실용주의 프로그래머

실용주의 프로그래머(20주년 기념판)  데이비드 토머스•앤드류 헌트 유명한 책이라고 계속 들어온 몇몇 책이 있다. 이펙티브자바, 클린코드 그리고 실용주의 프로그래머, 이 중 실용주의 프로그래머가 정말 공통적으로 도움이 될만하다고 추천받아서 이를 간단히 정리 해보고자 한다. 처음 읽는 만큼 간단히 읽고 넘어가는 부분도 많고, 주관적인 의견이 들어간 정리일 수도 있는 정리이다 (그 앞에는 "개인적인 생각으로는"이 들어가게 적는다.) 1장 - 실용주의 철학

자율 프로젝트 end

이미지
시작 당시 사용하려 했던 기술을 사용해서 웹게임을 구현했고, 3일간 싱글게임 약 400회 멀티게임 약 250회가 플레이 되었다. 애시당초 구현하려던 충돌 멀티엔진은 실패 했지만 문서화나 사람들의 플레이 후기가 썩 괜찮았던 만족스러운 프로젝트 시작 때 사용하려 했던 기술들에 대해 다시 한번 짚으려고 한다.  webSocket 과 STOMP  컨트롤러에서 어노테이션으로 간단하게 연결가능 했으며 sub한 유저들에게 pub 해준다 라는 다소 난해한 설명과 달리 http 요청과 흡사하게 사용할 수 있었던 것 같다. 해당 기능으로 다른 유저의 방 접속 여부, ready 여부, 움직임 등을 공유해서 멀티 플레잉을 구현했으며 채팅과 달리 키입력을 모두 주고 받았음에도 동시에 5명 정도는 매우 매끄럽게 통신이 가능했다. 물론 규모가 커지면 내부 simplebroker를 외부 브로커로 적용 시키고, 서버를 따로 두는 등의 노력을 해야한다.  + 소켓이 연결 및 해제될 때 중간 중간 잡아주는 ChannelInterceptor 가 있는데, 해당 부분에서 메세징 보내는걸 몇번이나 실패했다.  gradle  시작할 때 건들고 이후 몇번 implementation 을 추가한 것 이외에는 별로 접해보지 않았다. 빌드 속도나 편리성에서 사실 maven 보다 월등한 점은 모르겠다. 다만 eclipse 기준으로 import 해오는 방식이 굉장히 복잡하고 문제가 발생할 여지가 많은 것 같은 기분, 이름이 겹치기만 해도 프로젝트를 자바프로젝트로 인식 하지 못하는 문제가 존재한다. 이번에 이를 겪으며 트러블 슈팅한 경험은 다행. 이클립스에서 import할 때 여기 이름이 일치하는지도 살펴보자 Redis Redis repository 로 JPA 와 비슷하게 사용하였다.  save()를 이용하여 저장할 경우 데이터가 hash로 저장되며 이때의 key는 "Object:id" 의 형태가 된다. 우리의 경우 Access 라는 객체에 sessionI...

자율 프로젝트 start

이미지
프로젝트에서 적어도 안 써본 기술 하나는 써보자 라는 다짐하에 2학기 3번째 프로젝트, 자율 프로젝트가 시작되었다. 이번에는 유행했던 점프킹과 같은 장애물을 피해 올라가는 게임을 구현하려고 하는데 이걸 멀티접속이 가능하게 하려고 한다. 당연히 웹소켓이 필요하고 지금 껏 룸을 나누지 않고 단순 웹소켓만 사용해본 나로써는 새로운 도전이라고 할 수 있다. socket 과 websocket 일반적으로 socket 이라고 하면 tcp/ip socket을 의미한다. 그래서 이론적으로 가장 큰 차이점은 websocket은 http 레이어에서 작동하는 소켓으로 레이어가 다르다 라고 볼 수 있다.  기본적으로 http는 요청 후 응답을 보내는 단방향 통신인데 이걸 socket 처럼 쓰고 싶어서 만들어진 기술이라고 한다. 나같은 웹개발자는 그냥 이걸 쓰는게 맞는거 같고, 다만 브라우저 별로 못 쓰는 상황이 나와서 socket.io나 socketJS 같은 기술을 사용해서 이를 보완한다. STOMP  simple text oriented messaging protocol의 약자이며, 텍스트 기반의 프로토콜이다. websocket은 연결된 socket에게 data처리를 직접 다하는 반면, stomp는 subscriber, sender, broker를 따로 두어 처리를 하게 된다. subscriber(receive socket) : 채팅방에 입장하여 해당 채팅창을 구독, 즉 참여하고 있는 채팅창에 오는 메시지를 실시간으로 받아볼 수 있으려면 먼저 구독이 되어있어야 한다. sender(send socket) : 참여하고 있는 채팅창에 글을 써서 해당하는 주소로 메시지를 전달한다. broker : 연결된 socket들의 세션 관리를 해준다. 즉 subscriber를 구독한 채널에 연결시켜주고, sender가 그 채널에 메시지를 보내면 subscriber에게 전달해주는 중간 다리 역할을 한다. ChatController 에서 @MessageMapping("") @Send...

OAuth

이미지
OAuth 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준 쉽게 말해서 카카오, 네이버, 구글 등의 아이디로 나의 서비스를 이용할 수 있게 하는 서비스인데 이는 편리함을 위해 만들었다.  상기 서비스의 계정정보가 처음 보는 서비스에 넘어가지 않을까 하는 우려도 있지만 이는 꽤 복잡한 과정을 통해서 보호되어 전달된다. 비밀번호입력으로는 안전하지 않으니 액세스 토큰을 발급 하여 해당 계정의 정보를 사용하게 하는데 일단 용어를 정리하고 가야한다. OAuth 에서는 용어를 아래와 같이 정의한다. client  -  개발자의 서버  resource owner - 사용자  resource server - 계정 정보 서버 (구글, 네이버, 카카오 등) authorize server - 계정 인증을 위한 서버  클라이언트는 resource server 에 사전 등록을 해야한다.  client ID, client secret, authorized redirect URIs 데이터가 일반적으로 필요하고 서비스에 따라 요구하는게 조금씩은 다르다고 한다. resuorce owner 가 server 로그인을 하면 해당 범위에 대한 확인이 다시 들어오면서 client 가 해당 범위에 토큰을 부여받는 형식으로 먼저 client id와 함께 넘어간다. 이후 authorization code 를 resource server가 resource owner 에게 전송되고  owner는 이것을 client에게 넘긴다. (이는 물론 사용자는 모르는 빠른 시간내로 이루어진다.) client는 이제 code와 client sercet을 resource server에 넘기고 이로서 최종적으로 token을 발급 받게 되는것이다.  이 token안에는 해당 사용자에 대한 고유 번호와 ...
거진 한달 만의 블로그 글 업데이트. 지난 한달은 주로 프론트 부분을 진행했기 때문에 알고리즘이나 코딩 관련해서 새로운걸 업뎃하기 좀 그랬다. 이번 주는 다시 알고리즘을 진행했고, 월말평가에는 알고리즘 응용부분 문제가 나온다고 하니 슬그머니 생각나는 블로그 현재는 DP 에 관해서 하고 있다. 동적 프로그래밍인데 대표적으로 피보나치 수열이 나오고, 탐색 부분도 있다. 플로이드 - 마샬 알고리즘을 배우면서 저번에 자세히 이해하지 못했던, 다른 알고리즘에 대해서 대충 이해했다. 나는 알고리즘 잘하기에는 그른건가 ,,, 너무 어렵다 진짜. 날이 조금 차가워 지면서 살만한 날씨가 되었는데, 한여름에는 안보였던 모기가 진짜 왜 이리 자주 보이는지 모르겠다. 특히 왜 방안에 있는건지... 잡을 때마다 피가 터지는데 한두 군데가 아닌거 같다. 민족의 대명절 추석을 코앞에 두고 있다. 이시기에도 역병이 창궐하고 있다니, 일단 오래 쉬는 것에 대만족 하고 잠을 많이 자는 것이 목표. 월말평가 - 메모이제이션 표완성하기

git-receive-pack not permitted on 깃 허브 로그인 관련 문제

이미지
 개인적인 알고리즘 연습관련으로 커밋푸쉬를 하고 있는 레파지터리에서 며칠전까지만 해도 잘되던 푸쉬가 갑자기 안되는 이슈가 발생했다.  대략 이와 같은 경고가 뜨면서 발생하는 것이고 이는 깃허브측에서 아이디/비밀번호 인증방식을 더이상 지원하지 않으면서 발생하는 이슈라고 한다.  이제 토큰 인증방식을 사용해야 한다고 하니 이에 대해 간략히 정리해 보려고 한다.  토큰 생성을 위해 깃허브에 로그인 후 settings 를 클릭 해준다. Developer settings 를 클릭하고 나서 Personal access tokens 에 들어와주면 새 토큰을 생성할 수 있는 화면이 나온다.  보안을 위해 한번 더 비밀번호를 입력 해준 다음  토큰에 대한 설정 창에서 note에는 이름 아래 만료일에는 날짜를 지정해 줄 수 있다.  no expiration 도 설정할 수 있으나 만료날짜를 지정해주길 강력히 권고해서 오늘로부터 1년으로 지정해주었다. 각종 권한들을 지정해줄 수 있는데, 뭐가 뭔지는 잘 모르겠고, 그냥 커밋 풀/푸쉬만 해줄 거면 repo에 대한것만 지정해주면 된다고 한다. 마지막 이 화면에서 끄지 않고 바로 키값을 복사해두어야 한다. 이후에는 다시 보여 주지 않고 해당 토큰이 가진 설정과 삭제 선택버튼 정도만 보여주니까 해당 키값을 일단 복사해둔다. 마지막 평소 이클립스와 깃 연동때와 마찬가지로 다시 URI를 복사해서 간 다음 비밀번호 자리에 해당 토큰을 붙여 넣으면 완성 된다. 되던 깃허브 연동이 안되는 경우라 조금 헤맬 수 있지만, 인터넷에 이미 설명이 많아서 그대로 따라가면 되는 이슈 였다. 
 간만의 주저리주저리 blogger의 제한된 기능으로 좀 답답했는데, HTML을 조작하여 그나마 몇몇 기능을 추가할 수 있다는걸 알게되었다. 일례로 그간 코드를 스크린샷 찍어서 올려서 매번 크기가 뒤죽박죽이었지만 이 전 포스팅을 기준으로 획일화된 코드를 올릴 수 있게 되었다. 처음부터 노션쓸걸 .... 싸피의 과목평가는 기사문제같은 느낌이었다. 하지만 약간 더 세분화해서 실제 코딩에 쓸 수 있는 지식이었지만, 월말평가처럼 직접 코드를 짜는 게 아닌 4지선다, 단답, 서술형 등으로 구성된 문제는 간만에 푸는 느낌이라 오히려 새로웠다. 오늘은 말복이고, 저번 주말은 입추였다. 올림픽은 끝났고 시간은 왜 이렇게 빠른 지.... 나는 무슨일을 해야하나.  내 깃허브에 최대한 잔디를 심어보려 했지만 보통 알고리즘 문제는 해당 문제를 해결하고 이쁜 코드를 올리는 편이지, 지속해서 커밋하지 않기 때문에 좀처럼 잔디색은 엹은 상태로 남아있다. 프로젝트를 나가면 아주 푸르른 잔디를 심어야지 ...   BFS 너비 탐색  은 같은 높이의 노드들을 우선 전부 탐색 후  높이를 올려서 탐색하는것으로 선입선출인 큐에 데이터를 저장해서 전체 탐색 진행  이차원 배열의 깊은 복사  결국 for 문 돌리면서 각각 배열을 Arrays.copyOf(대상, 대상길이); 해주어야 한다. 순열 , 조합, 부분집합 너무 중요 !!! 
다차원배열의 알고리즘  하루에 알고리즘만 3~4개씩 푸는 수업이 계속 되고 있다. 처음 접했던 Bufferedreader 와 Stringtokenizer가 어느정도 익숙해졌고, 2차원 배열에 데이터를 넣고 빼는 것에 숙달되어서 처음은 데이터를 입력받는 곳에서 엄청난 오류들이 나왔지만 지금은 일단 기본 틀 잡기는 능숙하게 한다.  Character.getNumericValue(ch) 를 사용한 char -> int String.valueOf와 Integer.parseInt에는 익숙하지만 알고리즘을 풀다보면 char형 데이터를 쓸일이 은근 있다. 이때 char형은 원래 int와 데이터 매칭이 되는데 이게 아스키 코드다 보니 그대로 쓸 수는 없다. 이때 이용하는 메서드. Stringtokenizer에 대한 고찰  보통 bufferedReader와 더불어 string으로 나눠주는거에 사용하는데 이 때 readLine에서 라인을 바꾸지 않고 계속 쓰는경우를 좀 고려해봐야한다. 몇몇 문제에서는 코드가 너무 복잡해지는 단점이 있다. 백준 1158 번 문제 요세푸스 순열 중 순열을 원형으로 만들어서 조작을 해야하는 문제가 있었다. 문제 자체의 난이도는 높지않아서 나는 보고 arraylist로 해결했으나 ... 1 2 3 4 5 6 7 8 9 while ( people . size () != 0 ) { if ( index == people . size ()) index = 0 ; for ( int i = 0 ; i < k - 1 ; i ++) { index ++; if ( index == people . size ()) index = 0 ; } sb . append ( people . get ( index )+ ", " ); people . remove ( index ); } 정석적인 방법은 큐를 이용하여 조작하...
이미지
Scanner 와 BufferedReader    
이미지
알고리즘 기본: 재귀  실제 프로그래밍에서는 딱히 안쓰이는 것 같지만, 알고리즘을 위해서는 꼭 알아야 한다는 재귀함수 사용법! 속도면에서 딱히 좋지 않지만 구현이 간단하고 보기에 편하다고 하다. 근데 내 생각은 알고리즘은 무조건 속도 아닌가요 ...? 알 수 없는 알고리즘의 세계... 두가지의 알고리즘 문제를 풀었다.  원재의 메모리 복구 (SW Expert) 반복문으로 간단히 구현을 했다. 쉽게 말해 일정 길이의 숫자가 주어질 때 0에서 1로 또는 1에서 0으로 상태변화가 될 때마다 카운트 해서 반환하는 알고리즘 구현이었는데, 두가지 상태밖에 존재하지 않다 보니 현재 상태를 판단해서 간단하게 구현하였다.  재귀함수가 뭔가요 ( 백준 17478 ) 아니 백준 이놈의 사이트는 대체 어떻게 만들어야 정답 인정이 되는 지 모르겠다. 개인적으로 프로그래머스나 삼성 엑스터트아카데미가 훨훨훨씬 제출의 편의성이나 문제의 가독성이 높은 듯 하다... 문제는 재귀함수를 통해 문장을 반복 출력하는 문제였는데, 나는 어려워서 '-'가 늘어나는 부분과 줄어드는 부분을 구분 지어서 두 가지의 함수로 구현했다. 문제는 그나마 이렇게 구현하니까 시간 안에 이클립스에서는 원하는 결과 값이 도출됐는데... 백준 사이트에서는 뭔 짓을 해도 나오는 "틀렸습니다!" 이거 진짜 화딱지 난다...  (수정...)  나는 언더바를 "___" 세개만 입력했었는데 문제를 다시보니 "____" 네개였다. 이를 수정하니까 바로 정답이라는 백준. 다음부터는 문제를 제대로 살펴보자.
이미지
예외처리 자바에서 예외처리라고 하면 보통 두가지 방법이 거론된다. try-catch 문으로 감싸주는 방식과 throws 로 던져주는 방식인데, 이번에 새로 배운 사실은 엄밀히 말하자면 throws 는 예외처리가 아니다. 던져주는 곳 중 가장 마지막 장소에서는 어찌됐든 try-catch 문으로 해결해 주어야 하며 이게 이루어 지지 않으면 프로그램이 종료돼 버리는 그런 문제가 발생하는 것. 그래서 예외처리에 좀 더 신중해야 하는 것 같다. 또 throws 는 클래스가 아닌 메서드의 매개변수 뒤에만 던질 수 있다.  exception 가 모든 예외클래스 중 상위클래스는 맞지만 그 위에는 throwable 이 있고 같은 라인에는 error도 있다. error는 메모리 파괴와도 같은 코드로 고칠 수 없는 문제 들을 담고 있다. finally 는 예외발생과 상관없이 무조건 실행되는 문장이며 보통 공유 객체 반환을 위해 사용됨. 이는 정말 무조건 실행인데 return 이 상위에 존재하더라도 실행!!!!  이와 같을 경우 catch 문에 걸려서 return 된다면 try 문장 바깥의 print 문은 실행 안될 수 있지만, finally는 return 아래임에도 불구하고 실행된다. RunTimeException 같은 경우는 validation check로 미리 예방할 수 있다. 이게 뭐냐면 흔히 하는 nullcheck나 데이터 유효여부 체크를 말하는 것. try-catch문을 처음 봤을 때 조건문과 비슷하다는 생각이 들었는데, 실제로 비슷하게 사용할 수도 있다는 걸 알게 되었다.   자바 파일 읽어 들이기  진짜 너무 어려웠다. 기본적으로 파일을 읽고 쓰는 방식에는 stream 과 reader(writer) 방식 두가지가 있는데, 개행을 구분지어서 읽는 방식과 전체내용을 한번에 읽는 방식으로 나뉜다고 보면 된다. 용어적으로 헷갈릴 수 있는것이 위에서 언급한 stream은 메서드형식이고 자바에서 데이터를 주고 받을 때 사용되는 stre...
이미지
월말평가, 알고리즘  어제 월말 평가를 처음 진행하며, 1번부터 4번까지는 단순 구현 문제였지만 5번같은 경우는 알고리즘 문제로 나왔다. 카톡방에서 의견교류를 한 결과 이게 백준 2615번 문제 "오목" 이라는걸 알았는데... 역시 내가 급하게 풀었던 답은 다수의 문제가 있었다. 우선, 육목은 승리조건이 아니다. 해당 조건을 고려 하지 않아서 6시 종례 이후 해당 조건을 고려한 리팩토링을 해봤으나 백준 채점 결과 틀린걸로 나왔다.  (별개로 백준을 처음 이용해 봤는데, 모든 클래스를 Main 으로 설정하는것이나, 기본 형식이 제공 되지 않는 것, 복사 붙여넣기가 자유로운것이 프로그래머스와 많이 다른 모습을 보인것 같다.)  Git contributions 또 어제 알게된 것은 깃허브 잔디 심는것에 대한 설정인데, 이번에 매일 숙제가 제공되어서 이것을 내 깃에도 올리며 꾸준히 커밋푸쉬를 진행하려고 노력중이다. 저번 주 내내 했으나 어제 확인 시에 그냥 회색으로 있는걸 확인했는데, 이게 나의 로컬 깃에 저장된 user.email이 깃 email과 일치하지 않아서 발생하는 문제였다. 깃 브랜치 관리를 위해 설치한 깃배쉬를 통해 해당 config를 확인하고, 수정해서 이제 푸르른 잔디를 관리할 준비는 끝났다고 볼 수 있다.  싱글톤 패턴 마지막으로 오늘 오전에 배운 내용이 인터페이스를 이용한 싱글톤 객체 생성 부분인데 그간 상당히 깊은 생각없이 사용해 왔다. 와중 실습 문제중에 6번 간단한 구현을 해결하려 하는데 너무 어려운 것이었다. private static한 생성자, public한 호출 가장 핵심인 한문장이라고 봤고, 나도 그렇게 생각한다. 객체를 단한개만 만들어서 해당 생성에 대한 부분은 숨겨두지만, 사용하기 위해 public 하게 호출이 가능하게 만든다. 이게 메모리적으로 어떤 이점이 있는 지에 대해서도 더 확고하게 배운 것 같다. 위와 같은 방법으로 싱글톤 객체를 생성해주고 getInstance() 메서드를 통해 해당 객체...
이미지
부모를 참조한 자식클래스 객체 생성  사실 이는 굉장히 기초적인 부분이지만 교수님의 말씀대로  1) 자식 = new 부모      2) 부모 = new 자식  이 두가지에 대해서 꽤나 헷갈렸던 부분이라 배운김에 정리하고 넘어가려한다.  일단 2번 부-자 부분이 에러가 나지 않는 상황이고, 이는 제대로 객체 생성이 이루어진다. 이 때 최상위 클래스인 Object 는 기본적으로 참조, 이후 필드나 메서드는 부모의 것으로 사용되어 진다. 딱 하나 예외상황이 있는데, 자식이 부모의 메서드를 오버라이딩 한 상황이라면 해당 객체를 이용해서 p2.print(); 이런식으로 메서드 호출을 했을 때 자식메서드가 사용되어진다. 이는 오직 오버라이딩된 메서드에만 적용되는 상황이라고 한다. 만약 parent의 su라는 필드가 int = 300 이고, child의 같은 이름인 su라는 필드가 int = 300라고 하자. 이 때 p2.su 의 value는 부모의 것인 300을 가리킨다. 만약 부모 = new 자식 의 모양으로 객체를 생성했을 때에도 자식의 필드, 메서드를 사용하고 싶다면, 새로이 자식 객체를 생성하며 형변환 해주는게 필요하다.      Parent p = new Child();     Child c = (Child)p;      그런데 굳이 이렇게까지 할거 있나 ...  p.s. 자바에서의 클래스 간의 관계에서는 오직 직계(부모, 자식, 자손) 관계만 존재한다. 수직적으로만 존재하고 수평적인(형제)관계는 없다고 한다. -> 이건 알고있었는데 반전은 프론트 언어에서는 sibling 관계가 있다고 한다. 너무 신기하고.

0719 첫째날부터 왕창 배운다.

이미지
 반복문 제어  평소에는 지양하지만 알고리즘 문제를 해결하다 보면 이중 반복문을 사용하게 되는 상황이 자주 있다. 이 때 특정 조건에 따라 continue와 break를 적용 시키는 상황이 있는데, 항상 가장 안쪽의 반복문에 대해서만 제어가 되는거라 임의의 flag변수를 두어서 이를 통해 불편하게 제어하곤 했다. 오늘 싸피 수업에서 자바 기초적인 부분을 듣고 있는데 해당 질문이 문제에 있어서 생각하고 있었는데 댓글로 라벨링이 올라는것이었다. 교수님도 당연하게 라벨링을 사용하면 되죠? 라고 하시고 넘어갔는데, 이를 처음 들은 나에게는 신세계... 이후 이에 대해 조금 찾아보고 정리 하려고 이 글을 작성하기 시작했다.  라벨링   for이나 while 같은 반복문 앞에 '이름 :' 의 형태로 라벨을 남겨주면 내부에서 break, continue 와 같은 제어문을 사용할 때 해당 라벨을 남겨 줌으로써 쉽게 위치를 지정해 줄 수 있다. 사용법도 내용도 직관적이고 간단해서 지금 알아두면 알고리즘 해결에서 꽤나 유용하게 쓸것 같은 느낌이다. 이렇게 기초부터 새로배우면 하루에 하나는 얻어 가는 느낌이라 나쁘지 않은 수업이 될 수 있다.  자바 입력 보통 자바에서 출력을 사용할때는 System.out 객체를 사용하곤 한다. 물론 콘솔에 직접 찍어보는건 점점 지양해야 한다 하지만 기초 자바를 배울 때나 잠깐 콘솔에 찍어볼때는 유용하게 쓰이는 데, 이후 입력에 관한 부분은 점점 아에 사용을 안하기 때문에 종류가 더 많음에도 불구하고 대충하고 넘어갔던 기억이 있다.  출력이 저런 객체라면 입력은 기본적으로 System.in 이라는 객체다. 해당 객체의 read() 메서드를 사용한다는데, 나는 이것또한 이번에 처음 들었다. 처음부터 Sacanner 객체를 통해 입력을 받는 방법을 배웠는데, 이때도 System.in 이 당연히 들어간다. 차이점은 아래와 같다. System.in.read();  아스키코드 값을 리턴하기 때문...

ssafy 6기 지원 후기

이미지
1기가 나왔을 때부터  간간이  소식을 접했던  ssafy ( Samsung  software academy for youth) 이번에는 내가 직접 지원부터 온라인 테스트, 면접까지 경험해 보았다. 우선 지원 시 자소서 문항은 매년  비슷한 것  같고, 난이도도 무난하다. 다만 해당 자소서를 바탕으로 1분 자기소개, 인터뷰 예상질문 등  여러 가지를  작성할 계획이라서 자소서를 신중히  작성하는 게  중요하다. 이미 작성한 후라면  어느 부분을  보완하여  인터뷰 때   보여줄  지  정하는 게   우선순위다 . 수리/추리 논리 - 이건 진짜 간단한 수학문제였다. 주로 금액, 거리, 확률과도 같은 그냥 그런 문제들이 나오는데 온라인  테스트 때  옆에 펜과 종이만 잘  갖춰  놓으면 문제에 잘 설명돼  있어서  풀면 된다. CT(Computational Thinking) 문제 - 이건  코테를  연습한 사람이면 뭔가 익숙하면서  낯선 게  그런 알고리즘 문제에서 주는 예시들을 손으로 푸는 느낌이다. 다만 "과정"이 아닌 "답"만 적으면 된다. 으레 그렇듯 규칙성이 있고 이것만 발견하면 손으로 빨리 풀면 된다. 고난도의 문제는  아니지만, 온라인  30분  일 때에도  후의 오프라인  12분일 때도  시간이  꽤  부족했다. 다만 합격자들의 이야기를 들어보면 꼭 다 맞춰야  하는 건  아니니 최대한  푸는 걸로  만족하면 된다. 인터뷰 - 가장  걱정됐었고 , 유일하게 연습을 한 과정이다. 방식이 매년 조금씩 바뀌고 내용유출이 금지인지라 다들  건너  들은 이야기를  토대로 연습했다 ....

쿼리튜닝과 인덱스

이미지
 약 한달 전 조회 조건을 추가해달라는 요청이 왔고 대수롭지 않게 추가했던 적이 있다. LEFT JOIN tb_review re ON re.care_no = ca.care_no AND re.delete_yn = 'N' AND re.reg_type = '0' 이게 전체 조회량을 늘리고 늘려서 화면을 다운시킨다는 것을 알게 되었는데, 일반적으로는 join에 and조건을 걸으면 이런 현상이 일어난다고 한다. 그래서 사수님은 이걸 1차적으로 분리해서 작성했고, 시간이 12초에서 1초 내로 줄어드는 효과를 보았다.  LEFT JOIN tb_review re ON re.care_no = ca.care_no  WHERE 1=1  AND re.delete_yn = 'N' AND re.reg_type = '0' 아니 근데 이건 다시 확인하니까 조회 대상이 바뀌는 변화인 것. 전과 같은 결과를 위해 다시 쿼리를 돌려야 했고 EXPLAIN 명령어로 해당 쿼리를 조사해보자 review 테이블에서 care_no를 인덱싱 없이 ALL로 조회하고 있음이 나왔다. 여기에 인덱스를 추가해줘서 결국 같은 결과를 1/10 이하의 시간으로 조회가 가능케 했는데 이에 너무 신기해서 인덱스에 대해 살짝 정리해볼까 한다. 

알고리즘 연습[2]

이미지
 해시 > 위장 스파이가 여러 종류의 옷을 가지고 총 몇가지의 위장을 할 수 있냐는 문제다. 이건 수학문제중에 경우의 수에서 자주 볼 수 있는 문제인데 중간까지 그걸 파악못하고 혼란을 겪었다.  map 에 중복되는 요소들을 넣기 위해 이전 테스트에서 배운 getOrDefault 메소드를 사용했고, entrySet으로 모든 요소들을 가져와서 경우의 수 공식에 대입했다.  스택/큐 > 다리를 지나는 트럭 이 문제는 시간이 정말 오래걸렸다.. 실제 테스트에 나왔으면 이거 하나 풀고 다른거는 건들지도 못하거나 이문제를 건들지도 못하거나 ... 생각 할 요소가 많은게 처음에는 가장 효율 적인 시간을 구해야 하는 지 알았다. 예를 들어 8, 3, 1, 7 무게 10 이렇게 있으면 8다음 3은 들어갈 수 없으니 뒤에 들어갈 수 있는 1을 찾아서 들어가서 시간을 단축내는 ? 이렇게 풀다보니 너무 어려워져서 다시금 그냥 주어진 순서만 지키면 된다는걸 알게 되었다. 해서 나온게 아래의 경우 while 조건에서 요구하는 sum과 다리위에 들어가기 위한 sum이 달라서 afterSum/beforeSum으로 나눴는데, 이걸 구하는 과정이 너무 반복이라 효율성에서 실패 하였다. 마지막 추가 되는 상황에서만 sum에 해당 요소를 더해주니 간신히 통과...!