kimtaesoo99의 등록된 링크

키자드에 등록된 총 232개의 포스트를 확인하실 수 있습니다.

Tistory

[백준] 11052번 카드 구매하기(java)

https://www.acmicpc.net/problem/11052 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000) www.acmicpc.net 핵심 이 문제는 DP를 사용하여 쉽게 풀 수 있다. 테이블 정의 - DP [i] = 카드가 i개일 때 지불해야 하는 최대 금액 점화식 찾기 카드가 1개 들어있는 카드팩을 구매하고 카드 i-1개를 구입한다. 카드가 2개 들어있는 카드팩을 구매하고 카드 i-2개를 구입한다. 카드가 3개 들어있는 카드팩을 구매하고 카드 i-3개를 구입한다. 정답 코드 import java.util.Scanner; class ..

Tistory

[프로젝트] 커뮤니티 REST API 서버만들기 #9 카테고리 API 만들기

이번에는 계층형 카테고리를 추가하였다. 예를 들어 현재 내 티스토리 블로그와 같은 모양을 생각하고 만들었다. 고민한 점은 모든 게시글이 카테고리를 가지고 있는 것이 맞을까 라는 생각이었다. 따라서 굳이 카테고리에 넣지 않아도 되도록 만들었다. 중요한 부분위주로 설명하겠다. Category @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_id") private Long id; @Column(nullable = false) private String n..

Tistory

[프로그래머스] 이중우선순위큐

https://school.programmers.co.kr/learn/courses/30/lessons/42628 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는 문자열 배열이 들어오는데, 문자열의 첫 시작이 (I 숫자) 라면 큐에 숫자를 삽입하고, (D 1)이 들어오면 제일 큰 수를 삭제한다. (D -1) 일 경우 가장 작은 수를 삭제해야 한다. 핵심 큐에서 삭제순서를 정할 수 있지만, 중간에 바꿀 수는 없다. 따라서 우선순위 큐를 2개를 선언하여 사용하면 쉽게 풀 수 있다. 정답 코드 import java.util.Collections; im..

Tistory

[백준] 2589번 보물섬(java)

https://www.acmicpc.net/problem/2589 2589번: 보물섬 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 www.acmicpc.net 이 문제를 해석해 보면, 육지에서 갈 수 있는 끝지점과 끝지점사이의 거리를 구하는 것이다. 단 이동할 때, 가장 빠른 방법으로 간다 즉 BFS를 사용하라는 것이다. 바로 풀어보자. 정답 코드 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; class Main{ static int[][] result; stat..

Tistory

[프로그래머스] 가장 큰 수(java)

https://school.programmers.co.kr/learn/courses/30/lessons/42746 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는 정렬 문제이다. 입력으로 int 배열이 들어오는데, 이때 이 배열을 조합해서 가장 큰 수를 만들면 되는 간단한 문제이다. 핵심 정렬 조건을 재정의하여 우리가 원하는 조건으로 정렬시키는 것이 중요하다. 정답 코드 import java.util.Arrays; import java.util.Comparator; class Solution { public String solution(int[]..

Tistory

[프로그래머스] 소수 찾기(java)

https://school.programmers.co.kr/learn/courses/30/lessons/42839 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는 문자열이 들어오고 그 문자열을 가지고 만들 수 있는 소수의 수를 찾는 것이다. 예를 들어 "17" 이 들어오면 만들 수 있는 수는 1, 7, 17, 71이 되고 소수는 7, 17, 71이므로 3개이다. 핵심 우선 완전탐색(bfs)을 사용하여 가능한 모든 경우를 찾는다. 이후 소수를 판별해야 하는데 에라스토테네스의 체를 사용하면 된다. 에라스토테네스의 체를 예전에도 설명한 적이 있는데, ..

Tistory

[프로젝트] 커뮤니티 REST API 서버만들기 #7 Report API 만들기

이번에는 신고기능을 추가하였다. 유저 신고, 게시판 신고, 댓글 신고 총 3가지를 추가하였고, 누적신고가 일정수치를 넘을 시 해당 엔티티에 신고상태를 활성화시켜 주었다. 자세한 건 아래 코드를 보며 자세히 알아보자. 유저신고, 게시판 신고, 댓글 신고 모두 매우 유사한 형태이므로, 유저 신고를 중점으로 설명하겠다. 자세한 건 맨 아래 깃허브를 통해 코드를 확인할 수 있다. MemberReport @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity public class MemberReport extends BaseEntity { @Id @GeneratedValue(strategy = Generation..

Tistory

[백준] 12865번 평범한 배낭(java)

https://www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net 핵심 백트래킹을 사용하여 풀면 시간초과가 뜨게 된다. 따라서 이 문제는 DP를 사용해야 한다. 우선 물건 1개를 넣을 때 각 무게당 최대 가치는 어떻게 구할 수 있을까? 당연하게도 위와 같다. 1~5에는 6의 무게를 넣을 수 없기 때문이다. 저 자리에 0이 들어가는 것이 맞을까? 당연하게도 6이 들어가는 게 맞다. 3의 가치를 넣을..

Tistory

[프로젝트] 커뮤니티 REST API 서버만들기 #8 어드민 페이지 만들기

이번에는 어드민 페이지를 추가하였다. 우선 정지에 관련해서 처리할 수 있는 기능을 추가하였는데, 더 세부적인 기능은 추후 추가할 예정이다. 오늘은 유저, 게시판, 댓글에 대해 정지목록을 조회할 수 있고, 정지를 풀어주거나, 삭제할 수 있다. 각각 정지가 당하면, 유저는 권한이 바뀌어서 다른 곳에 접속을 못하게 되고, 게시판이나 댓글의 경우 조회가 안되도록 설정하였다. 그 외에는 3개다 비슷한 로직이기 때문에, 유저에 관해 설명하겠다. Member @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member extends BaseEntity { @Id @GeneratedValue(strategy = Generat..

Tistory

[프로젝트] 커뮤니티 REST API 서버만들기 #5 게시판 부가기능 추가

오늘은 게시판에 추가적인 작업을 할 것이다. 좋아요, 즐겨찾기, 조회수 기능을 추가하였다. 바뀐 코드와 중요한 부분을 위주로 자세히 알아보자. SecurityConfig @EnableWebSecurity @Configuration @RequiredArgsConstructor public class SecurityConfig { private final TokenProvider tokenProvider; private final CorsFilter corsFilter; private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; private final JwtAccessDeniedHandler jwtAccessDeniedHandler; @B..

Tistory

[프로젝트] 커뮤니티 REST API 서버만들기 #6 Comment API만들기

이번에는 댓글기능을 추가하였다. 단순하게 CRUD 기능을 추가하였기에 크게 어렵지 않은 내용이다. 우선 시큐리티 접근 권한 설정을 추가하였다. SecurityConfig .antMatchers(HttpMethod.GET, "/api/comments").hasAnyAuthority("ROLE_USER", "ROLE_ADMIN") .antMatchers(HttpMethod.POST, "/api/comments").hasAnyAuthority("ROLE_USER", "ROLE_ADMIN") .antMatchers(HttpMethod.DELETE, "/api/comments/{id}").hasAnyAuthority("ROLE_USER", "ROLE_ADMIN") .antMatchers(HttpMethod.PUT..

Tistory

[백준] 9252번 LCS 2(java)

https://www.acmicpc.net/problem/9252 9252번: LCS 2 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net 핵심 이 문제는 LCS와 dp를 이용하여 풀 수 있다. 문자열 2개를 비교해 가며, 아래 테이블을 채워나간다. 만약 첫 줄에서 해당 문자가 다르면 0 같으면 1을 넣어준다. 이후 값은 이전의 값을 이어서 갖게 된다. 이후 다시 값을 비교하면 첫 번째에 1이 들어가고 두 번째도 1이 들어갈 것이다. 이후에 A와 A가 다시 겹치게 되는데, 무작정 1을 ..

Tistory

[SWEA] 1232. 사칙연산 - 트리(java)

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV141J8KAIcCFAYD SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 위 트리는 식 (9/(6-4))*3을 이진트리로 표현한 것이고 이를 계산한 값을 출력하면 된다. 사람들은 사칙 연산을 할 때(9/(6-4))*3식과 같은 중위 표기식으로 계산을 한다. 하지만 컴퓨터를 통해 각 연산자의 우선순위대로 계산을 하려면 후위 표기식으로 변환해 계산해야 한다. 즉 (9/(64))*3 → 964-/3*으로 변환되고 이를 계산한다. 따라서 해당 문제에서는 트리를 입력받고 후위 순..

Tistory

[프로젝트] 커뮤니티 REST API 서버만들기 #4 Board API만들기

이번에는 Board 게시판을 추가하였다. 뿐만 아니라 이미지 업로드 기능도 추가하였다. 이후 성능최적화를 위하여 N+1문 제도 해결하였는데, 아래에 자세한 설명이 있다. 이번에 포스팅은 중요한 것 위주로 설명되어 있다. SecurityConfig @EnableWebSecurity @Configuration @RequiredArgsConstructor public class SecurityConfig { private final TokenProvider tokenProvider; private final CorsFilter corsFilter; private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; private final JwtAcc..

Tistory

[프로젝트]커뮤니티 REST API 서버만들기 #2 - Member API 만들기

이번에는 Member API가 추가되었다. 회원 전체조회, 회원단건조회, 회원 정보 수정, 회원탈퇴 기능이 추가되었다. 저번 포스팅에서 바뀐 점과 중요한 점 위주로 설명할 것이다. SecurityConfig @EnableWebSecurity @Configuration @RequiredArgsConstructor public class SecurityConfig { private final TokenProvider tokenProvider; private final CorsFilter corsFilter; private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; private final JwtAccessDeniedHandler jwtAc..

Tistory

비트마스크(BitMask)

비트마스크란? - 비트마스크(BitMask)는 이진수를 사용하는 컴퓨터의 연산 방식을 이용하여, 정수의 이진수 표현을 자료 구조로 쓰는 기법을 말한다. - 이진수는 0 또는 1을 이용하므로 하나의 비트(bit)가 표현할 수 있는 경우는 두 가지이다. - 보통 어떤 비트가 1이면 "켜져 있다"라고 말하며, 0이면 "꺼져 있다"라고 말한다. - 8 bits = 1byte 비트마스크를 사용하면 다음과 같은 이점을 얻을 수 있다. 수행시간이 빠르다. 코드가 짧다 메모리 사용량이 더 적다. 비트 연산자 AND연산 (&) 대응하는 두 비트가 모두 1일 때, 1을 반환 1010 & 1111 = 1010 OR연산(|) 대응하는 두비트가 모두 1 또는 둘 중 하나라도 1이면, 1을 반환 1010 | 1111 = 1111..

Tistory

[프로젝트] 커뮤니티 REST API 서버만들기 #3 - Message API 만들기

이번에는 Message API를 추가하였다. 쪽지기능은 회원과 회원 사이에 주고받는 쪽지를 의미한다. 우선 달라진 코드와 중요한 포인트에 대해 알아보자. SecurityConfig @EnableWebSecurity @Configuration @RequiredArgsConstructor public class SecurityConfig { private final TokenProvider tokenProvider; private final CorsFilter corsFilter; private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; private final JwtAccessDeniedHandler jwtAccessDeniedHandl..

Tistory

Spring Security + JWT 회원가입, 로그인 기능 구현

인증(Authentication)과 권한(Authorization) 이 두 영역은 사실상 스프링 시큐리티의 핵심이다. 인증(Authentication): 보호된 리소스에 접근하는 대상, 즉 사용자에게 적절한 접근 권한이 있는지 확인하는 일련의 과정을 의미한다. 이때 보호된 리소스에 접근하는 대상(사용자)을 접근 주체(Principal)이라고 한다. 권한(Authorization): 인증절차가 끝난 접근 주체가 보호된 리소스에 접근 가능한지를 결정하는 것을 의미한다. 이때 권한을 부여하는 작업을 인가(Authorize)라고 한다. 쉽게 말하면 인증은 아이디와 비밀번호를 입력 받아 로그인하는 과정 자체를 의미하는 것이고 권한이 필요한 리소스에 접근하기 위해서는 당연히 이러한 인증 과정을 거쳐야 한다. 스프링..

Tistory

[프로젝트] 커뮤니티 REST API 서버 만들기 #1 로그인기능 구현 + Swagger

프로젝트 소개 여태까지 여러 프로젝트를 진행했었는데, 그때마다 블로깅을 안했던 것 같다. 이유는 내가 아직 부족한 점이 많아서 좀 더 성장하고 난 이후에 블로깅을 하고 싶었다. 이번 프로젝트는 커뮤니티를 만드는 것인데, 여러가지 기능을 넣어보고 성능 최적화도 진행할 생각이다. 단순 API 개발이지만, 타 개발자와 협업한다는 생각으로 진행할 것이다. 프로젝트 설정 (java 11, Spring-Boot) Dependency 이후 추가로 JWT와 Swagger를 추가해야한다. 이번에 진행할 내용은 다음과 같다. Spring Security + JWT를 이용한 로그인 구현 response를 커스텀하여 응답을 보기 좋게 수정 Swagger 적용 예외처리 security+jwt를 활용한 로그인 구현의 경우 대부분..

Tistory

[백준]1987번 알파벳(java)

https://www.acmicpc.net/problem/1987 1987번: 알파벳 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으 www.acmicpc.net 핵심 이 문제는 DFS를 이용하면 쉽게 풀 수 있다. 또한 알파벳을 이미 방문했는지 판단해야 한다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int..

Tistory

QueryDSL

Spring Data JPA가 기본적으로 제공해 주는 CRUD 메서드 및 쿼리 메서드 기능을 사용하더라도, 원하는 조건의 데이터를 수집하기 위해서는 필연적으로 JPQL을 작성하게 된다. 간단한 로직을 작성하는데 큰 문제는 없으나, 복잡한 로직의 경우 개행이 포함된 쿼리 문자열이 상당히 길어진다. JPQL 문자열에 오타 혹은 문법적인 오류가 존재하는 경우, 정적 쿼리라면 애플리케이션 로딩 시점에 이를 발견할 수 있으나 그 외는 런타임 시점에서 에러가 발생한다. 이러한 문제를 어느 정도 해소하는데 기여하는 프레임워크가 QueryDSL이다. QueryDSL은 정적 타입을 이용해서 SQL 등의 쿼리를 생성해주는 프레임워크이다. QueryDSL의 장점 문자가 아닌 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 ..

Tistory

[알고리즘랩스]수료 및 후기

작년에 알고리즘랩스를 신청하고 거의 처음 제대로 알고리즘을 배웠었다. 사실 수료를 한지 시간이 좀 지났지만, 뒤늦게라도 후기를 남기려 한다. 우선 알고리즘 랩스를 신청한 이유는 알고리즘 문제를 푸는데, 모르는 지식이 많았다. 스스로 독학을 하면서 풀어왔는데, 제대로 개념을 이해하고 싶었기 때문에 신청했다. 알고리즘랩스는 장점이 많은 시스템이라 생각된다. 우선 커리큘럼이 좋았다고 생각한다. 알고리즘에서 중요하고, 비중이 높다고 생각되는 것은 대부분 알려준다고 생각한다. 매주 시험을 봤는데, 본인이 부족하거나 푸는데 어려움을 느낀 문제를 다시 풀어볼 기회가 생긴다. 또한 지표를 통해 본인의 코드가 어느 정도로 빠르고, 간결한지 알 수 있었다. 이러한 지표기능이 있기 때문에, 코드에 더 신경을 많이 썼었다. ..

Tistory

페치 조인

페치 조인(fetch join) 페치 조인이란 SQL 조인의 종류가 아니며, JPQL에서 성능 최적화를 위해서 제공해주는 기능이다. 페치 조인은 엔티티를 조회할 때 연관된 엔티티나 컬렉션을 한 번의 SQL로 함께 조회하는 기능을 제공함으로써 N+1문제를 해결할 수 있게 도와준다. 일반 조인은 실행 시 연관된 엔티티를 함께 조회하지 않는다. 단지 데이터베이스 상에서 테이블간의 탐색을 위해 사용되는 것이다. 아래와 같은 코드가 있다고 하자. @Entity @Data public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private int age; ..

Tistory

[백준]1520번 내리막 길(java)

https://www.acmicpc.net/problem/1520 1520번: 내리막 길 여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으 www.acmicpc.net 핵심 이 문제는 DFS로 풀면 시간초과가 나게 된다. 따라서 DP를 함께 사용한다. 이미 탐색한 부분은 다시 탐색하지 않는 방법을 이용한다. 정답 코드 import java.util.Scanner; public class Main { static int M; static int N; static int[][] map; static int[] dy = {1, 0, -1, 0}; static int[] d..

Tistory

[삼성전자 DX] 알고리즘 특강

방학 동안 알고리즘 학습에 대해 고민하던 중 좋은 기회가 있어 신청하였다. 그동안 까먹고 있었는데, 오늘 메일이 와서 블로깅을 하게 되었다. 사전 문제는 2문제를 기간내에 푸는 것이었다. 생각보다 쉽지 않아서 놀랐던 기억이 있다. 그래도 집념으로 계속 도전하여 2 솔을 하였다. 게시판을 보니까 2솔을 해도 떨어진 사람들이 있었다. 참여인원이 많아서 내부 기준을 적용했다고 한다. 다행히도 운이 좋아 참여할 수 있게 되었다. 평소 알고리즘을 좋아해서 이번 특강도 재미있게 참여할 수 있을 것 같다.

Tistory

[프로그래머스] 기사단원의 무기 + 약수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/136798 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 해당 문제의 핵심은 약수의 개수를 찾는 것이다. 하지만 단순하게 시간복잡도 때문에 단순하게 약수를 찾으면 시간초과가 떠버린다. 1. 단순하게 모든 수를 나눠서 약수 구하기 List getDivisor(int N){ List divisors = new ArrayList(); for (int i = 1; i

Tistory

JPA의 데이터 타입

JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 ex) 멤버 엔티티의 나이, 번호 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 ex) 숫자 10을 30으로 변경하면 완전히 다른 값으로 대체 갑 타입 분류 기본값 타입 - 자바 기본 타입, 래퍼 클래스, String 임베디드 타입 컬렉션 값 타입 기본값 타입 생명주기를 엔티티의 의존한다. 값 타입은 공유하면 안된다. 기본 타입은 항상 값을 복사한다. 값을 공유 X 임베디드 타입(복합 값 타입) 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입이라 ..

Tistory

JPQL 사용법

JPQL(Java Persistence Query Language) JPQL은 SQL을 추상화하여 특정 데이터베이스 SQL에 의존적이지 않은 객체지향 쿼리 언어이다. 테이블을 대상으로 쿼리를 하는 것이 아닌 객체(엔티티)를 대상으로 쿼리를 하기에 객체지향 쿼리 언어라고 불린다. JPQL은 결국 SQL로 변환되어 데이터베이스에 전달된다. ex) select m from Member as m where m.age > 20 엔티티와 속성은 대소문자를 구분한다. (Member, age) JPQL 키워드는 대소문자를 구분하지 않는다. (SELECT, select 모두 가능) 테이블이 아닌 엔티티의 이름을 사용한다. (Member) 별칭은 필수다. (m) (as는 생략 가능) EXISTS, IN, AND, OR, ..

Tistory

엔티티 매핑

엔티티 매핑 객체와 테이블 매핑 @Entity, @Table 필드와 컬럼 매핑 @Column 기본 키 매핑 @Id 연관관계 매핑 @ManyToOne, @JoinColumn @Entity Entity가 붙은 클래스는 JPA가 관리, 엔티티라 함 JPA를 사용해서 테이블과 매필할 클래스는 @Entity 필수 기본 생성자 필수 final 클래스, enum, interface, inner클래스 사용 x 데이터베이스 스키마 자동 생성 DDL을 애플리케이션 실행 시점에 자동 생성 테이블중심 -> 객체 중심 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성 생성된 DDL은 개발 장비에서만 사용 생성된 DDL은 운영서버에서는 사용 X, 다듬어서 사용 기본 키 매핑 방법 직접 할당: @Id만 사용 자동..

Tistory

프록시 & 지연로딩

프록시란? Proxy, 영어로 '대리인'이라는 뜻이 있다. 말 그대로 엔티티에 대한 대리인의 역할을 한다. 그 말대로, 프록시는 원본 객체가 아닌 원본에 대한 복제품을 가져오는 것이다. 다음과 같은 테이블이 있다고 하자. 만약 회원을 조회할 때, 팀도 함께 조회될까? 멤버 엔티티는 아래와 같은 값을 가지며, setter, getter를 포함한다고 하자. @Entity public class Member{ @Id @GeneratedValue @Column(name = "member_id") private Long id; @Column(name = "username") private String name; @ManyToOne private Team team; } 팀 엔티티는 아래와 같은 값을 가지며, set..

Tistory

빈의 생명주기

빈의 생명 주기 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료 초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출 소멸전 콜백: 빈이 소멸되기 직전에 호출 스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다. 1. InitializingBean, DisposableBean 인터페이스 사용 public class NetworkClient implements InitializingBean, Dispo..

Tistory

HTTP 상태 코드

상태 코드 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능 1xx (Informational): 요청이 수신되어 처리중 2xx (Successful): 요청 정상 처리 3xx (Redirection): 요청을 완료하려면 추가 행동이 필요 4xx (Client Error): 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음 5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함 2XX - 클라이언트의 요청을 성공적으로 처리 200 OK - 요청 성공 201 Created - 요청 성공해서 새로운 리소스가 생성됨 202 Accepted - 요청이 접수되었으나 처리가 완료되지 않았음 ex) 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리함 204 ..

Tistory

영속성 컨텍스트

영속성 콘텍스트 "엔티티를 영구 저장하는 환경"이라는 뜻 영속성 콘텍스트는 논리적인 개념이다. 눈에 보이지 않는다. 엔티티 매니저를 통해서 영속성 콘텍스트에 접근한다. 엔티티의 생명주기 비영속(new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속(managed) 영속성 컨텍스트에 관리 되는 상태 준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제(removed) 삭제된 상태 //객체를 생성한 상태(비영속) Member member = new Member(); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //객체를 저장한 상태(영속) em.persist(member); ..

Tistory

[개발일기#4] 2022년의 마지막 개발 일기

개발일기 (22.12.31) 개발자라는 꿈을 가지고 공부를 시작한 지도 6개월이 넘어간다. 남들에 비해 늦게 시작했다는 압박감으로 시작했었다. 현재는 그러한 압박감보다는 내가 정말 열심히 하고, 꾸준히만 한다면 내가 원하는 목표를 이룰 수 있다는 확신이 생겼다. 방학중에 스프링에 많은 시간을 투자할 생각이다. 우선 김영한 님의 스프링 로드맵을 전부 구매하였다. 우연하게 김영한 님의 스프링입문 강의를 들었는데, 이론이 부족한 나에게 큰 도움이 된다고 느껴졌다. 그래서 전부 들어보고 싶다는 생각이 들었다. 사실 내가 하고 싶어 하는 공부에 있어서 욕심이 너무 많아서 구매를 안 할 수가 없었다. 마침 7주년을 맞이하여 할인을 하여 나름 싼 가격에 구매할 수 있었다. 오늘도 김영한 님의 강의를 들었는데, 그저 ..

Tistory

스프링 컨테이너와 스프링 빈

스프링 컨테이너란? 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 여기서 말하는 자바 객체를 스프링에서는 빈(Bean)이라고 부른다. 이런 식으로 스프링 컨테이너 안에 스프링 빈 저장소가 있고, 그 안에 빈이 들어있다고 생각하면 된다. 스프링 컨테이너의 종류 BeanFactory 스프링 컨테이너의 최상위 인터페이스다. 스프링 빈을 관리하고 조회하는 역할을 담당한다. ApplicationContext BeanFactory 기능을 모두 상속받아서 제공한다. 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까? 정리 ApplicationContext는 BeanFactory의 기능을 상속받는다. App..

Tistory

컴포넌트 스캔과 의존 관계 자동 주입

컴포넌트 스캔이란? 지금까지는 @Configuration이 붙은 설정 파일을 이용하여 빈을 수동 주입하였다. 이렇게 개발자가 수동으로 빈을 주입하고 의존 관계를 정해줄 수도 있지만, 만약 등록할 빈이 많다면 일일이 모두 등록해야 해서 상당히 귀찮다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. @Component public class OrderServiceImpl implements OrderService { private final DiscountPolicy discountPolicy; public OrderServiceImpl(DiscountPolicy discount..

Tistory

스프링의 핵심

스프링 핵심 스프링은 프레임 워크이다. 오픈소스이다. IoC컨테이너를 가진다. IoC(Inversion of Control): 제어의 역전 - Class: 설계도 - Object: 실체화가 가능한 것 롤 게임을 예로 들면 가렌이라는 캐릭터는 클래스가 실제 게임에서 실체화된 것이다. 하지만 챔피언은 추상적인 의미, 실체화가 될 수 없다. - 인스턴스: 실체화된 오브젝트 new 생성자를 통해 오브젝트를 힙 메모리공간에 올리게 되면( 실체화) 참조변수가 메모리 주소값을 가리키게 된다. 이 인스턴스를 다른곳에서 사용하기 위해서 똑같은 생성자를 통해 생성하더라도 이전에 생성된 인스턴스 새로 생성한 인스턴스 다른 메모리 주소를 레퍼런스 하고 있는 다른 인스턴스라고 할 수 있다. 이러한 인스턴스를 사용하기 위해서 스..

Tistory

Spring Boot 동작 원리

(1) 내장 톰캣을 가진다 톰캣을 따로 설치할 필요 없이 바로 실행가능하다. 웹서버 : 클라이언트가 요청하는 정적 콘텐츠를 전달하는 서버 웹 컨테이너 : Servlet, jsp를 실행할 수 있는 소프트웨어, 서블릿 컨테이너라고도 한다. 톰캣은 서블릿 컨테이너 중 하나이다. 요청을 받을 시 서블릿 컨테이너(톰캣)가 request, response 객체를 생성한다. (톰캣에서 BufferedWriter, BufferedReader를 통해 요청으로부터 가변길이의 문자를 받고 request, response 객체를 생성) 이후 요청에 매핑된 서블릿이나 프런트 컨트롤러로 전달 JSP 파일을 요청했을 때 동작 클라이언트가 어떤 동작을 함으로써 hello.jsp를 요청. 클라이언트가 JSP 파일을 요청할 경우 제어권..

Tistory

JPA란 무엇인가?

JPA란? Java persistence API이다 persistence : Persistence(영속성) : 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미, 영속성은 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 구현 자바에 있는 데이터를 영구히 기록할 수 있는 환경(스토리지 내 DBMS)에 영구히 저장할 수 있도록 하는 환경을 제공하는 API라고 할 수 있음 API (Application Programming Interface) : 프로그램 사이 데이터 통신 규칙(상하관계가 존재) ↔ Protocol Protocol은 서로 동일시하여 규칙을 서로 합의하에 정함 JPA는 ORM 기술이다. ORM(Object Relation Mapping) :..

Tistory

동적계획법(DP)

동적 계획법(Dynamic Proframming)이란? 부분 문제를 해결한 결과를 이용하여 전체 문제를 해결하는 것 작은 나를 해결함으로써 더 큰 나를 해결함 동적 계획법의 문제 풀이 순서 1. 부분 문제를 정의한다. - 무슨 값을 구할지를 정의한다. 2. 점화식을 구한다. - 그 값을 어떻게 구할지에 대한 식을 세운다. ( 부분은 풀려있다고 가정) 3. 문제를 해결한다. - 값을 직접 구하는 코드를 작성한다. 동적 계획법을 활용한 대표적인 예시 피보나치 수 구하기가 있다. 점화식을 활용하기 위해 index 0,1에 해당하는 값을 미리 채워주어야 한다. 반복문을 통해 이전의 값을 활용하여 채워주면서 나아가면 된다. 동적 계획법 활용 문제 개인적으로 동적 계획법 자체는 쉽지만 부분 문제를 정의하는 것이 어..

Tistory

[프로그래머스] 여행경로(java)

https://school.programmers.co.kr/learn/courses/30/lessons/43164 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 해당 문제는 DFS를 활용하여 풀 수 있었다. 처음에는 HashMap을 사용하여 풀려고 하였다. HashMap 의 맵을 만들고, 키 값에 시작점을 넣고 value값은 도착점을 넣으려고 하였다. (키값이 중복이 있을 수 있기 때문에 value의 값을 List 으로 하려 함) 하지만 이러한 풀이는 value의 순서에 따라 전부 방문하지 못하는 경우가 생기기도 하였다. 따라서 전부다 탐색을 시도해야 한..

Tistory

*BFS(너비 우선 탐색)* 목수의 미로 탈출

이번 문제는 BFS 문제이다. https://kimtaesoo99.tistory.com/85 너비 우선 탐색(BFS) 그래프 순회 저번에 배운 깊이 우선 탐색(Depth First Search) - 스택을 이용하여 그래프를 순회하는 방법 너비 우선 탐색(Breadth First Search) - 큐를 이용하여 그래프를 순회하는 방법 너비 우선 탐색(BFS) kimtaesoo99.tistory.com 위의 글에서 맨 마지막에 나오는 미로 찾기의 심화 문제이다. 핵심 이 문제는 생각을 달리해야 한다. S 부분에서 E부분까지 이동하는데, 벽으로 막힌 경우도 있다. 따라서 우리는 S에서 시작하여 끝까지 가는 것만이 아닌, S에서 시작하는 경우와 E에서 시작하는 경우 모두 생각한 뒤 벽에 도달하는 거리도 생각해주..

Tistory

우아한테크코스 5기 - 불합격 및 배운점

이번 5기 모집에서 불합격하였다. 처음에는 매우 아쉬운 마음이 크게 들었다. 스스로가 열심했다고 생각했지만, 다른 사람이 보았을 때는 아직 부족한 점이 많은 것 같다. 다음 6기를 목표로 삼고 다시 열심히 성장할 생각이다. 이번 우 테코를 통해 정말 많은 것을 배웠다. 최종 준비를 위해 4기와 3기 문제를 풀었었는데, 이러한 과정 속에서 내가 부족한 점이 무엇인지 알게 되었다. 뿐만 아니라 다른 사람들의 코드를 보고 배울 점이 무엇인지 생각해보았다. 1. 일급 컬렉션 가장 처음 배운 점은 일급 컬렉션이다. 일급 컬 렌셔의 규칙을 적용하는 것은 간단하다. 컬렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다. 각 콜렌션은 그 자체로 포장돼 있으므로 이제 컬렉션과 관련된 동작은 근거지가 마련된 셈이..

Tistory

다익스트라

그래프를 활용하여 최단 경로를 구할 수는 없을까? 최단경로 알고리즘은 크게 3가지가 존재한다. 이번 시간에는 다익스트라만 다루도록 하겠다. 다익스트라란? 음의 가중치가 없는 그래프의 한 정점에서 모든 정점까지의 최단거리를 각각 구하는 알고리즘이다. 정점 사이에는 가중치가 존재한다. 최단경로의 특징 정점 x까지 최단거리로 가기 위해서는 그 직전까지도 최단거리로 가야 한다. 위의 그림을 보면 1 - 6 - 2 - 3 - 8 - 7 순으로 이동한다. 최단경로의 특징을 이용하면 1~8까지 이동할 때에도 최단 경로로 이동한다. 그래서 최단경로 트리를 어떻게 만들 것인가? T(i) = i까지 도달하는 최단거리 -> 파란색 숫자 순서를 그림을 이용하여 천천히 설명하겠다. 보라 색원은 이미 탐색을 완료했다는 의미이다...

Tistory

[원티드 프리온보딩] 백엔드 인프라 설계 with AWS week 1-1

AWS란? 아마존에서 제공하는 클라우드 서비스로, 네트워킹을 기반으로 가상 컴퓨터와 스토리지, 네트워크 인프라 등 다양한 서비스를 제공하고 있다. 자바는 JVM 위에서 돌아가기 때문에 serverless환경으로 잘 돌리지 않는다. AWS VPC Virtual Private Cloud 가상 네트워크 서비스로 퍼블릭 네트워크와 프라이빗 네트워크를 분리하고 모니터링할 수 있도록 해주는 서비스 네트워크 구성과 관련된 사실상 모든 기능을 담당하며, 자체 데이터 센터에서 운영하는 기존 네트워크와 매우 유사한 형태 AWS API Gateway 어떤 규모에서든 개발자가 API를 손쉽게 생성, 게시, 유지 관리, 모니터링 및 보안 유지할 수 있도록 하는 완전 관리형 서비스 서버의 “대문”과 같은 역할 API Gatewa..

Tistory

[원티드 프리온보딩] 백엔드 인프라 설계 with AWS week 1-2

AWS EC2 Amazon Elastic Cloud Compute 가장 기본적인 형태의 클라우드 컴퓨팅 (= 클라우드 컴퓨터 한 대) 온디맨드: 선결제 금액이나 장기 약정 없이 저렴하고 유연하게 Amazon EC2를 사용하기 원하는 사용자 스폿 인스턴스: 시작 및 종료 시간이 자유로운 애플리케이션 Saving Plans: 1년 또는 3년 기간의 일정 사용량 약정을 조건으로 EC2 및 Fargate 사용량에 대해 저렴한 요금을 제공하는 유연한 요금 AWS Elastic Beanstalk Amazon Elastic Beanstalk AWS 클라우드에서 애플리케이션을 신속하게 배포하고 관리할 수 있는 서비스 (애플리케이션 코드를 업로드하기만 하면 작동) Elastic Beanstalk = EC2 + 배포 버전..

Tistory

[원티드 프리온보딩] 백엔드 인프라 설계 with AWS week 2-1

AWS RDS Amoazon Relational Database Service 클라우드에서 관계형 데이터베이스를 간편하게 설정, 운영 및 확장할 수 있는 관리형 서비스 모음 주요 기능 RDS 백업: 자동 백업, DB 스냅샷 멀티 AZ: 두 개 이상의 AZ에 걸쳐 DB를 구축하고 원본과 다른 DB(standby)를 자동으로 동기화(Snyc), 읽기 전용 복제본 CloudWatch 연동: DB 인스턴스의 모니터링 (디테일 모니터링, CPU, Storage 사용량, 그 이외의 Error Log) AWS Aurora Amazon Aurora Aurora 플랫폼은 AWS만의 관계형 데이터베이스로써 기존의 소스를 커스터 마이 징하 여 AWS에 최적화시킨 것 (RDS가 커피라면, Aurora는 TOP) RDS에서 사..

Tistory

우아한테크코스 5기 - 4주차 후기

4주 차 미션을 마지막으로 프리코스가 종료되었다 어느 정도 틀이 주어진 채로 진행하였는데, 이를 잘 활용하기 위해 많은 고민을 하였다. 예를 들어 인터페이스가 주어졌을 때, 왜 인터페이스가 주어졌을까? 이를 활용하면 어떠한 장점이 있는지 등등 여러 가지로 공부하였다. 우선 알게 된 사실은 테스트를 돌리기 어려운 랜덤 값 생성을 인터페이스를 활용하여 테스트를 돌릴 수 있게 되었다. 단순히 기능 구현에 초점을 맞추지 않았다. 기능 구현은 누구나 할 수 있다. 나는 가독성과 효율성 둘 다 챙기고 싶었다. 그래서 처음에는 서비스를 생성하여 컨트롤러가 뷰와 도메인과 소통할 때 서비스를 거치도록 만들었다. 이는 오히려 가독성이 떨어지고 불필요한 과정이 되는 경우가 생기게 되었다. 그래서 이번 미션에서는 서비스를 제..

Tistory

[프로그래머스] 명예의 전당(1) (java)

https://school.programmers.co.kr/learn/courses/30/lessons/138477 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 위의 그림은 문제의 일부분이다. 핵심 문제를 간단하게 해석하면, socre는 하루하루 추가되는 점수이다. k의 개수 개까지 명예의 전당에 오르게 된다. -> 상위 k개에서 가장 낮은 점수가 커트라인이 된다. 발표 점수는 커트라인으로 이루어져 있다. 정답 코드, 스트림을 활용 import java.util.ArrayList; import java.util.Comparator; import java..

Tistory

[개발일기#3] 앞으로의 계획

개발일기 (22.11.27) 우 테코 프리코스를 진행하면서, 많은 것을 느꼈다. 프리코스를 진행하기 이전에, 나는 스스로 학습하는 법을 몰랐던 것 같다. 어떤 것을 공부해야 하는지도 정확하게 알지 못하였고, 그냥 흘러가는 대로 공부했던 것 같다. 하지만 이번 프리코스 동안 스스로 공부하는 법을 알게 되었다. 내가 모르는 부분을 찾아보고, 그것을 내 것으로 만들려고 노력하였다. 이러한 과정 속에서 정말 많은 성장을 하였다. 지금 시점에서 내가 작성하였던 코드들을 보니 많은 부족함이 보였다. 그때 당시에는 그 코드가 깔끔하고, 좋다고 생각하였다. 이러한 차이는 내가 많이 발전했다는 것을 증명해주는 것 같다. 오늘 프리코스 2주 차 미션을 다시 풀어보았다. 그리고 내가 작성했던 코드와 비교해보았다. 그 전 ..

Tistory

5주차 CS 스터디 Operating System&Spring

5주 차에서 다룰 내용은 다음과 같다. 1. Operating System 운영체제란? 프로세스 vs 스레드 프로세스 주소 공간 Interrupt 2. Spring Test Code(JUnit5) JPA JPA 더티 체킹 Spring Security - 인증 및 권한 부여 Operating System 운영체제란? 운영 체제는 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 시스템 소프트웨어이다. 운영체제의 역할 1. 프로세스 관리 운영체제에서 작동하는 응용 프로그램을 관리하는 기능이다. 현재 CPU를 점유해야 할 프로세스를 결정하고, 실제로 CPU를 프로세스에 할당하며, 이 프로세스 간 공유 자원 접근과 통신 등을 관리하게 된다. 2. 저장장치 관리 1차 저장장치에 해당하는 메인..

Tistory

너비 우선 탐색(BFS)

그래프 순회 저번에 배운 깊이 우선 탐색(Depth First Search) - 스택을 이용하여 그래프를 순회하는 방법 너비 우선 탐색(Breadth First Search) - 큐를 이용하여 그래프를 순회하는 방법 너비 우선 탐색(BFS) 인접한 노드들을 우선 모두 색칠해 두고 뻗어나간다. 위의 그림에서 너비 우선 탐색을 사용한다고 하자. 우선 1을 큐에 넣고, (1)을 제거한다. -> 현재 노드 위치 1의 인접 노드인 2와 4를 큐에 넣는다. 이후 1의 이웃한 노드들이 모두 색칠되었으므로, 큐의 제일 앞 노드를 제거한다.(2) 2가 제거되었으므로 현재 노드 위치는 2이다. 2의 인접 노드인 3을 큐에 넣는다. 4는 이미 추가되어있으므로 추가하지 않음. 2의 인접 노드가 모두 색칠되었으므로, 큐의 제일..

Tistory

우아한테크코스 5기 - 3주차 후기

3주 차 미션이 끝났다. 이번 문제도 상당히 많은 부분에서 신경 쓸게 많았다. 예외처리 부분이 좀 힘들었다고 생각한다. 우선 사용자의 입력이 잘못 들어온 경우 IllegalArgumentException을 발생시켜야 하는데, 따로 커스텀하지 않을 경우 다른 예외가 발생하기 때문이었다. 그래서 어떠한 예외가 발생할지 계속해서 생각하면서 리펙토링 하였다. 그리고 처음 미션을 받았을 때, 도메인 내부에서 예외처리가 진행되어 있었다. 나는 기존에 View에서 데이터를 받고, 도메인으로 넘기기 전에 빠르게 예외처리를 진행해왔다. 하지만 이번 미션은 통일성을 생각하여 도메인에서 진행하였다. 이러한 부분은 아직 공부가 부족하여 장단점에 대해 더 생각해봐야겠다. 미션을 진행할수록 커밋수가 증가하는 것 같다. 이번에도 ..

Tistory

깊이 우선 탐색(DFS)

그래프 순회 - 그래프라는 자료구조에 어떠한 값이 저장되어 있는가? 깊이 우선 탐색(Depth First Search) 스택을 이용하여 그래프를 순회하는 방법 스택 = 선행 관계 - 나를 먼저 방문하고 그다음으로 인접한 노드를 차례로 방문(단, 방문했던 노드는 방문하지 않는다.) 깊이 우선 탐색의 예시 위 그래프는 1 - 2 - 3 - 4 - 5 - 6 순으로 방문하게 된다. 중요한 점은 더 이상 갈 곳이 없다면, 왔던 곳으로 돌아간다.(재귀) 좀 더 복잡해 보이는 그래프를 보자. 위에 보이는 순서대로 방문하게 되고, 화살표의 모양대로 다시 돌아오게 된다. 가장 깊은 4까지 간 뒤 더 이상 갈 곳이 없기 때문에 돌아오면서 방문하지 못한 곳을 방문하게 된다. DFS 구현 DFS를 구현하고, 코드를 보며 자..

Tistory

우아한테크코스 5기 - 2주차 후기

2주 차는 전 기수에도 나왔던 숫자야구였다. 문제 자체의 알고리즘을 짜는 것은 쉬웠다고 생각하였다. 하지만 MVC패턴을 적용하는 것은 생각보다 쉽지 않았다. 기존에 Spring을 했지만, 알고리즘을 MVC로 나누는 것은 처음이었다. 그래서 이번 주는 알고리즘에 대한 고민보다는 구조화에 대한 고민을 많이 하였다. 이번에도 생각보다 커밋수가 많이 나왔다. 처음에 작성했던 커밋수와 이후 리펙토링을 한 커밋의 수가 거 비슷하였다. 리펙토링은 끝이 없다고 생각한다. 1주 차 공통 피드백을 받았는데, 내용은 아래와 같다. 1. 요구 사항을 정확히 준수한다. 2. 커밋 메시지를 의미 있게 작성한다. 3. git을 통해 관리할 자원에 대해서도 고려한다. 4. Pull Request를 보내기 전 브랜치를 확인한다. 5...

Tistory

우아한테크코스 5기 - 1주차 후기

1주 차 과제는 알고리즘을 푸는 문제였다. 난이도가 엄청 높지는 않았지만, 단순하게 문제를 푸는데 목적을 두지 않고 클린 코드로 작성하려 하니 힘들었다. 기존에 문제를 풀 때는 변수명이나 메서드명을 단순하게 그때 풀고 끝이라는 생각을 하고 대충 지었다. 내가 기존에 작성했던 코드는 남이 봤을 때, 이해하기 어려웠을 것이라는 생각을 하였다. 그래서 모든 이름을 다 의미 있고, 알아보기 쉽게 표현하려 노력하였다. 메서드가 한 가지 일을 수행하도록 분할을 하였다. 이 방법을 사용하니, 나중에 리펙토링을 하려 할 때 매우 유용하였다. 분할을 하기 전 미리 어떠한 기능을 구현할지 나누어 작성한 다음 설계하니 더욱 편하였다. 가장 어려운 점은 인덴트를 최대한 적게 사용하는 것이었다. 기존의 코딩 방식과 달라서 이 ..

Tistory

자료구조(Graph)

그래프란 다음과 같은 모습을 가지고 있다. 즉 그래프는 각각의 정점이 간선으로 연결되어있는 모습이다. 그래프는 왜 중요한가? 현실 세계의 많은 것들을 그래프로 나타낼 수 있다. - 즉 그래프와 관련된 문제가 매우 많다. 그래프와 관련된 수학적 정리가 매우 많다. - 그래프 이론이라는 분야가 따로 있다. 그래프에 관한 중요한 수학적 지식 간선의 개수는 정점의 제곱보다 작거나 같다. -> 항상 참 각 정점의 차수의 합은 간선의 개수의 2배와 같다. -> 항상 참 - 차수는 각 정점에 연결되어 있는 간선의 수 차수의 합을 구할 때, 각 간선을 두 번씩 세기 때문이다. 그래프의 구현 : 인접 행렬 정점의 연결 관계를 2차원 배열에 0,1로 표현한다. 장점: 연결 여부를 O(1)에 알 수 있다. 단점: 인접한 정..

Tistory

교내 SW 프로그램 경진 대회 수상 및 후기

교내 SW 프로그램 경진 대회에서 운 좋게 수상하게 되어 상을 받으러 갔다. 개발을 시작하고 처음 받아보는 상이라 낯설기도 하였지만, 기분이 좋았다. 사실 아직 부족한 점이 많아서 수상을 못할 것이라 생각했었기에 얼떨떨한 마음도 있었다. 너무 일찍 가서 사람이 없었다. 밖에는 각팀들의 패널이 전시되어있었다. 우리 팀이 만든 봐라오케 패널이다. 기능을 더 추가하지 못한 게 아쉽게 느껴졌다. 운 좋게 좋은 팀들을 만나서, 협업이라는 귀한 경험을 했다. 팀원들과 함께 사진을 찍으며 마무리하였다. . 이전의 글에도 작성했지만, 이번 대회가 나에게 있어서 매우 값진 경험이었다. 단순하게 백엔드만 잘한다고 끝이 아니었다. 프론트와 소통하며, 내가 부족한 부분이 무엇인지 알게 되었다. 개발은 혼자 하는 것이 아니기 ..

Tistory

자료구조(Stack&Queue)

스택과 큐는 선형 자료구조이다. (Linear) 스택 스택은 말 그대로 쌓다는 의미를 가지고 있다. 스택은 Last In First Out이다. 즉 마지막에 들어간 값이 제일 처음 나온다. 1,2,3,4를 순서대로 넣는다고 생각해보자. 위와 같이 1,2,3,4 순서대로 담기게 된다. 뺄 때는 위에서부터 한 개씩 빼게 된다. 스택을 구현할 때 우리가 생각할 부분은 스택 오버플로우와 스택 언더플로우이다. 오버플로우는 스택이 가득 찼는데, 우리가 원소를 더 넣으려 할 때 발생한다. 언더플로우는 스택이 비었을 때, 우리가 원소를 더 빼려고 할 때 발생한다. 스택 구현 구현하기에 앞서 우리가 어떤 기능을 구현할지 생각해보자. S를 스택이라 하자 S.create(x) : S의 크기를 x로 지정한다. S.push(x..

Tistory

4주차CS스터디Network&Spring

4주 차에서 다룰 내용은 다음과 같다. 1. Network 대칭키/공개키 HTTP / HTTPS 로드 밸런싱 Blocking, Non-blocking / Synchronous, Asynchronous Blocking / Non-Blocking I/O 2. Spring Bean Scope MVC Framework Spring Boot, SpringApplication Network 대칭키&공개키 대칭키란(Symmetric Key)? 암호화와 복호화에 같은 암호키를 사용하는 알고리즘 동일한 키를 주고받기 때문에, 매우 빠르다. 하지만 전달 과정에서 해킹 위험에 노출된다. 공개키(Public Key)/비대칭키(Asymmetric Key)란? 대칭키의 키 분배 문제를 해결하기 위해 고안됨.(대칭키일 때는 송수신..

Tistory

자료구조(Tree)

자료구조에서 트리는 다음과 같은 모습을 가진다. 아마 위의 사진만 보고도 대충 짐작을 할 수 있을 것이다. 트리는 자식 노드와 부모 노드로 이루어져 있다. 자식 노드에서 부모 쪽으로 계속해서 타고 올라가다 보면 결국 부모가 없는 하나의 노드로 이어지게 되는데, 이 노드를 루트 노드라고 부르며, 루트 노드를 중심으로 뻗어나가는 모습이 나무의 구조와 비슷하여 '트리'라는 이름이 붙여졌다. 트리의 재귀적 성질 트리는 그 안에 또 트리가 존재하게 된다. 트리안의 다른 트리를 서브 트리라고 한다. 이진트리(Binary Tree) 이름에서도 알 수 있듯이 자식 노드가 2개 이하인 트리를 이진트리라고 한다. 트리 순회 트래 내에 어떠한 자료가 담겨있는지를 알기 위해 사용한다. 전위 순회: Root - Left - R..

Tistory

[개발일기#2] SW대회 수상

개발일기 (22.10.22) 학교 내에서 개최한 SW 대회에서 입상을 하였습니다. 개발을 시작하고 처음 도전한 대회라서 부족한 부분도 많았지만, 팀원들과 함께 포기하지 않고 완성시켜서 좋은 결과를 얻은 것 같습니다. 아쉬운 점이 있다면 시간이 너무 부족했던 것 같습니다. 여러 가지 기능을 추가하고 싶었는데, 배포도 처음 하고 프런트와 연결하는 과정도 쉽지 않았습니다. 그래도 배포도 경험해보고 여러가지 모르는 부분을 많이 알게 되고 한 단계 더 성장한 것 같아 기분이 좋습니다. https://github.com/kimtaesoo99/SW_Project GitHub - kimtaesoo99/SW_Project Contribute to kimtaesoo99/SW_Project development by cre..

Tistory

*재귀함수* inequal

재귀 함수 문제입니다. 핵심 최댓값과 최솟값을 출력해야 하는데, 여러 가지 방법이 있겠지만 List를 사용하면 쉽게 출력할 수 있다. 정답 코드 import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { static int n; static char[] arr; static boolean[] check; static int[] result; static List list; public static void main(String[] args) { Scanner sc= new Scanner(System.in); n =sc.nextInt(); arr = new char[n]; for (int i=..

Tistory

우아한테크코스5기 - 프리코스 시작전 다짐

우아한 테크 코스 5기를 지원하기 위해 자소서를 많이 수정하였다. 친구들에게 첨삭을 받으면서, 부족한 부분이 무엇인지 피드백받고 거짓 없는 내 모습을 보여주려고 노력하였다. 우아한 테크 코스 5기는 1차 코딩 테스트 없이 바로 프리코스를 진행할 수 있었다. 내가 우아한 테크 코스를 지원한 이유는 여러 가지가 있지만, 새로운 것을 배우고 내가 현재 부족한 부분을 프리코스를 진행하면서 개선할 수도 있고, 성장해 나갈 수 있는 좋은 경험이 될 것 같기 때문이다. 오늘부터 시작되는 프리코스 과제를 단순하게 풀고 제출하는 것이 목적이 아닌, 효율적이고 가독성이 좋은 코드를 만들기 위해 노력할 것이다. 단순하게 과제를 제출하는 것이 나의 성장에 큰 도움이 될 것이 아니라는 것을 알기에, 이번 프리코스동안은 정말 나..

Tistory

재귀함수

우선 함수에 대해 알아보자 함수란 값을 입력받아 특정 연산을 수행하여 결과를 반환하는 것이다. 다음은 재귀 함수에 대해 알아보자 자기 자신을 부르는 함수 대표적인 예시는 팩토리얼이다. import java.util.Scanner; public class Main2 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n =sc.nextInt(); System.out.println(getFactorial(n)); } public static int getFactorial(int n){ if (n==0)return 1; else return n*factory(n-1); } } 위 코드를 보면 계속해서 자기 자신을 ..

Tistory

이진탐색

오늘은 이진 탐색에 대해 정리해보려 한다. 영어로는 Binary Search라고 한다. 이진 탐색은 정렬되어 있는 숫자들 중에서 특정 숫자를 찾는다. -값들 중에 절반을 기준으로 원하는 값을 찾는다. -절반을 나눈 값을 기준으로 원하는 값이 있는 쪽에서 다시 절반을 나눈다. 즉 이진 탐색은 숫자를 절반씩 지워나가면서 찾는다. 따라서 시간 복잡도는 O(log n)이 된다. 여기서 의문점이 들 수 있다. 정렬해야 하면 O(log n)이 아니라 결국 O(n log n) 아닌가요? -> yes 따라서 이미 배열이 정렬되어 있다면 Binary Search가 효율적이다. 또는 숫자 찾기를 엄청 많이 해야 하는 경우에는 오히려 정렬을 한 뒤에 Binary Search를 하는 것이 좋다. 이제 이진 탐색을 구현해보자...

Tistory

[개발일기 #1] 더욱 열심히하자

개발일기 (22.10.13) 오늘 처음으로 개발일기를 쓰려고 한다. 사실 이전부터 개발일기를 쓰고 싶었으나, 여러 가지 핑계를 대면서 미루었던 것 같다. 개발일기를 써야겠다는 생각이 든 이유는 오늘 있었던 학교 취업설명회를 듣고 나서이다. 나는 스스로 개발자라는 꿈을 늦게 가지게 되었고, 공부도 늦게 시작했다고 생각했다. 그래서 남들에 비해 뒤처진다는 조바심이 있었고, 불안한 마음도 있었다. 오늘 있었던 취업 설명회 덕분에 이러한 안 좋은 마인드가 바뀌게 되었다. 취업설명회를 진행하신 분은 우리 학교를 졸업한 선배님이셨다. 설명회에서 코딩 테스트, 포트폴리오, 면접에 대해 자세히 설명해주셨다. 취업설명회는 나에게 있어서 매우 큰 의미가 있었다. 우선 개발자라는 꿈이 더욱 명확해졌고, 앞으로의 공부 방향성..

Tistory

[프로그래머스]2018 카카오 블라인드 공채, [1차]비밀지도(java)

https://school.programmers.co.kr/learn/courses/30/lessons/17681 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 핵심 2개의 배열의 값을 2진수로 바꾸어, 각 배열의 값이 둘 중 1개라도 1이면 새로운 배열에 # 아니면 공백을 추가해준다. 정답 코드, 처음 풀이 public class Solution { public String[] solution(int n, int[] arr1, int[] arr2) { String[] answer = new String[n]; for (int i =0;i

Tistory

3주차CS스터디Network&Java

3주 차에서 다룰 내용은 다음과 같다. 1. Network OSI 7 계층 TCP 3 way handshake&4 way handshake TCP/IP 흐름 제어&혼잡 제어 UDP 2. Java Error&Exception Stream API Record Network OSI 7 계층 OSI 7 계층이란? OSI계층은 네트워크에서 통신이 일어나는 과정을 7단계로 나눈 것을 말한다. 7 계층은 왜 나눌까? 통신이 일어나는 과정을 단계별로 알 수 있고, 특정한 곳에 이상이 생기면 그 단계만 수정할 수 있기 때문이다. 1. 물리 계층(Physical): 단지 데이터 전기적인 신호로 변환해서 주고받는 기능을 진행하는 공간 즉, 데이터를 전송하는 역할만 진행한다. 2. 데이터 링크 계층(Data Link): 물리..

Tistory

*재귀함수* division

재귀 함수 문제입니다. 핵심 숫자가 작아지는 형태로 나타나야 한다. 재귀 함수를 만들 때, 매개변수로 값의 합과 인덱스 위치를 나타내는 값을 사용한다. 정답 코드 import java.util.Scanner; public class Main { static int[] result; static int n; static int count; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); result = new int[n]; division(0,0); System.out.println(count); } //현재까지 구한 합이 mysum //index번째 숫자를 결정할 차례 result[..

Tistory

[백준] 2204번 도비의 난독증 테스트(java)

https://www.acmicpc.net/problem/2204 2204번: 도비의 난독증 테스트 꿍은 도비에게 영어단어들을 제시한 후 어떤 단어가 대소문자를 구분하지 않고 사전순으로 가장 앞서는지 맞추면 양말을 주어 자유를 얻게해준다고 하였다. 하지만 인성이 좋지 않은 꿍은 사실 www.acmicpc.net 2204번 도비의 난독증 테스트 문제 링크입니다. 핵심 HashMap을 사용하여 기존의 문자열을 저장해주고, 전부 소문자로 바꾼다. 정답 코드 import java.util.Arrays; import java.util.HashMap; import java.util.Scanner; public class Main { public static void main(String[] args) { Scann..

Tistory

[프로그래머스]문자열 내 마음대로 정렬하기(java)

https://school.programmers.co.kr/learn/courses/30/lessons/12915 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 프로그래머스 문자열 내 마음대로 정렬하기 문제 링크입니다. 핵심 이 문제에서 핵심은 정렬을 하는데, 문자열에서 원하는 index의 문자를 비교하여 정렬해야 한다. 정답 코드 import java.util.*; class Solution { public String[] solution(String[] strings, int n) { String[] answer = {}; List list = new..

Tistory

*에라토스테네스의 체* chebyshevtheo

수학에서 에라토스테네스의 체는 소수를 찾는 방법이 다. 1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 2. 2는 소수이므로 자기 자신을 제외한 모든 배수를 지운다. 3. 남아있는 수 중에 가장 작은 수인 소수 3을 제외하고 다시 3의 모든 배수를 지운다. 4. 다음은 남아있는 소수 5를 제외하고 5의 배수를 모두 지운다. 5. 이것을 반복한다. 핵심 위 문제를 풀기 위해 앞서 살펴본 에라토스테네스의 체 알고리즘을 사용한다. 정답 코드 import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.i..

Tistory

정렬-2

더 빠르게 정렬할 수는 없을까? 기존의 정렬의 시간 복잡도는 O(n^2) 걸리지만 오늘 배울 합병 정렬과 퀵 정렬은 시간 복잡도가 O(n log n)이 걸리게 된다. 두 정렬은 모두 재귀를 사용하게 된다. 재귀 함수 디자인의 과정 1. 작성하려는 함수의 역할을 말로 명확하게 정의한다. 2. 함수가 기저 조건에서 제대로 동작하게 작성한다. 3. 함수가 제대로 동작한다고 가정하고 함수를 완성한다. 4. 함수를 완성한 후, 기저 조건으로 수렴함을 보인다. 합병 정렬 배열을 절반으로 나누어 각각을 정렬한 후, 합친다. T(n) = n개의 숫자를 합병 정렬할 때의 시간 복잡도 1. 왼쪽 합병 정렬 = T(n/2) 2. 오른쪽 합병 정렬. = T(n/2) 3. 합친다. = O(n) 점화식 = T(n) =2*T(n/..

Tistory

*String* 문자열 압축

String관련 문제입니다. 핵심 문자가 연속해서 나오는지 확인해야 한다. 1번만 나올 경우 1은 생략한다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); String str = sc.nextLine()+" "; StringBuilder sb = new StringBuilder(); int count = 1; for (int i=0;i

Tistory

*완전 탐색* tetris

완전 탐색 문제입니다. 핵심 우선 세로 길이가 4인 블록을 넣을 수 있는지를 확인해야 한다. 가능하다면, 블록을 넣고 그때의 점수를 찾고, 다시 블록을 지우는 것이 핵심이다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int c = sc.nextInt(); //가로 int r = sc.nextInt(); //세로 //값넣기 int[][] arr = new int[r + 1][c + 1]; for (int i = 1; i

Tistory

시간복잡도(기본)

문제를 효율적으로 해결하는 것은 무엇일까? 똑같은 문제를 해결해도 빠르게 해결하는 것이 중요하다. 같은 입력을 제공했을 때, 어느 프로그램이 더 빠른가? 내 프로그램은 얼마나 빠를까? 라는 의문을 가지고 나오게 된 것이 시간 복잡도이다. 프로그램이 대략적으로 몇 개의 명령을 수행하는가? public class Main { public static void main(String[] args) { int a =1, b= 5; int sum = a+b; System.out.println(sum); } } 위와 같은 코드는 a, b를 선언하고 sum 에다 a+b 값을 넣어주고 출력해주는 코드이다. 위는 대략 3번이 실행되는 데 이것은 O(3)이라고 한다. O는 Big-O를 나타내고 읽을 때는 빅-오 또는 오더라..

Tistory

정렬-1

정렬은 특정 기준을 적용하여 나열하는 것이다. 선택 정렬 선택 정렬이란 최솟값을 앞으로 이동시키는 것이다. import java.util.Arrays; import java.util.Scanner; //선택 정렬 public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; for (int i=0;i

Tistory

Docker설치 및 실행하기

Docker를 사용하는 이유? 1. 운영 표준화 작은 컨테이너식 어플을 사용하면 손쉽게 배포하고, 문제를 파악하고, 수정을 위해 롤백이 가능하다. 2. 원활하게 이전 Docker 기반 어플을 로컬 개발 시스템에서 AWS의 프로덕션 배포로 원활하게 이전할 수 있다. 3. 빠른 코드 전달, 비용 절감 Docker를 쓰면 코드를 더 빨리 전달하고, 라소스 사용률을 높여 비용을 절감할 수 있다. 개발 환경: mac m1 애플 실리콘 , 완성된 스프링 부트 프로젝트(java11, jdk16으로 진행) 1. Homebrew로 Docker 설치하기(터미널 사용) Homebrew란 터미널에서 명령을 실행하는 것만으로, 패키지 설치 및 제거가 용이하게 할 수 있는 Mac 용 패키지 관리 도구이다. Homebrew설치 /..

Tistory

2주차CS스터디Computer Architecture&Java

2주 차에서 다룰 내용은 다음과 같다. 1. Computer Architecture 고정 소수점/ 부동 소수점 패리티 비트/ 해밍 코드 ARM 프로세서 2. Java 고유 락 문자열 클래스 Garbage Collection Primitive type & Reference type Computer Architecture 컴퓨터에서 실수를 표현하는 방법은 고정 소수점과 부동 소수점 두 가지 방식이 존재한다. 고정 소수점/ 부동 소수점 고정 소수점(Fixed Point)이란? 소수점이 찍힐 위치를 미리 정해놓고 소수를 표현하는 방식이다. (정수 + 소수) ex) -6.12345 -> 부호(-)와 정수부(6), 소수부(0.12345) 3가지 요소가 필요함 장점: 실수를 정수부와 표현하여 단순하다. 단점: 표현의..

Tistory

완전탐색

오늘은 완전 탐색 알고리즘에 대해 알아보자 완전탐색 알고리즘이란? 완전탐색은 간단히 가능한 모든 경우의 수를 다 체크해서 정답을 찾는 방법이다. 즉, 무식하게 가능한 거 다 해보겠다는 방법을 의미한다. 이 방법은 무식하게 한다는 의미로 "Brute Force"라고도 부른다. 직관적이어서 이해하기 쉽고 문제의 정확한 결과값을 얻어낼 수 있는 가장 확실하며 기초적인 방법이다. 영어로 brute는 "짐승 같은, 난폭한"이라는 뜻이고, brute-force는 "난폭한 힘, 폭력"이라는 뜻이다. 오래 걸리는 데다 자원이 엄청나게 들어서 얼핏 보면 무식하다고 생각할 수도 있겠지만, 항상 정확도 100%를 보장한다는 점에서 암호 해독법 중 가장 확실하고 무서운 방법이다. 이론적으로 가능한 모든 경우의 수를 다 검색해..

Tistory

*완전 탐색* baseballgame

이번에 풀어볼 문제는 우리가 어릴 때 자주 해보았던 숫자 야구게임이다. 핵심 완전 탐색 문제답게 가능한 모든 수를 대입해보아야 한다. 즉 123~987까지 해당 조건(스트라이크, 볼의 카운트)에 맞다면, 참이 되는 수를 1 추가한다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int [][] arr = new int[105][3]; int n = sc.nextInt(); for (int i=0;i

Tistory

*완전 탐색* seat

완전 탐색 관련 문제입니다. 핵심 문제에서 좌표로 주어진 자리를 우리는 배열을 이용해서 표현해야 한다. 즉 좌표를 x축으로 대칭시킨 모습이 배열과 같다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int width = sc.nextInt(); // 공연장의 가로길이 int height = sc.nextInt(); // 공연장의 세로길이 int order = sc.nextInt(); // 대기순서 int x = 0, y = -1; boolean down = true, up = false, right = false, lef..

Tistory

*완전탐색* colorpaper

완전 탐색 알고리즘 문제입니다. 핵심 문제가 어려워 보일 수 있으나, 단순한 문제이다. 0으로 된 배 열위에 값을 입력받고, 그 값이 몇 번 나왔는지 체크하는 것이다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int[][] arr = new int[101][101]; int n = sc.nextInt(); for (int i=1;i

Tistory

*완전 탐색* attackRange

완전 탐색 알고리즘 문제입니다. 핵심 처음에 이 문제를 풀려고 한다면, 여러 가지 방법을 떠올릴 것이다. 개인적으로 쉬운 방법은 배열의 거리를 구하는 것이다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int X = sc.nextInt(); int Y = sc.nextInt(); int R = sc.nextInt(); for (int i =1; i

Tistory

1주차 CS스터디 Computer Architecture & Java

1주 차에서 다룰 내용은 다음과 같다. 1. Computer Architecture 컴퓨터 구조 기초 컴퓨터의 구성 CPU 작동 원리 캐시 메모리 2. Java 컴파일 과정 Java Virtual Machine Call By Value/Call By Reference Casting AutoBoxing/AutoUnboxing Thread Computer Architecture 컴퓨터 구조 컴퓨터 시스템은 개념적으로는 하드웨어와 소프트웨어, 그리고 펌웨어의 결합으로 이루어진다. 하드웨어(Hardware) 컴퓨터 하드웨어는 컴퓨터 시스템이 작동하는 데 필요한 물리적 구성 요소이다. 하드웨어가 없다면, 컴퓨터를 유용하게 만드는 필수 소프트웨어를 실행할 방법이 없다. 시스템의 속도는 사용하는 하드웨어에 많은 영향..

Tistory

다중 반복문&배열

이번에는 다중 반복문과 배열에 대해 알아보자. 다중 반복문을 보기 전에 반복문의 설명을 보고 오는 것이 좋다. https://kimtaesoo99.tistory.com/45 조건문&반복문(java) 이번에 알고리즘을 다시 공부하면서 자바의 기초와 알고리즘을 정리하기로 하였다. 우선 매우 기초적인 변수의 타입부터 알아보자 변수의 타입 우선 변수란 -> 하나의 값을 저장할 수 있는 기억 kimtaesoo99.tistory.com 다중 반복문은 말 그대로 여러 개의 반복문이 중첩된 것이다. 중첩 for문을 보자 for(int i=2;i

Tistory

*완전 탐색* rook(java,알고리즘)

우선 완전 탐색 알고리즘이란 가능한 모든 경우를 탐색하는 것이다. 아래의 체스 문제를 생각해보면, 룩이 이동 가능한 경우를 모두 탐색해보면 된다. 이때 출력은 1이다. 핵심 이 문제를 풀 때, 어떤 것을 기준으로 할까에 따라 풀이가 살짝 달라진다. 룩을 기준으로 하여, 룩의 이동경로 중 킹이 있다면 1 없다면 0을 출력하면 된다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[][] arr = new int[8][8]; int[] rookX = new int[2]; int[] rookY = new int[2]; i..

Tistory

조건문&반복문(java)

이번에 알고리즘을 다시 공부하면서 자바의 기초와 알고리즘을 정리하기로 하였다. 우선 매우 기초적인 변수의 타입부터 알아보자 변수의 타입 우선 변수란 -> 하나의 값을 저장할 수 있는 기억공간이다. 변수는 크게 기본형과 참조형으로 나눌 수 있다. 크기는 1byte, 2byte, 4byte, 8byte를 나타낸다. 크기가 중요한 이유는 각 변수의 크기를 넘기면 오버플로우가 발생하기 때문이다. 따라서 위 사진의 크기를 잘 지켜서 사용해야 한다. 조건문 조건문에 대해 알아보자. 조건문은 조건식과 실행될 하나의 문장 또는 블록{}으로 구성되어있다. java에는 if문과 swith문이 두 가지의 조건문이 있다. if문을 보자. if (조건식1) { 조건식1의 결과가 참일 때 실행하고자 하는 명령문; } else i..

Tistory

*다중 반복문* 숫자 피라미드(java, 알고리즘)

알고리즘 공부를 하면서, 다시 한번 복습하고, 푸는 방법을 익히는 연습을 하기 위해 이 주제에 대해 글을 쓰기로 하였다. 다중 반복문을 이용한 문제인데, 숫자 피라미드라는 문제이다. 핵심 이 문제의 핵심은 홀수번째 줄에서 숫자가 증가하고, 짝수번째 줄에서는 숫자가 감소하는 것이다. 또한 숫자는 1~9까지만 반복한다. 그리고 출력을 할 때, 왼쪽에서 오른쪽으로 하기 때문에, 각 줄의 첫 번째 수를 찾는 방법 또한 매우 중요하다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int s..

Tistory

*배열* arr3 (java, 알고리즘)

배열을 선언한 뒤 풀어야 하는 arr3문제이다. 핵심 이중 배열을 선언하여, 위치를 나타낸다. 처음에 풀 때는 첫 번째 줄에 배열의 값을 저장한 뒤, 이후 나머지 줄의 배열을 규칙적으로 대입해주었는데, 더욱 쉬운 방법이 있다. 정답 코드 import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n =sc.nextInt(); int[][] arr = new int[105][105]; int x,y; int count=1; for (int i=0;i

Tistory

[백준] 1026번 보물(java)

https://www.acmicpc.net/problem/1026 1026번: 보물 첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거 www.acmicpc.net 백준 1026번 보물 문제 링크입니다. 핵심 A와 B배열을 받아서 두 배열의 값들을 곱해서 최솟값을 만드는 것이다. 쉽게 생각하면, 큰 값과 큰 값이 곱해지면 총합이 커지게 된다. 즉 작은 값과 큰 값을 곱해야 한다. 정답 코드 import java.util.Arrays; import java.util.Collections; import java.util.Scanner; public cla..

Tistory

[백준]1302번 베스트셀러(java)

https://www.acmicpc.net/problem/1302 1302번: 베스트셀러 첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고 www.acmicpc.net 백준 1302번 베스트셀러 문제 링크입니다. 핵심 가장 많이 나온 이름을 구하는 것이다. 이는 Hash를 사용하여 풀 수 있다. value가 같은 값일 때는 사전 순으로 정렬을 해야 한다. 정답 코드 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(S..

Tistory

[백준]1932번 정수 삼각형(java)

https://www.acmicpc.net/problem/1932 1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net 1932번 정수 삼각형 문제 링크입니다. 핵심 이번 문제도 동적 계획법 문제이다. 위에서부터 숫자가 내려가며 합해지는데, 대각선으로 갈 수 있다. 이중 배열을 사용하여 줄의 위치는 앞에 각 값은 뒤에 넣는다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt..

Tistory

[백준]1259번 팰린드롬수(java)

https://www.acmicpc.net/problem/1259 1259번: 팰린드롬수 입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다. www.acmicpc.net 백준 1259번 팰린드롬수 문제 링크입니다. 핵심 이번 문제는 팰린드롬수 문제이다. 1부터 99999까지 숫자가 주어지는데, 이때 중심을 기준으로 좌우가 같은지 판단하여야 한다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static..

Tistory

[백준]1373번 2진수 8진수(java)

https://www.acmicpc.net/problem/1373 1373번: 2진수 8진수 첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다. www.acmicpc.net 백준 1373번 2진수 8진수 문제 링크입니다. 핵심 2진수를 받고서, 그 수를 8진수로 바꾸는 것이다. 문제만 두고 본다면 쉬운 문제이다. 단 10000000의 길이까지 범위가 커질 수 있다. 즉 일반적으로 int 형을 받을 수 없다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.BigInteger; public class Main { p..

Tistory

[백준]2156번 포도주 시식(java)

https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 백준 2156번 포도주 시식 문제 링크입니다. 핵심 이 문제는 저번에 풀었던 계단 오르기와 매우 유사한 문제이다. https://kimtaesoo99.tistory.com/31 [백준]2579번 계단 오르기 https://www.acmicpc.net/problem/2579 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점" data-og-host="www.a..

Tistory

[백준]11053번 가장 긴 증가하는 부분 수열(java)

https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 백준 11053번 가장 긴 증가하는 부분 수열 문제 링크입니다. 핵심 동적 계획법을 사용하여 푸는데, 증가하는 수열을 만들 때, 가장 큰 길이를 구하는 것이다. 그전 값을 비교하며 더 커지면 dp를 증가시키는 형태이다. 정답 코드 import java.util.Scanner; public class Main { publ..

Tistory

[백준]1149번 RGB거리(java)

https://www.acmicpc.net/problem/1149 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 백준 1149번 RGB거리 문제 링크입니다. 핵심 문제를 요약해보면, N개의 집이 있고, 인접한 집은 같은 색을 칠하지 못한다. 각 집마다 빨강, 초록, 파랑의 비용을 준다. DP를 사용하는데, 최소 비용만을 구하는 것이 목적이다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.I..

1 2 3