목록공부 (77)
빠에야는 개발중
단순 연결리스트에 대한 개념이 부족해서 전에는 풀지 못했던 문제였고, 공부를 해보았다. 한쪽 방향으로만 연결되어있다는 특징을 최대한 활용해야하는 문제이다. 일반적인 배열이나 ArrayList라면 인덱스로 간단하게 바꿀 수 있다. 이중 연결리스트도 오버헤드가 좀 들지만 비교적 간단하게 가능하다. 하지만 단순 연결리스트는 생각을 좀 해야하는데, 처음에 생각했던 방법은 모든 요소를 스택에 집어넣어서 하나씩 빼며 리스트를 새로 생성하는 것이었다. 하지만 이 방법은 리스트의 크기만큼의 메모리가 필요하기 때문에 규모가 커지면 효율적이지 못하다. 시간적으로도 선형 탐색을 두번해야한다는 점에서 그 단점을 알 수 있다. 그래서 추가메모리를 최대한 줄이고 탐색 시간도 줄이기 위해서는 다음과 같이 하면 된다. 핵심은 새로운..
어떤 클래스의 객체를 생성하여 초기화를 해주고 싶다.1234567891011121314151617181920212223242526272829303132333435363738394041public class PersonInfo { private String name; private Integer age; private String favoriteColor; private String favoriteAnimal; private Integer favoriteNumber; public PersonInfo(String name, Integer age, String favoriteColor, String favoriteAnimal, Integer favoriteNumber){ this.name = name; thi..
똑같이 http가 들어간 이름들이지만 그 목적은 다르다고 할 수 있다. 그렇다면 서로 다른 두 가지의 주제를 왜 한 게시물에 쓰느냐… 그건 http/2가 https를 보조하는 역할을 어느 정도 해주기 때문이다. 결코 https 내용이 짧아서 그런게 아니다.(강조) https https는 http의 취약한 보안을 극복하기 위하여 등장한 프로토콜이다. 간단히 말해서 데이터를 암호화 하자는 것인데, 기존의 http는 통신 정보(메소드, url, 버전 등)를 모두 평문으로 주고 받는다. 그렇기 때문에 해킹에 매우 매우 취약하다고 할 수 있다. 이것을 SSL/TLS 프로토콜로 암호화 해줌으로써 향상된 보안을 꾀하는 것이 https이다. 당장에 s의 뜻이 secure에서 오는 것만 봐도 알 수 있다. https는 ..
SSL 인증서는 클라이언트-서버 간 안전한 통신을 위해 사용 되는 기술이다. 그 맥락은 전자 서명과 비슷한데, 몇 가지 개념이 추가적으로 들어간다. 공개키와 대칭키 암호화/복호화의 방법에는 공개키(비대칭키) 방식과 대칭키 방식이 있다. 공개키 방식은 암호화, 복호화 하는 키가 서로 다르기 때문에 중간 과정에서의 탈취의 염려가 적다. 그래서 일반적인 전자 서명에서 많이 사용되는 기법이다. 반면에 대칭키는 하나의 키로 암호화와 복호화를 모두 처리한다. 그렇기 때문에 중간에 키가 탈취되면 안전성이 전혀 없어진다. 두 가지를 모두 사용하자 이렇게만 보면 공개키를 사용하지 대칭키를 왜 사용하냐 하겠지만 공개키에는 사실 큰 단점이 있었으니 그것은 바로 성능이다. 서로 다른 키로 암호화와 복호화를 하는 만큼 처리 시..
목적 http는 connectionless하고 stateless한 프로토콜이다. 매 요청마다 연결을 맺고 끊으며 클라이언트와 서버 간의 상태를 공유하지 않는다. 하지만 이런 http의 특징은 사용성에 있어서 불편함을 초래하는데, 예를 들어 쇼핑몰 따위의 장바구니 서비스는 상태 유지가 안되면 존재 자체가 불가능하다. 그렇기 때문에 서로의 연결을 유지하는 장치가 필요한데, 그것이 쿠키와 세션이다. 그렇다면 둘은 어떤 차이가 있을까? 쿠키 쿠키는 클라이언트, 즉 브라우저에 파일 형태로 정보를 저장하는 방법이다. 이름의 유래는 헨젤과 그레텔 동화에서 집을 찾기 위해 뿌렸던 쿠키에서 가져왔다.(결국 다 먹혀버리지만) 브라우저는 최초에 서버와의 연결이 성공하면 상태 정보를 쿠키로 저장하고 다음 요청부터 reques..
String 일반적으로 자주 사용되는 String은 불변 객체로서 그 내용이 바뀌지 않고 +, concat 등 문자열 연결을 하게 되면 새로운 객체를 생성하여 연결된 문자열을 할당하고 기존 문자열은 가비지 컬렉터에 의해 회수된다. 그렇기 때문에 여러 입력을 받았을 때 성능 이유가 발생한다. StringBuffer, StringBuilder StringBuffer와 StringBuilder는 불변 객체인 String의 한계를 극복하기 위해 등장한 가변 객체이다. 즉 문자열을 추가하면 기존 객체에 버퍼 크기를 늘려 문자열을 더하는 연산만 하는 것이다. 이로써 성능 이슈를 해결할 수 있게 된다. 그렇다면 두 클래스의 차이는 무엇일까? 그것은 “동기화 여부”이다. StringBuffer는 synchronized..
abstract class(이하 추상 클래스)와 interface(이하 인터페이스)는 하위 클래스(정확히는 다르다.)가 미리 선언된 메소드를 오버라이딩 해서 사용할 수 있도록 하는 도구라는 공통점이 있다. 하지만 이 둘은 차이점이 존재한다. 오히려 차이점이 없으면 두 가지가 존재할 이유가 없다. 그 이유를 외적인 차이와 내적인 차이로 알아보자. 외적인 차이 추상 클래스는 추상 메소드 이외에도 일반 메소드를 선언하고 정의할 수 있다. 그리고 하위 클래스에서 이 클래스를 상속(extends)하여 추상 메소드를 오버라이딩 하여 사용할 수 있다. 반면 인터페이스는 일반 메소드를 정의할 수 없고, 하위 클래스가 인터페이스를 구현(implements)해서 오버라이딩을 통한 메소드 정의를 한다. 인터페이스에서는 메소..
물건 값보다 많은 돈을 낼 경우 거스름돈을 돌려주게 됩니다. 거스름돈은 한 금액의 돈으로 줄 수도 있지만, 여러 금액의 동전을 섞어 거슬러 줄 수 있습니다.거스름돈이 N원일 때, 1원, 2원, 5원 동전이 있다면 몇 가지 방법으로 돈을 거슬러 줄 수 있을까요? change 함수를 통해 경우의 수를 반환해주는 함수를 만들어 보세요. K에는 사용할 수 있는 동전의 종류가 들어 있습니다.예를 들어, N = 5이고 K = [1, 2, 5]이면 1원, 2원, 5원 동전을 가지고 5원을 맞추는 경우의 수를 찾으면 됩니다.1원 5개1원 3개, 2원 1개1원 1개, 2원 2개5원 1개이렇게 총 4가지 경우가 있으면, 4를 리턴해 주면 됩니다. 각각의 순서가 의미가 없기 때문에 bfs로는 풀 수 없을 것 같았고 dp를 ..
1x1 정사각형 2개가 붙어 있는 타일이 있습니다. 이 타일을 이용하여 총 3xN 의 보드판을 채우려고 합니다. 타일은 가로, 세로 두 가지 방향으로 배치할 수 있습니다.보드판의 길이 N이 주어질 때, 3xN을 타일로 채울 수 있는 경우의 수를 반환하는 tiling 함수를 완성하세요.단, 리턴하는 숫자가 매우 커질 수도 있으므로 숫자가 5자리를 넘어간다면 맨 끝자리 5자리만 리턴하세요.예를 들어 N = 2일 경우 3을 반환해 주면 됩니다. 하지만 만약 답이 123456789라면 56789만 반환해주면 됩니다. 리턴하는 숫자의 앞자리가 0일 경우 0을 제외한 숫자를 리턴하세요. 리턴타입은 정수형이어야 합니다.참고: 이 문제는 2 x n 타일링 문제와 유사합니다. 문제이해가 어려우면 2 x n 타일링 문제를..
과자를 좋아하는 동우는 책상 위에 일렬로 놓아진 과자를 발견하였습니다. 과자에는 맛을 숫자로 평가한 종이가 붙어 있습니다. 동우는 맨 왼쪽부터 순서대로 과자를 먹기로 하였습니다. 동우는 먹을 과자를 고를 때 이전에 먹은 과자보다 맛이 더 좋은 과자만 먹습니다.제일 처음에 맛이 3인 과자를 먹었다면, 다음에는 4보다 작은 맛의 과자는 먹지 않습니다.책상위에 놓인 과자의 맛이 입력되면, 동우가 최대 과자를 몇 개를 먹을 수 있는지 반환해주는 eatCookie 함수를 완성하세요.예를 들어 [1, 4, 2, 6, 3, 4, 1, 5] 가 입력된다면 동우는 1, 3, 5, 6, 8번째 과자(각각의 맛은 1, 2, 3, 4, 5)를 골라 총 5개를 먹을 수 있고, 5개보다 더 많이 먹을 수 있는 방법은 없으므로 5..