프로그래머스 알고리즘 - 위장☞ 프로그래머스 위장 문제 링크 입출력 예제를 자세히 보게 되면 출력은 경우의 수가 몇개인지 반환하면 되는 문제이므로 실제로 어떤 조합으로 꾸려야 하는지는 중요하지 않습니다. 같은 종류의 의상이 몇개인지 파악하고 의상 종류의 갯수를 모두 곱하면 경우의 수를 구할 수 있습니다. 다만, 적어도 한가지 의상은 입어야 하므로 아무것도 입지 않은 경우 한가지를 제외 합니다. 예를들어 첫번째 입력 예제 같은 경우, eyewear : blue_sunglasses (1가지)headgear : yellow_hat, green_turban (2가지)총 3가지 의상이 있습니다만, 입지 않은 경우의 수도 고려 해야 하므로,eyewear : 2가지headgear : 3가지라고 판단합니다. 2x3은 ..
프로그래머스 알고리즘 - 완주하지 못한 선수☞ 프로그래머스 완주하지 못한 선수 문제 링크 문제를 풀기위한 로직은 여러가지가 존재할 것이고, 많이 어렵진 않았습니다. 다만 문제에서 효율성 검사도 진행하기 때문에 효율성에 대한 고민이 없다면은 시간 초과가 나오게 됩니다. (실제로 가벼운 마음으로 무식하게 풀었더니 시간 초과가 나왔습니다.) 힌트는 문제의 분류에 있습니다. 바로 '해시'를 이용하는 것인데요. 자바에서의 HashMap만 사용하여도 검색시간이 많이 줄어서 바로 통과 할 수 있습니다. 문제가 조금 모호하긴 합니다. 동명이인인 선수가 존재하나 완주하지 못한 선수는 오직 한명이기 때문에 동명이인인 선수가 몇명인지만 확인하면 됩니다. (이럴꺼면 문제 이름이 '완주하지 못한 선수'보다는 '마지막으로 들어온..
해시 (Hash) 해시란 데이터를 다루는 기법 중에 하나로 검색과 저장이 아주 빠르게 진행됩니다! 아주 빠르게 진행될 수 있는 이유는 데이터를 검색할 때 사용할 key와 실제 데이터의 값이 (value가) 한 쌍으로 존재하고, key값이 배열의 인덱스로 변환되기 때문에 검색과 저장의 평균적인 시간 복잡도가 O(1)에 수렴하게 됩니다. 해시 함수, 해시 알고리즘, 해시코드? 데이터의 key값을 배열의 인덱스인 정수로 변환하기 위해서는 일련의 과정이 필요합니다. 예를들어 데이터를 문자열로 받게 되었을 때 문자 한글자 한글자의 아스키 코드 값을 더하는 과정으로 문자열을 정수 값으로 변환할 수 있습니다. (만약, hello 라는 문자열을 정수형 key 값으로 바꾼다면, h + e + l + l + o -> 10..
케빈 베이컨의 6단계 법칙 ☞ 문제링크최단 경로 문제로 BFS탐색을 이용해서 풀어야 하는 문제였습니다. 문제의 예시로 그래프를 만들면 아래와 같습니다. 문제 풀이 (java) 그래프 탐색에서의 노드를 케빈 베이컨 게임의 참가한 유저로 치환하여 클래스를 만들어 줍니다. class User { private int index; private List friends; private boolean checked; . . . } 일반 노드와 다른 점은 step이라는 필드가 선언되어 있습니다. 이건 케빈 베이컨 점수를 계산하기 위해서 선언된 필드 입니다. 자세한 사항은 아래에서 설명 하겠습니다. class User { private int index; private List friends; private boole..
JPA Domain 셀프 참조 (셀프 조인) 구현하기 예제로 사용한 Domain은 책의 목차(BookContent)로 하위 목차(subBookContents)를 여러개 참조하고 있고, 상위 목차(superBookContent)를 0개~1개 가질 수 있습니다. @Entity public class BookContent { . . . @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "super_book_content_id") private BookContent superBookContent; @OneToMany(mappedBy = "superBookContent", cascade = CascadeType.ALL) private List subBookConten..
Spring Security 로그인하여 세션에 정보를 저장하고, 유저 권한에 따른 URI 접근까지 Spring Security를 이용하면 간편하게 구현 할 수있다.. 라고 배웠지만, 공부하기가 너무 어렵다. 이런저런 예제를 따라해보기도 했고, Spring Boot와 Spring의 시큐리티 설정이 얼마나 다른지도 몰라 예제를 찾아보는 것도 힘들었다. 2일간 삽질하여 얼추 원하는 방향으로 구현 할 수 있었다. (막상 완성된 예제를 보니 아주 어렵지는 않았지만 삽질의 주된 원인은 어떤 곳이 문제인지 알 수가 없었기 때문이었다.) 시큐리티는 개발하면서 지속적으로 공부를 해봐야 정교하게 구현 할 수 있을 것 같다. 현재까지 구현한 시큐리티는 아래와 같다. WebSecurityConfigureAdapter WebS..
타임리프 Thymeleaf 이전에 게시판 프로젝트를 하면서 JSP를 주로 써왔지만, 요즘엔 JSP보다는 다른 템플릿 엔진들을 더 많이 쓴다는 말에 그중에 하나인 타임리프를 사용해보기로 했다. 사실 구현상에서 JSP에 불편함을 느낀 것은 아니었지만, 타임리프를 적용해보니 만족도가 꽤 높았다. 일단 HTML 사이에 JSP문법들이 생기는지 않아 HTML 태그가 더럽혀 지지 않고 훨씬 깔끔했다. 초기에 적응하는 시간만 지난다면 가독성도 높아졌다. 먼저 디자인 없이 기능상의 뷰를 구현해보고, 이후에 CSS를 적용할 때 이점은 다시 한번 느낄 수 있을 것 같다. //타임리프를 이용하여서 구현한 for문 - 별도의 태그선언 없이도 기존 태그 안에 속성처럼 작성이 가능하다. 삭제 AJAX 구현을 위한 fetch API..
프로그래머스 알고리즘 - 단어변환 ☞ 단어변환 문제 링크 문제의 핵심은 각 word를 노드로 두고, 변환 가능한 word간에는 간선(edge)로 연결해둔 다음에 그래프 탐색을 진행하면 어렵지 않은 문제 였습니다.☞ 그래프(Graph) DFS 탐색 구현하기 문제풀이 코드의 전체적인 틀은 그래프 탐색을 응용합니다. class Graph { private Word[] words; . . . } 입력값의 문자를 이용한 만든 클래스 Word를 그래프 탐색의 노드(Node)로 치환합니다. class Word { private String name; private List changeable; //인접 노드(Word)들을 저장하는 리스트 private boolean visited; . . . } 주어진 word와 기..