kimtaesoo99의 등록된 링크

 kimtaesoo99로 등록된 티스토리 포스트 수는 232건입니다.

[LeetCode] 688 - Knight Probability in Chessboard(java) [내부링크]

https://leetcode.com/problems/knight-probability-in-chessboard/ Knight Probability in Chessboard - LeetCode Can you solve this real interview question? Knight Probability in Chessboard - On an n x n chessboard, a knight starts at the cell (row, column) and attempts to make exactly k moves. The rows and columns are 0-indexed, so the top-left cell is (0, 0), and t leetcode.com 오늘 문제는 dp를 이용한 문제이다...

[부스트캠프 웹・모바일 8기] 챌린지 2주차 후기 [내부링크]

시간이 정말 빠르다는 것을 느낀다. 벌써 2주 차가 끝났고, 팀회고까지 마친 이후 회고록 및 후기를 작성하려 한다. 6일 차 후기 조금 더 깊게 생각하고 시작하자. 주제 자체는 스스로에게 자신 있는 미션이었다. 그래서 설계를 재빠르게 마치고 진행을 하였다. 다만 문제가 있었다. 내가 생각한 방식은 기존에 자바에서나 적용할 수 있는 사항이었다. 이를 JS로 구현하기에는 다른 식으로 접근을 했어야 했다. 이를 모르고 삽집을 엄청하다가 다른 캠퍼분의 조언을 듣고 뒤늦게 해결할 수 있었다. 아직까지도 감사하다는 생각을 가지고 있다. 스스로 막혔을 때, 다른 방법도 떠올리는 습관을 가져야 할 것 같다. 7일 차 후기 내가 정말 제대로 했는가? 오늘은 평소보다 일찍 구현을 마쳤고, 학습도 어느 정도 잘했다고 생각하..

[부스트캠프 웹・모바일 8기] 챌린지 1주차 후기 [내부링크]

이번 글을 개발일기로 분류할지 활동으로 분류할지 고민을 하였다. 결론은 부스트캠프 관련 내용이기에 활동으로 분류하였다. 이번 글의 주된 내용은 느낀 점이나 앞으로의 방향성에 대한 이야기이다. 1일 차 후기 기본적인 JS 문법을 익히자 첫날이라 설레는 마음도 컸고, 새로운 사람들과 함께 시작한다는 것이 너무 기대되었다. 오티가 진행된 이후에 처음 미션을 시작하였는데, 처음부터 쉽지는 않았다. 우선 js에 대한 무지함이 바로 드러나버렸다. 미션자체에 대해서는 괜찮다고 생각했는데, 문법을 너무 몰라서 오래 걸렸다. js를 조금 공부하고 시작했음에도 아직 많이 부족하다. 첫날은 그나마 일찍 미션을 종료할 수 있었다. 2일 차 후기 야생에서 살아남는 법을 배우자 우선 미션에 대한 정확한 이해를 못 하고 진행하였다..

[프로젝트] ChatUniv Board API #3 [내부링크]

이번에는 Board API에 관해 정리할 예정이다. 이번 글은 전반적인 코드 설명과 여러 시행착오에 대한 설명을 할 예정이다. Board는 일반적인 게시판과 일치한다. 하지만 코드를 작성할때 컨벤션 및 클린코드를 적용하려 노력하였다. 또한 여러 테스트를 통해 동작을 검증하였고, 그 과정에서 발생한 시행착오를 기록하겠다. Board는 현재 예외에 대한 문서화도 진행되어 있다. Board @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String title; @Column(nullable = false) @Lob ..

[프로젝트] ChatUniv Member API #2 [내부링크]

오늘은 Member API에 관해 정리할 예정이다. 전반적인 코드 설명과 구조 변경에 대한 설명을 할 예정이다. 기존에 Exception과 Advice를 전부 묶어서 관리하였다. 그 결과 각자 개발 후 머지를 하는 과정에서 conflict이 자주 발생하였다. 또한 예외가 많아질수록 관리하기 어렵다는 의견도 많았다. 따라서 도메인별로 예외를 관리하도록 하였다. Member API는 현재 간단하게 되어있다. 추후 추가될 예정이지만 현재는 Member 조회와 비밀번호 변경이 만들어져 있다. Member @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullab..

[부스트캠프 웹・모바일 8기] 온보딩 키트 언박싱 [내부링크]

오늘 온보딩 키트가 도착하였다. 신청할 때부터 어떤 게 들어있을까 궁금하여 구글링을 해봤다. 6기는 과자 스티커, 플래너가 있었고, 7기는 슬리퍼, 스티커, 플래너가 있었다. 사실 과자는 안 좋아해서 만약 과자를 준다면 관상용으로 둘 가능성이 매우 컸다. 또한 슬리퍼는 이미 너무 많기에 딱히 필요하지는 않았다. 말은 이렇게 했지만 사실 어떤 게 오더라도 감사할 따름이다 :) 그리고 오늘 도착하였다! 기대를 안 하려고 했지만 기대가 되는 게 어쩔 수 없는 사람의 심리인 것 같다. 포장부터 더욱 설레게 만들었다 이를 열어보면.. 여러 가지가 들어있는 것을 볼 수 있다. 내용물은 우산, 손풍기, 플래너, 스티커 볼펜이 있었다. 실제 필요한 물품이 들어있어서 매우 만족하였다. 스티커도 마음에 들고, 특히 볼펜이..

[LeetCode] 2024 - Maximize the Confusion of an Exam(java) [내부링크]

https://leetcode.com/problems/maximize-the-confusion-of-an-exam/ Maximize the Confusion of an Exam - LeetCode Can you solve this real interview question? Maximize the Confusion of an Exam - A teacher is writing a test with n true/false questions, with 'T' denoting true and 'F' denoting false. He wants to confuse the students by maximizing the number of consecutive leetcode.com 오늘도 어제와 같은 윈도우 슬라이..

[JAVA] 체스를 구현하면서 배운점 [내부링크]

저번 블랙잭을 이후로 이번에는 체스를 구현해 보았다. 우선 설계를 조금 디테일하게 잡아서 진행하였다. 물론 첫 설계를 끝까지 가져가지는 못했다.. 중간에 추가된 부분이 조금은 있다. 그래도 처음보단 설계하는 실력도 늘었다고 생각한다. 진행하면서 고민하고 배운 것을 정리하였다. 고민했던 것 우선 첫 번째 고민은 각각의 기물들의 위치와 기물을 Map으로 관리하였다. 이때 위치를 단순하게 String으로 관리하려 했다. 하지만 이럴 경우 예외처리를 하는 경계도 애매해지고, 관리하기가 힘들 것 같다고 판단하였다. 그래서 위치 즉 Location도 객체로 관리하여 예외를 처리하도록 하였다. 위치도 더욱 나눌 수 있기 때문에 행과 열을 체스의 용어에 맞게 분리하여 코드를 작성했다. 또 다른 고민으로는 기물이 없는 ..

[LeetCode] 209 - Minimum Size Subarray Sum(java) [내부링크]

https://leetcode.com/problems/minimum-size-subarray-sum/ Minimum Size Subarray Sum - LeetCode Can you solve this real interview question? Minimum Size Subarray Sum - Given an array of positive integers nums and a positive integer target, return the minimal length of a subarray whose sum is greater than or equal to target. If there is no such subarr leetcode.com 전형적인 윈도우 슬라이딩 문제이다. 난이도가 높지 않고 매우 ..

네이버 부스트캠프 8기 웹, 모바일 합격 & 후기 [내부링크]

우선 제목에서 알 수 있듯이 네부캠 8기 풀스택 분야에 합격하였다. 그 과정에서 내가 느낀 감정이나 약간의 팁을 공유하려고 한다. 서류 접수 서류 접수의 경우 요구하는 글자수나 문항수가 많지 않았기에 처음에는 간단하다고 생각하였다. 하지만 오히려 글자수 제한이 적다 보니 모든 것을 담아내는데 어려움이 있었다. 내 생각에는 솔직함이 가장 중요하다고 생각했다. 물론 본인이 어필할 수 있는 부분은 어필하면서 솔직함을 드러내자. 자기 주도적 학습 열정/실천/몰입 의견 공유/ 협업 이러한 키워드를 가지고 본인을 표현하고자 한다면 큰 무리가 없다고 생각한다. 1차 온라인 코딩 테스트 cs 객관식 10문제 + 프로그래밍 2문제, 검색 가능, IDE 불가능 우선 정말 솔직하게 말하자면 준비를 안 했다. 알고리즘의 경우..

[프로젝트] ChatUniv 전반적인 설계 및 Auth구조 #1 [내부링크]

방학 동안에 프로젝트를 진행하기로 하였다. chat ai를 사용하여 대학생들에게 여러 정보를 전달해 주는 등 여러 기능을 추가할 생각이다. 이 프로젝트는 실제 서비스를 할 생각이기에 꼼꼼하게 코드를 작성하고 서로 리뷰를 할 생각이다. 또한 서비스를 통해 트래픽을 받아보는 경험을 할 수 있을 것이라 생각된다. 각자 맡은 파트가 있기에 초반 Auth 구조의 경우 내가 개발을 하지는 않았지만 이 프로젝트를 통해 서로 모두 공부의 목적도 있기에 모든 코드를 이해하고, 분석하며 코드리뷰를 진행했다. 또한 컨벤션을 정하여 이를 기준으로 작성하기로 하였다. 코드의 통일성 및 가독성을 위한 선택이다. Merge도 매우 신중하게 진행되며, 코드리뷰를 2인 이상 받아야지만 Merge가 가능해진다. 또한 백엔드의 경우 Lo..

[LeetCode] 1601 - Maximum Number of Achievable Transfer Requests(java) [내부링크]

https://leetcode.com/problems/maximum-number-of-achievable-transfer-requests/ Maximum Number of Achievable Transfer Requests - LeetCode Can you solve this real interview question? Maximum Number of Achievable Transfer Requests - We have n buildings numbered from 0 to n - 1. Each building has a number of employees. It's transfer season, and some employees want to change the building they re leetc..

[LeetCode] 864 - Shortest Path to Get All Keys(java) [내부링크]

https://leetcode.com/problems/shortest-path-to-get-all-keys/ Shortest Path to Get All Keys - LeetCode Can you solve this real interview question? Shortest Path to Get All Keys - You are given an m x n grid grid where: * '.' is an empty cell. * '#' is a wall. * '@' is the starting point. * Lowercase letters represent keys. * Uppercase letters represent lock leetcode.com 친구의 추천으로 리트코드 문제를 처음 풀어보았다..

[개발일기#9] 1년 [내부링크]

개발일기(23.6.27) 비교적 빠른 일자에 개발일기를 작성한다. 방학이 시작된지 1~2주 정도 되었다. 현재 나는 자바, 스프링을 위주로 다시 학습하고 있다. 자바는 저번에 말했듯이 구현을 통해 내가 이론을 알았지만 실제로 적용하며 느끼는 것이 많았다. 이는 바로 아래 포스팅에 자세하게 적어두었다. https://kimtaesoo99.tistory.com/222 [JAVA] 블랙잭을 구현하면서 배운 점 평소에 자바를 어느 정도 잘 안다고 생각하였지만, 실제 어떠한 요구사항이 있었을 때 이를 구현하는데 생각보다 어렵다는 것을 느꼈다. 기본기가 매우 중요하고 자바를 이론으로 아는것과 실 kimtaesoo99.tistory.com 현재는 다른 구현을 통해 자바를 더 학습하고 있다. 현재 진행 중인 구현도 완..

[JAVA] 블랙잭을 구현하면서 배운 점 [내부링크]

평소에 자바를 어느 정도 잘 안다고 생각하였지만, 실제 어떠한 요구사항이 있었을 때 이를 구현하는데 생각보다 어렵다는 것을 느꼈다. 기본기가 매우 중요하고 자바를 이론으로 아는것과 실제 적용하며 몸으로 깨닫는 것은 매우 큰 차이가 있기에, 평소에도 도움을 많이 받는 친구에게 코드리뷰를 받으며 블랙잭을 구현해 보았다. 그 과정에서 내가 느끼고 배운 것을 정리하려고 이 글을 작성한다. 배운 점 기본적인 자바 컨벤션, 클린코드, 네이밍 평소에도 이론적으로는 어느 정도 알고 있다고 생각하였지만, 스스로가 많이 놓치고 있는 부분이었다. 개행을 어느 부분에서 해야 하고, 메서드 순서를 어떤 식으로 해야 하는지에 대해 무지했던 것이다. 우선 개행의 경우 변수를 선언할 때 접근자가 달라지거나 final 키워드의 유무에..

[AWS] 클라우드 [내부링크]

기존에서는 데이터 센터를 직접 구축하고, 서버, 스토리지, db, 네트워크 시스템을 구축하고 소유하며 운영 관리해야했다. (시간과 노력이 많이 필요함) 클라우드는 인터넷을 통해 IT리소스나 애플리케이션을 필요시에 사용하고 사용한 만큼만 비용을 지불하고 사용하는 서비스(관리나 운영에 대해 신경쓸 필요가 없음) 클라우드는 구름 즉 인터넷을 통해 원격지에 있는 IT리소스를 이용하는 서비스다 클라우드 컴퓨팅에서는 인프라르 더 이상 하드웨어라고 생각하지 않고 소프트웨어라고 생각하고 사용할 수 있다. IT 인프라를 프로그래밍 가능한 리소스로 사용하면 기존의 방식과는 다른 방법으로 빠르게 인프라를 구축하고 해체할 수 있다 이러한 리소스에 액세스하여 보다 다이나믹하게 혁신을 만들어 갈 수 있다. 더 큰 용량, 높은 컴..

[개발일기#8] 나를 위한 일기 [내부링크]

최소 신장 트리 •트리(Tree)는 싸이클이 없는 연결 그래프, n개의 정점(vertex)을 가지는 트리는 n-1개의 간선(edge)을 가짐 •신장 트리(Spanning Tree)는 그래프 G(V,E)에서 정점 집합 V를 그대로 두고 간선을 |V|-1개만 남겨 트리가 되도록 만든 것 (|V|=n) •너비 우선 트리와 깊이 우선 트리도 신장 트리 •간선 가중치의 합이 가장 작은 트리를 최소 신장 트리 (Minimum Spanning Tree, MST)라 함 -> 최소 신장 트리를 대표하는 알고리즘으로는 프림 알고리즘과 크루스칼 알고리즘이 존재한다. 프림 알고리즘(Prim’s Algorithm) 프림 알고리즘은 로버트 프림(Robert C. Prim)이 만든 최소 신장 트리 알고리즘이다. 프림 알고리즘은 최..

최소 신장 트리(Minimum Spanning Tree, MST) [내부링크]

최소 신장 트리 •트리(Tree)는 싸이클이 없는 연결 그래프, n개의 정점(vertex)을 가지는 트리는 n-1개의 간선(edge)을 가짐 •신장 트리(Spanning Tree)는 그래프 G(V,E)에서 정점 집합 V를 그대로 두고 간선을 |V|-1개만 남겨 트리가 되도록 만든 것 (|V|=n) •너비 우선 트리와 깊이 우선 트리도 신장 트리 •간선 가중치의 합이 가장 작은 트리를 최소 신장 트리 (Minimum Spanning Tree, MST)라 함 -> 최소 신장 트리를 대표하는 알고리즘으로는 프림 알고리즘과 크루스칼 알고리즘이 존재한다. 프림 알고리즘(Prim’s Algorithm) 프림 알고리즘은 로버트 프림(Robert C. Prim)이 만든 최소 신장 트리 알고리즘이다. 프림 알고리즘은 최..

[JAVA] 리플렉션(Reflection) [내부링크]

리플렉션(Reflection)이란? 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말하며, 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법이라 할 수 있다. 언제 사용할까? 동적으로 클래스를 사용해야 할 때 사용한다. 다시 말해, 작성 시점에는 어떠한 클래스를 사용해야 할지 모르지만 런타임 시점에서 가져와 실행해야 하는 경우 필요하다. 프레임워크나 IDE에서 이런 동적 바인딩을 이용한 기능을 제공한다. 리플렉션을 통해 알 수 있는 정보 Class Constructor Method Field 리플렉션 예시 public class Parent { private String str1 ..

[프로그래머스] 경주로 건설(java) [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/67259 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr bfs를 활용한 문제이다. 뿐만 아니라 각 거리의 최솟값도 알아야 하므로 dp의 개념도 필요하다. 핵심 일반 bfs와 다른 점은 이건 이전에 방향이 어디를 향하고 있는지가 중요하다. 직진을 하다가 좌회전이나 우회전을 할 경우 가중치가 달라지기 때문이다. 또한 기본적으로 방문한 곳은 다시 방문하지 않는 것이 일반적이지만, 더욱 작은 값으로 갈 수 있다면 그 값을 들고 다시 방문한다. 정답 코드 im..

객체지향 설계 5원칙(SOLID) [내부링크]

객체지향 프로그래밍의 5가지 설계 원칙, SOLID SOLID란 객체 지향 프로그래밍을 하면서 지켜야 하는 5대 원칙으로 각각 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), DIP(의존 역전 원칙), ISP(인터페이스 분리 원칙)의 앞글자를 따서 만들어졌다. SOLID 원칙을 철저히 지키면 시간이 지나도 변경이 용이하고, 유지보수와 확장이 쉬운 소프트웨어를 개발하는데 도움이 되는 것으로 알려져 있다. SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open Closed Priciple): 개방 폐쇄 원칙 LSP(Listov Substitution Priciple): 리스코프 치환 원칙 ISP(Interface Segregat..

[JAVA] 불변 객체를 사용해야 하는 이유 [내부링크]

불변 객체(Immutable Object)란? 불변 객체란 객체 생성 이후 내부의 상태가 변하지 않는 객체이다. 불변 객체는 read-only 메소드만을 제공하며, 객체의 내부 상태를 제공하는 메소드를 제공하지 않거나 방어적 복사(defensive-copy)를 통해 제공한다. Java의 대표적인 불변 객체로는 String이 있다. String name = "Immutable"; name.toCharArray()[0] = 'A'; System.out.println(name); //Immutable Java의 String은 불변 클래스이기 때문에 위와 같이 String 내부의 char형 배열을 얻어 수정하여도 반영이 되지 않는다. Java에서는 배열이나 객체 등의 참조(Reference)를 전달한다. 그렇기..

이터레이터 패턴(Iterator Pattern) [내부링크]

이터레이터 패턴 행위 패턴 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해 주는 패턴 이터레이터 패턴을 사용하면 집합체 내에서 어떤 식으로 일이 처리되는지 몰라도 그 안에 들어있는 항목들에 대해서 반복작업을 수행할 수 있다. 보통 프로그래밍을 하면서 반복문을 돌리려면 for문을 사용한다. for (int i = 0; i < n; i++) { System.out.println(array[i]); } for 문의 초기화문에서 흔희 사용되는 변수 i는 배열이 주어질 때 각각의 요소에 차례대로 접근하기 위해 사용된다. 이렇게 사용되는 변수 i의 역할을 추상화한 것이 Iterator 패턴이다. 이터레이터 패턴 사용 예시 Iterator 집합체의 ..

객체지향의 사실과 오해(7장) [내부링크]

오늘은 객체지향의 사실과 오해 마지막장인 7장의 내용을 정리하였다. 코드와 모델을 밀접하게 연관시키는 것은 코드에 의미를 부여하고 모델을 적절하게 한다.- 에릭 에반스 개념 관점 설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현 실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심 명세 관점 사용자의 영역인 도메인을 벗어나 개발자의 영역인 소프트웨어로 초점을 옮김 객체들의 책임에 초점을 맞추어 객체의 인터페이스를 바라보고 객체가 협력을 위해 '무엇'을 할 수 있는가를 생각 -> 명세 관점과 구현 관점을 명확하게 분리 구현 관점 프로그래머에게 가장 익숙한 관점, 실제 작업을 수행하는 코드와 연관 객체들이 책임을 수행하는데 필요로 하는 동작하는 코드 작성 인터페이스를 구현하는데 필요한..

다양한 가비지 컬렉션(Garbage Collection) 알고리즘 [내부링크]

다양한 가비지 컬렉션(Garbage Collection) 알고리즘 JVM이 메모리를 자동으로 관리해 주는 것은 개발자의 입장에서 상당한 메리트이다. 하지만 문제는 GC를 수행하기 위해 Stop The World에 의해 애플리케이션이 중지되는 것에 있다. Heap의 사이즈가 커지면서 애플리케이션의 지연(Suspend) 현상이 두드러지게 되었고, 이를 막기 위해 다양한 Garbage Collection(가비지 컬렉션) 알고리즘을 지원하고 있다. Serial GC Serial GC의 Young 영역은 앞서 설명한 알고리즘(Mark Sweep)대로 수행된다. 하지만 Old 영역에서는 Mark Sweep Compact 알고리즘이 사용되는데, 기존의 Mark Sweep에 Compact라는 작업이 추가되었다. Com..

[JAVA] Private 메서드 테스트 방법 및 지양하는 이유 [내부링크]

Private 메소드를 테스트하는 방법 예를 들어 id를 만들때 해당 id의 길이가 2에서 10 사이가 아니라면 UUID를 생성하여 반환하는 다음과 같은 코드가 있다고 하자. @Service public class PrivateTestClass { public String makeID(String id) { if (isCollectID(id)) { return id; } return UUID.randomUUID().toString().substring(0,10); } private boolean isCollectID(String id) { return 2

[프로그래머스] 수식 최대화(java) [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/67257 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는 각각의 연산자에 우선순위를 부여하여 각각의 우선순위대로 계산했을 때 절댓값이 가장 큰 경우를 찾는 것이다. 핵심 연산자가 +, -, * 3가지이기 때문에 연산자의 우선순위의 경우의 수는 6가지이다. 따라서 다소 빡구현을 통해 풀 수 도 있지만, 조합을 이용하면 더 간결하게 작성할 수 있다. 정답 코드 import java.util.ArrayList; import java.util.Lis..

[JAVA] 가비지 컬렉션(Garbage Collection)의 개념 및 동작 원리 [내부링크]

가비지 컬렉션(Garbage Collection) 개발을 하다 보면 유효하지 않은 메모리인 가비지(Garbage)가 발생한다. C/C++에서는 메모리 누수(Memory Leak)를 막기 위해 객체를 생성한 후 사용하지 않는 객체의 메모리를 프로그래머가 직접 해제해주어야 한다. 하지만 JAVA는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해 주기 때문에 프로그래머가 직접 해제할 필요가 없다. 일반적으로 다음과 같은 경우에 GC의 대상이 된다. 객체가 NULL인 경우 (ex. String str = null) 블럭 실행 종료 후, 블럭 안에서 생성된 객체 부모 객체가 NULL인 경우, 포함하는 자식 객체 Java에서는 메모리 누수를 방지하기 위해 가비지 컬렉터(Garbage Collector, G..

[JAVA] JVM 동작원리 및 기본 개념 [내부링크]

JAVA 탄생 배경 JAVA는 썬 마이크로시스템즈의 제임스 고슬링이라는 사람과 다른 연구원들이 개발한 프로그래밍 언어이다. 1991년 그린 프로젝트라는 이름으로 시작해 1995년에 발표가 되었다. 제임스 고슬링은 가전제품 내에 탑재해 동작하는 프로그램을 개발하려고 하는 데 그 당시에는 유닉스 기반의 배경을 가지고 있었기 때문에 사용하던 프로그래밍 언어 C/C++의 특성상 여러 하드웨어를 커버하기에는 같은 기능의 소스를 각 하드웨어에 맞게 작성해야 하는 번거로움이 있었기에 JAVA를 개발하게 되었다. JAVA의 가장 큰 특징 중 하나가 컴파일된 코드가 플랫폼 독립적이라는 점이다. 즉 어느 플랫폼이든 작성한 소스를 변경할 필요 없이 다 실행시킬 수 있다. 이러한 특징을 구현하기 위해서는 JVM(JAVA Vi..

[프로그래머스] 보석 쇼핑(java) [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/67258 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 투 포인터를 사용하는 문제이다. 핵심 모든 종류의 보석을 갖는 경우를 알아야 하고 만약 모든 보석을 가지고 있다면 1칸씩 당기면서 보석을 버리고, 그때도 모든 종류의 보석을 가지고 있는지 체크하며 최소의 길이를 찾아야 한다. 정답 코드 import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.ut..

필터(Filter) vs 인터셉터(Interceptor) 차이 [내부링크]

Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그중에서 필터(Filter) vs 인터셉터(Interceptor)의 차이에 대해 알아보자 필터(Filter) 필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. 디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리가 되는 것이다. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너(서블릿 컨테이너)에 의해 관리가 되는 것이고(스프링 빈으로 등록은 된다), 디스패처 서블릿 전/후..

[JAVA] Optional 잘 사용하는 방법 [내부링크]

Java 언어 설계자인 Brain Goetz는 Optional을 만든 의도를 아래와 같이 작성했다. API Note: Optional is primarily intended for use as a method return type where there is a clear need to represent "no result," and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance. 메소드가 반환할 결과 값이 '없음'을 명백하게 표현할 필요가 있고, null 을 반환하면 에러가 발생..

프록시 패턴(Proxy Pattern) [내부링크]

프록시 패턴 프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미이다. 일종의 비서라고 생각하면 쉽다. 사장실에 바로 들어가서 사장님을 바로 만나는 게 아닌 비서를 통해 사장님을 만나는 개념이라 생각할 수 있다. 어떤 객체를 사용하고자 할 때, 객체를 직접 참조하는 것이 아니라 해당 객체를 대행하는 객체를 통해 대상 객체에 접근하는 방식을 사용하면 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고, 실제 객체의 기능이 반드시 필요한 시점까지 객체의 생성을 미룰 수 있다. 프록시가 사용되는 대표적인 3가지 가상프록시 꼭 필요로 하는 시점까지 객체의 생성을 연기하고, 해당 객체가 생성된 것처럼 동작하도록 만들고 싶을 때 사용하는 패턴이다. 프록시 클래스에서 자잘한 작업들..

의존성 주입(Dependency Injection) [내부링크]

의존성 주입(Dependency Injection) 이란? DI란 외부에서 두 객체 간의 관계를 결정해 주는 디자인 패턴으로, 인터페이스를 사이에 두어 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해 준다. 의존성이란 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다. public class Shop { private Book book; } Shop 객체가 Book 객체를 사용하고 있는 경우에 Shop 객체가 Book 객체에 의존성이 있다고 표현한다. 그리고 두 객체 간의 관계를 맺어주는 것을 의존성 주입이라고 한다. Book book = new Book(); Shop shop = new Shop(book); 의존성..

옵저버 패턴(Observer Parttern) [내부링크]

옵저버 패턴 옵저버패턴이란 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 어떤 객체의 변경 사항이 발생하였을 때 이와 연관된 객체들에게 알려주는 디자인 패턴이라고 생각하면 된다. 옵저버 패턴에는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)가 존재하며 이들의 관계는 1:1이 될 수도 있고 1:N이 될 수 있다. 옵저버 패턴 사용 예시 공지사항을 알릴 때를 예제로 공지사항을 전파할 때(상태변화) 옵저버와 관련된 객체들(유저들)에게 통지하도록 하는 간단한 예제를 옵저버 패턴으로 만들 수 있다. public interface Observ..

@Autowire 빈 탐색 전략 [내부링크]

빈(Bean) 등록과 조회 규칙 Spring은 기본적으로 메서드/클래스의 이름을 Bean의 이름으로 사용한다. @Bean public DiscountPolicy fixDiscountPolicy() { return new FixDiscountPolicy(); } @Bean public DiscountPolicy rateDiscountPolicy() { return new RateDiscountPolicy(); } 직접 빈의 이름을 부여할 수 있다. @Bean("fixDiscountPolicy") public DiscountPolicy fixDiscountPolicy() { return new FixDiscountPolicy(); } @Bean("rateDiscountPolicy") public Discou..

전략 패턴(Strategy Pattern) [내부링크]

소프트웨어 개발 과정에서 코드의 유연성과 재사용성은 매우 중요하다. 이를 위해 객체 지향 프로그래밍에서 다양한 디자인 패턴들이 개발되었는데, 그중에서도 전략 패턴은 유연한 소프트웨어 설계를 구현하는 핵심적인 기법 중 하나이다. 전략 패턴은 알고리즘을 독립적으로 정의하고, 실행 시에 필요한 알고리즘을 동적으로 변경할 수 있는 방법을 제공한다. 전략 패턴 전략 패턴은 알고리즘을 정의하는 인터페이스를 만들고, 이를 구체적인 알고리즘 클래스들로 구현하여 실행 시에 알고리즘들을 변경할 수 있도록 한다. 이를 통해 동일한 작업을 수행하는 여러 알고리즘들을 쉽게 추가하고 변경할 수 있다. 이를 통해 코드의 유연성과 확장성을 크게 향상할 수 있다. 아래와 같은 구조를 가진다. 시나리오는 간단하다. 쇼핑카드에 여러 가지..

객체지향의 사실과 오해(6장) [내부링크]

오늘은 6장의 내용을 정리하였다. 유일하게 변하지 않는 것은 모든 것이 변한다는 사실뿐이다. - 헤라클레이토스 기능 설계 vs 구조 설계 기능 측면의 설계 제품이 사용자를 위해 무엇을 할 수 있는가에 초점 구조 측면의 설계 제품의 형태가 어떠해야 하는지에 초점 -> 기능과 구조 두 측면이 조화를 이루도록 만들어야 한다. 훌륭한 기능이 훌륭한 소프트웨어를 만드는 충분조건이라면 훌륭한 구조는 훌륭한 소프트웨어를 만들기 위한 필요조건 소프트웨어가 사용자에게 가치 있는 이유는 사용자가 필요로 하는 기능을 제공하기 때문이다. 객체지향 접근방법 변경에 대비하고 변경의 여지를 남겨놓는 가장 좋은 방법은 자주 변경되는 기능이 아닌 안정적인 구조를 중심으로 설계하는 것 안정적인 객체 구조를 바탕으로 시스템 기능을 객체간..

단위테스트? 통합테스트? 런던파 vs 고전파 [내부링크]

단위 테스트 vs 통합 테스트 차이 단위 테스트(Unit Test) 단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다. 여기서 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메서드로 이해할 수 있다. 예를 들어 웹 애플리케이션에서 로그인 메서드에 대한 독립적인 테스트가 1개의 단위테스트가 될 수 있다. 즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트하는 것으로, "어떤 기능이 실행되면 어떤 결과가 나온다" 정도로 테스트를 진행한다. 통합 테스트(Integration Test) 통합 테스트(Integration Test)는 모듈을 통합하는 과정에서 모듈 간의 호환성을 확인하기 위해 수행되는 테스트이다..

[개발일기#7] 중간고사 이후 다시 초심으로.. [내부링크]

개발일기(23.5.7) 나름 오랜만에 개발일기를 작성하게 되었다. 우선 저번 개발일기 이후의 삶은 살짝은 느슨해졌다는 느낌을 스스로 받았다. 저번 개발일기에는 최종 결과를 덤덤하게 받아들이고 다시 추스르고 쉽게 일어날 것처럼 작성하였지만 그 과정이 생각보다 쉽지 않았다. 살짝의 번아웃이 온 것 같았다. 그래도 다행인 것은 개발이 재미없거나 하기 싫다는 감정이 아닌 단순히 무엇을 해야 할지 모르는 막막함이었다. 합격이라는 목표를 가지고 도전하였지만 떨어지니 목표를 잃어버린 느낌이었고 무엇을 준비하고 공부해야 할지 막막하였다. 그렇게 조금은 쉬어가며 재정비하는 시간을 가진 것 같다. 이후 중간고사 기간이 다가와서 중간고사 준비를 하며 살아온 것 같다. 스스로 생각하기에 CS도 매우 중요하기에 학교 수업도 열..

@Configuration안에서 @Bean을 사용해야하는 이유 [내부링크]

Spring에서 수동으로 빈을 등록할 때 @Configuration 클래스 안에서 @Bean을 사용해야 한다. 그 이유를 알아보자. @Configuration안에서 @Bean을 사용해야 하는 이유 스프링에서는 일반적으로 컴포넌트 스캔을 사용해 자동으로 빈을 등록하는 방법을 이용한다. 하지만 @Bean 어노테이션을 사용해 수동으로 빈을 등록해야 하는 경우도 있다. 개발자가 직접 제어가 불가능한 라이브러리를 활용할 때 애플리케이션 전범위적으로 사용되는 클래스를 등록할 때 다형성을 활용하여 여러 구현체를 등록해주어야 할 때 @Bean을 이용한 수동 빈 메서드는 스프링 빈 안에만 구현해 되어 있다면 모두 동작한다. 하지만 스프링은 @Bean은 반드시 @Configuration 어노테이션을 활용하도록 강조한다. ..

@Bean,@Configuration,@Component 차이점 [내부링크]

기존의 Spring MVC는 xml을 활용하여 bean을 등록했다. 하지만 프로젝트 규모가 커지면서 사용하는 요소들을 xml에 등록하는 것은 상당히 번거로워졌다. 따라서 어노테이션을 활용하여 Bean을 등록하는 방법이 생겨났다. Spring Bean Spring에서는 Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)를 Bean이라고 부르며, 이러한 Bean들은 Spring을 구성하는 핵심 요소이다. POJO(Plain Old Java Object)로써 Spring 애플리케이션을 구성하는 핵심 객체이다. Spring IoC 컨테이너(또는 DI 컨테이너)에 의해 생성 및 관리된다. class, id, scope, constructor-arg 등을 주요 속..

@RequestBody, @ModelAttribute, @RequestParam의 차이 [내부링크]

스프링에서 클라이언트로 받은 요청을 객체로 바인딩하기 위해 사용하는 방법을 알아보자. @RequestParam @RequestParam은 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다. @RequestParam은 필수 여부가 true이기 때문에 반드시 해당 파라미터가 전송되어야 한다. 파라미터가 전송되지 않으면 400 에러가 발생한다. 반드시 필요한 값이 아니라면 required를 false로 설정해 주면 되고, defaultValue 옵션을 사용하면 기본값 역시 지정할 수 있다. // searchKeyWord는 required가 false이기 때문에 없을 수도 있으므로, 없다면 기본값이 할당된다. @GetMapping("/list") public ResponseEntity requestParam..

@Controller와 @RestController 차이점 [내부링크]

스프링에서 컨트롤러를 지정해 주기 위한 어노테이션은 @Controller, @RestController가 있다. 둘을 쉽게 생각하면 @RestController == @Controller + @ResponseBody이다. @Controller 전통적인 Spring MVC의 컨트롤러 어노테이션인 @Controller는 주로 View를 반환하기 위해 사용된다. 1. 클라이언트는 URL형식으로 요청을 보낸다. 2. DispatcherServlet이 요청을 위임할 Handler Mapping을 찾는다. 3. Handler Mapping을 통해 요청을 Controller로 위임한다. 4. Controller는 요청을 처리한 후 View Name을 Handler Adapter한테 반환한다. 5. Handler Ad..

[삼성전자 DX] SW역량강화 특강 수료 [내부링크]

오늘 수료증이 발급되었다. 이전 글에 작성하였듯이 방학 동안 알고리즘 특강을 진행하였다. 처음에는 당연하게도 수료까지 과정이 무난하고 쉬울 것이 생각하였다. 하지만 이는 생각보다 쉽지 않았고, 중간에 포기할까라는 생각도 많이 하였다. 이러한 생각을 아마도 나만 한 것은 아니라고 생각한다. 이유는 꽤 많은 사람들이 수료에 실패하였다. (후반에 현재 수료한 사람의 수를 보여줌) 그래도 끝까지 진행하여 수료를 할 수 있게 되었다. 문제를 풀 수 있는 기간을 나중에도 많이 주긴 하지만, 처음부터 밀리면 나중에 점점 힘들어진다.. 수료하고 느낀 점은 삼성이 알고리즘으로 악명이 높다고 알고 있는데, 왜 그런지 알 것 같았다. 과정을 진행하면서 쉬웠던 적이 없었다. 물론 그 덕분에 배운 것도 많았다. 좋은 경험이 되..

객체지향의 사실과 오해(5장) [내부링크]

의도는 "메시징"이다. 훌륭하고 성장 가능한 시스템을 만들기 위한 핵심은 모듈 내부의 속성과 행동이 어떤가 보다는 모듈이 어떻게 커뮤니케이션하는가에 달려있다. - 앨런 케이 자율적인 책임을 위한 자율적 객체 객체지향 공동체를 구성하는 기본 단위는 '자율적'인 객체로 객체들은 애플리케이션의 기능을 구현하기 위해 협력하고, 협력 과정에서 각자 맡은 바 책임을 다하기 위해 자율적으로 판단하고 행동한다. -> 책임은 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이다. 적절한 책임 -> 자율적인 객체들 -> 유연하고 단순한 협력 가능 객체가 자율적? 객체에게 할당되는 책임의 수준 역시 자율적이어야 함 -> 자율적인 객체란 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체 의미 어떻..

팩토리 메소드 패턴(Factory Method Pattern) [내부링크]

팩토리는 공장이란 뜻을 내포하고 있다. 따라서 팩토리 메서드 패턴도 무언가를 위한 공장이라 봐도 무방하다. 일반적으로 팩토리 메서드 패턴을 객체를 만들어내는 부분을 서브 클래스에 위임하는 패턴이라고 말할 수 있다. Factory Method Pattern 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브 클래스가 내린다. 객체 생성을 캡슐화하는 패턴이다. 아래 예시를 보면 쉽게 파악할 수 있다. 로봇이 있고, 이를 슈퍼로봇과 파워로봇으로 구체화할 수 있다. 로봇팩토리를 통해 로봇을 생산할 수 있다. 우선 간략한 구조는 이러하다. Robot(abstract class) SuperRobot PowerRobot RobotFactory(abstract c..

싱글톤 패턴(Singleton Pattern) [내부링크]

싱글톤 패턴 싱글톤 패턴은 특정 클래스의 인스턴스가 오직 하나임을 보장하고, 이 인스턴스에 접근할 수 있는 방법을 제공한다. 즉, 특정 클래스의 객체는 하나만 생성되도록 하여 동일 인스턴스를 재사용하는 패턴이다. Singleton 생성자의 접근자를 private로 설정하여 새로운 인스턴스를 생성하지 못하도록 함 인스턴스의 접근을 위한 오퍼레이션을 static으로 정의하여 해당 메서드에 의해서만 인스턴스에 접근 인스턴스는 싱글턴 객체의 클래스 변수로 설정되어 클래스가 메모리에 데이터영역에 저장될 때 같이 저장됨 오직 한 번만 인스턴스를 생성할 수 있으며, 싱글톤 객체는 유일한 인스턴스의 생성에 대한 책임이 있음 이른 초기화 방식(Eager Initialization) 이른 초기화 방식은 싱글톤 패턴의 가장..

객체지향의 사실과 오해(4장) [내부링크]

오늘은 4장의 내용을 정리하였다. 우리 모두를 합친 것보다 더 현명한 사람은 없다. - 켄 블래차드 객체지향의 설계의 전체적인 품질을 결정하는 것은 개별 객체의 품질이 아니라 여러 객체들이 모여 이뤄내는 협력의 품질이다. 협력 협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작 협력은 다수의 요청과 응답으로 구성되며 전체적으로 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다. 책임 객체가 책임을 가진다. 객체가 어떤 요청에 대해 대답해 줄 수 있거나 적절한 행동을 할 의무가 있는 경우 대상에 대한 요청 -> 그 대상이 요청을 처리할 책임이 있다. 책임의 분류 책임은 객체의 의해 정의되는 응집도 있는 행위의 집합 -> 객체의 책임 : 외부..

[백준] 16234번 인구이동(java) [내부링크]

https://www.acmicpc.net/problem/16234 16234번: 인구 이동 N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모 www.acmicpc.net bfs를 사용하는 구현문제이다. 핵심 이 문제는 어떤 식으로 접근할지 충분히 생각하고 시작하면 쉽게 풀 수 있다. 우선 나는 각각 자리마다 bfs를 하여 이동한 곳을 모두 체크하고, 이후에 체크를 하지 않은 곳을 탐색하는 방법을 사용하였다. 또한 한 번에 bfs로 이동한 곳은 좌표를 담아서 changeMap을 통해 자리의 값을 바꿔주었다. 정답 코드 import java.util.A..

[백준] 3055번 탈출(java) [내부링크]

https://www.acmicpc.net/problem/3055 3055번: 탈출 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제 www.acmicpc.net bfs 문제이다. 핵심 S에서 D로 도달하는 것이 기본적인 목표이다. 하지만 물이 있는 곳은 건널 수 없고, 물 또한 퍼지기 때문에 이를 잘 고민해야 한다. 정답 코드 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { static char[][] map; static int r; st..

객체지향의 사실과 오해(3장) [내부링크]

오늘은 3장의 내용을 정리하였다. 타입과 추상화 지하철 노선도의 추상화 사실적인 정보가 오히려 지하철을 이용하는 승객들로 하여금 노션들을 이해하기 어려움 디자인에서 가장 중요한 것은 얼마나 사실적인 지형 묘사 X -> 역과 역 사이의 연결정보가 얼마나 직관적인가 '정확성'을 버리고 그 '목적'에 집중 꼭 알아야하는 사실만 정확하게 표현하고 몰라도 되는 정보를 무시함으로써 이해하기 쉽고 단순하며 목적이 부합하는 지하철 노선도 추상화 추상화란? 어떤 양상, 세부 사항, 구조를 좀더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복 추상화의 두가지 차원 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해, 단순하게 만든다. 중요한 부분을 강조하기 위해 불..

컴퓨터 시스템의 구성 [내부링크]

컴퓨터의 기본 구성 하드웨어: 컴퓨터에서 각종 정보를 입력하여 처리하고 저장하는 동작이 실제 일어나게 해 주는 물리적인 실체 소프트웨어: 정보 처리의 종류를 지정하고 정보의 이동 방향을 결정하는 동작이 일어나는 시간을 지정해 주는 명령들의 집합 하드웨어 컴퓨터 하드웨어는 중앙 처리 장치, 주기억 장치, 보조 기억 장치, 입출력장치, 시스템 버스로 구성된다. 컴퓨터의 기능을 수행하기 위해 각 구성 요소들은 시스템 버스를 통해 상호 연결되어 있다. 버스: 컴퓨터 안의 부품들 간에, 또는 컴퓨터 간에 데이터와 정보를 전송하는 통로이다. 이러한 표현에는 관련된 모든 하드웨어 부품들 및 통신 프로토콜을 포함한 소프트웨어를 아우른다. 필요에 따라서 세분화된 버스가 존재한다. 중앙 처리 장치(Central Proce..

객체지향 생활 체조 원칙 [내부링크]

객체지향의 중요성을 알게 되고 이러한 객체지향을 잘 적용하기 위해 중요한 9가지 원칙을 정리하기 위해 글을 작성하였다. 객체지향 생활 체조 원칙 9가지 한 메서드에 오직 한 단계의 들여 쓰기만 한다. else 예약어를 사용하지 않는다. 모든 원시 값과 문자열을 포장한다. 한 줄에 점을 하나만 찍는다. 줄여 쓰지 않는다. 모든 엔티티는 작게 유지한다. 3개 이상의 인스턴스 변수를 가진 클래스를 사용하지 않는다. 일급 컬렉션을 쓴다. getter/setter/프로퍼티를 사용하지 않는다. 1. 한 메서드에 오직 한 단계의 들여 쓰기만 한다. (One level of indentation per method) 아래 예시를 보자. public class Map { public String map() { Strin..

데이터베이스 언어 SQL [내부링크]

SQL(Structured Query Language) 관계 데이터베이스를 위한 표준 질의어 비절차적 데이터 언어 SQL의 분류 데이터 정의어(DDL) - 테이블을 생성하고 변경, 제거하는 기능을 제공 데이터 조작어(DML) - 테이블에 새 데이터를 삽입하거나, 테이블에 저장된 데이터를 수정, 삭제, 검색하는 기능을 제공 데이터 제어어(DCL) - 보안을 위해 데이터에 접근 및 사용 권한을 사용자별로 부여하거나 취소하는 기능을 제공 SQL의 데이터 정의 기능 테이블 생성 : CREATE TABLE 테이블 변경 : ALTER TABLE 테이블 삭제 : DROP TABLE 테이블 생성 []의 내용은 생략 가능 SQL 질의문은 세미콜론(;)으로 문장의 끝을 표시 SQL 질의문은 대소문자를 구분하지 않음 속성의..

관계 데이터 연산 [내부링크]

데이터 모델(data model) 데이터 모델링의 결과물을 표현하는 도구 개념적 데이터 모델 - 사람의 머리로 이해할 수 있도록 현실 세계를 개념적 모델링하여 데이터베이스의 개념적 구조로 표현하는 도구 논리적 데이터 모델 - 개념적 구조를 논리적 모델링하여 데이터베이스의 논리적 구조로 표현하는 도구 데이터 모델 = 데이터 구조 + 연산 + 제약조건 관계 데이터 연산 관계 데이터 모델의 연산 원하는 데이터를 얻기 위해 릴레이션에 필요한 처리 요구를 수행하는 것 관계 대수와 관계 해석이 있음 관계 대수와 관계 해석의 역할 데이터 언어의 유용성을 검증하는 기준 관계 대수나 관계 해석으로 기술할 수 있는 모든 질의를 기술할 수 있는 데이터 언어를 관계적으로 완전하다고 판단함 관계 대수의 개념 원하는 결과를 얻기..

관계 데이터 모델 [내부링크]

관계 데이터 모델의 기본 개념 개념적 구조를 논리적 구조로 표현하는 논리적 데이터 모델 하나의 개체에 대한 데이터를 하나의 릴레이션에 저장 관계 데이터 모델의 기본 용어 속성(attribute) 릴레이션의 열, 애트리뷰트 파일 관리 시스템 관점에서 필드(field)에 대응 투플(tuple) 릴레이션의 행 파일 관리 시스템 관점에서 레코드(record)에 대응 도메인(domain) 하나의 속성이 가질 수 있는 모든 값의 집합 속성 값을 입력 및 수정할 때 적합성 판단의 기준이 됨 일반적으로 속성의 특성을 고려한 데이터 타입으로 정의 널(null) 속성 값을 아직 모르거나 해당되는 값이 없음을 표현 차수 하나의 릴레이션에서 속성의 전체 개수 카디널리티(cardicality) 하나의 릴레이션에서 투플의 전체 ..

데이터베이스 시스템(DBS) [내부링크]

데이터베이스 시스템 DBS(DataBase System)이라고 한다. 데이터베이스에 데이터를 저장하고, 이를 관리하여 조직에 필요한 정보를 생성해 주는 시스템 데이터베이스의 구조 스키마 - 데이터베이스에 저장되는 데이터 구조와 제약조건을 정의한 것 인스턴스- 스키마에 따라 데이터베이스에 실제로 저장된 값 3단계 데이터베이스 구조 미국 표준화 기관인 ANSI/SPARC에서 제안 데이터베이스를 쉽게 이해하고 이용할 수 있도록 하나의 데이터베이스를 관점에 따라 3단계로 나눔 외부 단계 - 개별 사용자 관점 개념 단계 - 조직 전체의 관점 내부 단계 - 물리적인 저장 장치의 관점 각 단계별로 다른 추상화 제공 - 내부 -> 외부 단계로 갈수록 추상화 레벨이 높아짐 외부 단계 데이터베이스를 개별 사용자 관점에서 ..

데이터베이스의 기본 개념 [내부링크]

데이터베이스에 대한 중요성을 알게 되고 이를 정리하기 위해 글을 작성한다. 데이터와 정보 데이터: 현실 세계에서 단순히 관찰하거나 측정하여 수집한 사실이나 값(실제 값 그 자체) 정보: 의사 결정에 유용하게 활용할 수 있도록 데이터를 처리한 결과물(가공한 값) 정보시스템: 조직 운영에 필요한 데이터를 수집하여 저장해 두었다 필요할 때 유용한 정보를 만들어 주는 수단 데이터베이스: 정보 시스템 안에 데이터를 저장하고 있다 필요할 때 제공하는 역할 데이터베이스 정의 특정 조직의 여러 사용자가 공유하여 사용할 수 있도록 통합해서 저장한 운영 데이터의 집합 특징 실시간 접근 계속 변화 동시 공유 내용 기반 참조 형태에 따른 데이터의 분류 정형 데이터- 구조화된 데이터(엑셀의 스프레드 시트) 반정형 데이터- 구조..

객체지향의 사실과 오해(2장) [내부링크]

오늘은 2장의 내용을 정리하려고 한다. 앞서 진행한 1장과 같은 방법으로 정리할 것이다. 이상한 나라의 객체 객체지향 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다. 객체를 발견하고 창조하는 것은 지식과 행동을 구조화하는 문제다. - 레베카 워프스브룩 객체지향과 인지능력 소프트웨어 세계는 인간이 인지할 수 있는 다양한 객체들이 모여 이루어져 있다는 믿음으로 시작된다. 객체지향은 현실 세계를 모방하는 것이 아닌 창조하는 일이다. 현실세계와는 다르게 사람의 손길 없이 동작할 수 있다. (스스로 움직이는 자동차, 스스로 불을 껐다 키는 전등) 객체, 그리고 이상한 나라 엘리스는 토끼를 따라가 굴속으로 들어가며 작은 문을 발견한다. 이후 이 ..

객체지향의 사실과 오해 (1장) [내부링크]

이번에 객체지향의 사실과 오해를 읽고, 내용이 너무 좋고 중요하다는 생각이 들었다. 따라서 좋은 동료들과 함께 객체지향의 사실과 오해를 스터디하며 중요한 부분을 복습하기로 하였다. 또한 이를 기록할 예정이다. 오늘의 1장의 내용 중 중요하다고 생각되는 부분을 정리하고 코드로 구현해 보자. 객체지향 프로그래밍이란? 우리는 흔히 현실 세계에 존재하는 사물에 대한 추상화를 객체라고 생각한다. 하지만 객체지향의 목표는 실세계를 모방하는 것이 아니다. 소프트웨어 개발자의 역할은 단순히 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 단순히 우리가 이해를 쉽게 하기 위해 이러한 비유를 계속해서 사용하는 것이다. 협력하는 사람들 커피 공화국의 아침 첫 비유는 한 개발자가 일..

[백준] 4485번 녹색 옷 입은 애가 젤다지? [내부링크]

https://www.acmicpc.net/problem/4485 4485번: 녹색 옷 입은 애가 젤다지? 젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주 www.acmicpc.net 핵심 (0,0)에서 시작하여 (n-1, n-1)로 갈 때 가장 최소의 코인을 잃은 상태로 가야 한다. 즉 다익스트라를 사용해야 한다. 정답 코드 import java.util.ArrayList; import java.util.List; import java.util.PriorityQueue; import java.util.Scanner; class Main { static Lis..

자바 코드 컨벤션 [내부링크]

현재 캡스톤 프로젝트를 진행중인데, 코드 컨벤션에 대한 코드 리뷰를 많이 받았다. 따라서 코드 컨벤션을 정리하고자 글을 작성하였다. 우선 코드 컨벤션이란 실제 지키지 않아도 오류가 발생하는 것은 아니지만, 내가 작성한 코드를 다른 사람들도 쉽게 이해할 수 있는 협업에 있어서 중요한 코드 작성법 규칙이다. 식별자에는 영문/숫자/언더스코어만 허용 변수명, 클래스명, 메서드명 등에는 영어와 숫자만을 사용한다. 상수에는 단어 사이의 구분을 위하여 언더스코어(_)를 사용한다. 정규표현식 `[^A-Za-z0-9_]`에 부합해야 한다. 한국어 발음대로의 표기 금지 식별자의 이름을 한글 발음을 영어로 옮겨서 표기하지 않는다. 한국어 고유명사는 예외이다. 패키지 이름은 소문자로 구성 package com.example...

[백준] 2580번 스도쿠(java) [내부링크]

https://www.acmicpc.net/problem/2580 2580번: 스도쿠 스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루 www.acmicpc.net 백트래킹 문제이다. 핵심 입력값 0 이 있는 곳에 1~9까지 가능한 숫자를 대입하면서 스도쿠를 완성시켜야 한다. 전형적인 백트래킹 문제이다. 정답 코드 import java.util.Scanner; class Main { static int[][] map = new int[9][9]; public static void main(String[] args) { Scanner sc = new Scann..

[개발일기#6] 소마 14기 최종불합격 & 마음가짐 [내부링크]

개발일기(23.3.23) 소마 14기에 지원했었다. 운 좋게 서류, 1차 코테, 2차 코테를 붙고 면접까지 보고 오늘 결과가 나왔다. 결과는 제목에서 알 수 있듯이 불합격하였다. 사실 어느 정도 예상하기도 하였다. 첫 면접이기에 많은 것을 준비하였지만, 정작 기본적인 것을 놓치고 있었다. 당연하게도 아쉬운 마음이 든다. 분명 소프트웨어 마에스트로는 나에게 있어서 좋은 기회일 것 이기 때문이다. 처음 불합격 통보를 받고, 그 사실이 믿기지 않았다. 면접을 망쳤음에도 인간의 욕심이 끝이 없듯이 기대를 하고 있었다. 지금은 이러한 결과를 온전히 받아들일 수 있다. 운이 없었던 점도 있겠지만, 결국 나의 실력이 부족하다는 것이다. 면접준비과정과 면접을 보면서 느낀 점은 잘하는 사람이 정말 많다는 것이다. 면접을..

[백준]14502번 연구소(java) [내부링크]

https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net DFS + BFS문제이다. 핵심 3개의 벽을 반드시 세워야 한다. 처음에는 특정조건에 기둥을 세워야 한다고 생각하였지만, N의 값이 8 이하인 것을 보고 모든 경우의 수를 적용해도 된다. 이후 바이러스를 퍼트린다. 남은 0의 개수를 찾는다. 정답 코드 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public cla..

[백준] 1132번 합(java) [내부링크]

https://www.acmicpc.net/problem/1132 1132번: 합 N개의 수가 주어진다. 이 숫자는 모두 자연수이고, 알파벳 A부터 J가 자리수를 대신해서 쓰여 있다. 이 알파벳은 모두 한 자리를 의미한다. 그리고, 각 자리수는 정확하게 알파벳 하나이다. 0으로 www.acmicpc.net 전에 풀었던 문제에서 조건이 하나 추가되었다. 핵심 위의 문제는 만약 ABC + DAB 라면 100A + 10B +C + 100D+ 10A+B로 둘 수 있다. 이를 110A + 100D +11B +C로 둘 수 있다. 따라서 A에 가장 큰 9, D에 8B에 7C에 6을 넣어주면 된다. 단 새로운 조건이 추가되었다. 맨 앞자리가 0이 되면 안 된다. 위의 경우에는 해당되지 않지만, 수가 많아지면 0의 조건..

[프로그래머스] 순위검색(java) [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/72412 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는 이진탐색을 사용하여 풀 수 있다. 핵심 이 문제는 정확성만 보자면, 완전탐색으로 구할 수 있다. 하지만 효율성을 통과하기 위해 이진탐색을 사용해야 한다. info의 정보를 가지고 "-"를 포함한 모든 조합을 map의 키값으로 가지고 이후 value값을 정렬시켜 이진탐색을 하면 된다. 정답 코드 import java.util.*; class Solution { static Map map;..

[프로그래머스] 메뉴 리뉴얼(java) [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/72411 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 조합을 이용한 문제이다. 핵심 사람들이 주문한 상품들을 갖고 조합을 만들어서 가장 많이 나온 조합으로 메뉴를 만드는 것이다. 로직 자체는 있는 단순하다. 정답 코드 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List;..

[개발일기#5] 2023년 첫 개발일기 및 방학후기 [내부링크]

개발일기(23.3.1) 이전 포스팅에 작성했듯이 우선 인프런강의를 많이 구매했었다. 배움에 대한 욕심이 많았고, 개발을 잘하는 사람이 되고 싶었기 때문이다. 12개를 구매했는데, 총 10개를 수료하였다. 100% 전부 내 것으로 만들었다는 말은 아마 거짓말일 것이다. 그래도 배우면서 전부 하나부터 열까지 타이핑해 보았고, 내 것으로 만들려는 노력을 하였고, 많은 것을 배웠다. 기존에 사용하기만 하고 정확한 개념을 몰랐던 것을 자세히 알게 되었다. 물론 수료를 했다고 끝난 것이 아닌 계속해서 복습할 예정이다. 방학 동안의 기억은 개발밖에 남은 것이 없다. 일주일에 외출을 1번밖에 안 한 것 같다. 또는 아예 외출이 없었다. 물론 운동과 강아지 산책을 제외한 숫자이다. 외출을 하기 전에도 공부는 무조건 하였..

[백준] 1525번 퍼즐(java) [내부링크]

https://www.acmicpc.net/problem/1525 1525번: 퍼즐 세 줄에 걸쳐서 표에 채워져 있는 아홉 개의 수가 주어진다. 한 줄에 세 개의 수가 주어지며, 빈 칸은 0으로 나타낸다. www.acmicpc.net bfs를 이용하여 풀 수 있다. 핵심 2차원 배열을 일렬로 두고 그 값자체를 가지고 판단하면 편하게 구할 수 있다. 값의 위치를 바꿀 때 각각의 index를 알아야 하는데, 이때 StringBuilder를 이용하면 쉽게 위치를 바꿀 수 있다. StringBuilder.setCharAt -> 특정 위치에 char를 삽입할 수 있다. 이를 활용하여 풀어보자. 정답 코드 import java.util.HashMap; import java.util.LinkedList; import..

[백준] 17135번 캐슬 디펜스(java) [내부링크]

https://www.acmicpc.net/problem/17135 17135번: 캐슬 디펜스 첫째 줄에 격자판 행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가 주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다. www.acmicpc.net 조합과 완전탐색을 사용하여 풀 수 있다. 핵심 궁수는 N+1위 치에 3명 배치할 수 있다. 1 턴에 1명을 맞출 수 있고, 다른 궁수도 같은 적을 맞 출 수 있다. 궁수의 위치를 바꾸어가며 그때마다 잡은 적의 수를 카운트해야 한다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; ..

[프로그래머스] 아이템 줍기(java) [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/87694 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr bfs를 사용하는 문제이다. 핵심 문제에서 주어진 사각형들에 대해 겉 테두리만 돌아서 아이템 위치에 가장 빠르게 도착하는 횟수를 구해야 한다. 중요포인트는 map을 2배로 늘리는 것이다. 이유는 맵을 탐색할 때 선이 아닌 좌표 기준으로 하기 때문에 바로 연결되어 있는지 판단하기 쉬운 방법이 2배로 늘리는 것이기 때문이다. 또한 내부 사각형과 테두리값을 구분해야 문제를 풀기 쉽다. 정답 코드 imp..

[프로그래머스] 이모티콘 할인행사(java) [내부링크]

https://school.programmers.co.kr/learn/courses/30/lessons/150368 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 핵심 우리가 각각의 이모티콘을 10,20,30,40 퍼로 할인시킬 수 있다. 이때 구독자수를 최대로 하고, 이후에 가장 많은 돈을 벌게 하자. 이모티콘은 최대 7개이다. 즉 4^7가지의 경우의 수가 생기기 때문에 완전탐색을 사용하였다. 정답 코드 class Solution { static int[] discount = {10,20,30,40}; static int maxOfSubscribe; s..

[백준]15559번 내 선물을 받아줘(java) [내부링크]

https://www.acmicpc.net/problem/15559 15559번: 내 선물을 받아줘 첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000, 1 < N×M ≤ 1,000,000) 둘째 줄부터 N개의 줄에는 구사과가 있는 곳의 지도가 주어진다. 지도에 쓰여 있는대로 이동했을 www.acmicpc.net dfs 문제이다. 핵심 아래 알파벳에 따라 이동하는 길이 정해져 있고, 맵의 크기를 넘어서지 않는다. 즉 무조건 사이클이 생기게 된다. 이때 생기는 사이클의 수를 구하면 된다. 사이클을 구분하기 위해 depth를 증가시키면 탐색한다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; imp..

[백준] 17090번 미로 탈출하기(java) [내부링크]

https://www.acmicpc.net/problem/17090 17090번: 미로 탈출하기 크기가 N×M인 미로가 있고, 미로는 크기가 1×1인 칸으로 나누어져 있다. 미로의 각 칸에는 문자가 하나 적혀있는데, 적혀있는 문자에 따라서 다른 칸으로 이동할 수 있다. 어떤 칸(r, c)에 적힌 문 www.acmicpc.net dfs와 dp를 활용한 문제이다. 핵심 어떠한 발판을 밟는 순간 이후의 동작은 동일해진다. 즉 이후에 탈출을 한다면 그 발판을 밟기 전에도 탈출을 한다는 의미이다. 이러한 사실을 이용해 dp를 적용할 수 있다. 또한 방문했던 곳을 다시 방문한다면 이것은 탈출을 할 수 없다는 의미이다. 이를 활용하여 풀어보자. 정답 코드 import java.util.Scanner; public c..

[백준] 1374번 강의실 [내부링크]

https://www.acmicpc.net/problem/1374 1374번: 강의실 첫째 줄에 강의의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 줄마다 세 개의 정수가 주어지는데, 순서대로 강의 번호, 강의 시작 시간, 강의 종료 시간을 의미한다. 강의 www.acmicpc.net 우선순위 큐를 활용해야 한다. 핵심 시작 시간이 빠른 순으로 정렬 후에 우선큐에서 현재 진행 중인 강의 중 종료 시간이 가장 빠른 강의를 비교한다. 진행 중인 강의의 end값이 다음 강의 start보다 크면 강의실 개수를 1 늘리고, 큐에 다음 강의를 넣는다. 반대의 경우 강의실 1개를 제거한다. 코드를 통해 알아보자. 정답 코드 import java.io.BufferedReader..

[백준] 1342번 행운의 문자열(java) [내부링크]

https://www.acmicpc.net/problem/1342 1342번: 행운의 문자열 민식이와 준영이는 자기 방에서 문자열을 공부하고 있다. 민식이가 말하길 인접해 있는 모든 문자가 같지 않은 문자열을 행운의 문자열이라고 한다고 한다. 준영이는 문자열 S를 분석하기 시작 www.acmicpc.net DFS를 사용하여 풀 수 있다. 핵심 사용할 알파벳이 있느냐, 이전 알파벳이 현재 알파벳과 같으냐 이것을 정의하고 풀 수 있다. 이러한 방법을 사용하면 같은 알파벳이지만, 배열위치가 다른 것도 1번만 확인하게 된다. ex) aba' == a'ba 정답 코드 import java.util.Scanner; public class Main{ static int[] alphabet = new int[27]; ..

[백준] 1034번 램프(java) [내부링크]

https://www.acmicpc.net/problem/1034 1034번: 램프 첫째 줄에 N과 M이 주어진다. N은 행의 개수이고, M은 열의 개수이다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 램프의 상태가 주어진다. 1이 켜져있는 상태이고, 0이 꺼져 www.acmicpc.net 핵심 처음에 이 문제를 완전탐색을 해야 하는 줄 알았다. 하지만 시간복잡도에서 터지게 된다. 이 문제는 실제 스위치를 켜고 끄는 것이 아닌 행의 패턴을 비교하는 작업이 필요하다. 어떠한 패턴과 같은 행이 있다면 스위치를 눌렀을 때 모두 똑같이 변하게 된다. 이를 이용해서 풀어야 한다. 정답 코드 import java.io.BufferedReader; import java.io.IOExcep..

[백준] 13913번 숨바꼭질4(java) [내부링크]

https://www.acmicpc.net/problem/13913 13913번: 숨바꼭질 4 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net BFS를 사용하여 풀 수 있다. 핵심 시작점으로부터 +1,-1, *2 위치로 이동할 수 있다. 한번 방문한 곳은 이전에 방문했을 때가 최소이므로 재방문할 필요가 없다. 또한 이동경로를 구해야 하기 때문에 parent배열을 선언하여 이동 전 위치를 저장한다. 정답 코드 import java.util.LinkedList; import java.util.Queue; i..

[백준] 1753번 최단경로(java) [내부링크]

https://www.acmicpc.net/problem/1753 1753번: 최단경로 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 www.acmicpc.net 다익스트라 문제이다. 핵심 이 문제는 가중치가 있는 다익스트라 문제이다. 가중치가 있기 때문에 클래스를 구현하는 것이 편리하다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; imp..

[백준] 1655번 가운데를 말해요(java) [내부링크]

https://www.acmicpc.net/problem/1655 1655번: 가운데를 말해요 첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1 www.acmicpc.net 우선순위 큐를 사용해야 하는 문제이다. 핵심 단순하게 풀려고 하면 시간복잡도에 의해 실패하게 된다. 따라서 우선순위 큐를 활용하여 풀어야 한다. 작은 값, 큰 값을 우선순위로 갖는 큐를 2개 만든다. 이후 minQ, maxQ라고 한다면, 아래와 같은 로직으로 작동하게 된다. 최대/최소 우선순위 큐의 크기가 같다면 최대 큐에 숫자를 입력해 준다. 같지 않다면 최소 큐에 숫자를 입력해..

[백준] 1644번 소수의 연속합(java) [내부링크]

https://www.acmicpc.net/problem/1644 1644번: 소수의 연속합 첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000) www.acmicpc.net 핵심 우선 소수를 리스트에 담아야 한다. 그러기 위해서는 소수를 찾아야 하는데, 단순한 방법으로 찾게 되면 너무 많은 시간이 걸리게 된다. 따라서 에라토스테네스의 체를 사용해야 한다. 이를 활용해 투포인트를 사용하면 쉽게 구할 수 있다. 정답 코드 import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); List List = ne..

[백준] 1806번 부분합(java) [내부링크]

https://www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. www.acmicpc.net 이 문제는 부분합과 투포인터를 사용하면 쉽게 풀 수 있다. 핵심 연속된 수를 계속해서 더하다가 합이 원하는 s의 값 이상이 되면 시작점을 한 칸 앞으로 당겨온다. 이후 나머지의 합을 비교하여 계속 s이상이면 다시 시작점을 당기고, 아니면 끝지점을 한 칸 올린다. 자세한 건 코드를 통해 확인해 보자. 정답 코드 import java.io.BufferedReader; import jav..

[프로젝트] 커뮤니티 REST API 서버만들기 #10 도메인 테스트 작성 [내부링크]

이번에는 도메인 테스트를 추가하였다. 원래 컨트롤러와 서비스단위에서만 테스트코드를 작성하였는데, 도메인도 추가하였다. 도메인 내에 있는 메서드를 테스트하였다. 코드가 너무 많기 때문에 가장 코드가 길고, 복잡한 Board를 주로 설명하겠다. 기존의 Board이다. Board @Entity @Getter @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class Board extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "board_id") private Long id; @Column(..

[백준] 1240번 노드사이의 거리(java) [내부링크]

https://www.acmicpc.net/problem/1240 1240번: 노드사이의 거리 N(2≤N≤1,000)개의 노드로 이루어진 트리가 주어지고 M(M≤1,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라. www.acmicpc.net dfs를 사용하여 쉽게 풀 수 있다. 핵심 dfs를 사용하면 쉽게 풀 수 있다. 가중치가 있기 때문에 Node라는 클래스를 만들어서 활용하였다. 정답 코드 import java.io.*; import java.util.ArrayList; import java.util.List; public class Main{ static List[] nodes; static boolean[] visited; static int distance; public..

[백준] 1967번 트리의 지름(java) [내부링크]

https://www.acmicpc.net/problem/1967 1967번: 트리의 지름 파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연 www.acmicpc.net 핵심 DFS를 사용하여 풀 수 있다. 실제 부모와 자식관계의 트리이지만 양방향 매핑을 하는 인접 리스트로 표현하였다. 정답 코드 import java.io.*; import java.util.*; public class Main { static int N; static List nodes[]; static boolean[] visited; static int max; publi..

[백준] 2295번 세 수의 합(java) [내부링크]

https://www.acmicpc.net/problem/2295 2295번: 세 수의 합 우리가 x번째 수, y번째 수, z번째 수를 더해서 k번째 수를 만들었다라고 하자. 위의 예제에서 2+3+5=10의 경우는 x, y, z, k가 차례로 1, 2, 3, 4가 되며, 최적해의 경우는 2, 3, 4, 5가 된다. k번째 수가 최 www.acmicpc.net 핵심 x + y + z = k 가 돼야 한다. 각각의 원소는 집합에 포함되어 있다. 또한 각각은 같은 값을 가져도 된다. 단순하게 완전탐색으로 풀면 시간복잡도에서 걸리게 된다. (3중 for문) 따라서 이분탐색을 사용하여 더 빠르게 풀 수 있다. x + y = k -z라는 식을 이용하면 된다. 정답 코드 import java.util.ArrayLis..

[백준] 7662번 이중 우선순위 큐(java) [내부링크]

https://www.acmicpc.net/problem/7662 7662번: 이중 우선순위 큐 입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적 www.acmicpc.net 예전에 프로그래머스에서 똑같은 문제를 풀이했던 적이 있다. 이번에는 우선순위 큐를 사용하는 것이 아닌 다른 방법을 사용하였다. 핵심 https://kimtaesoo99.tistory.com/135 [프로그래머스] 이중우선순위큐 https://school.programmers.co.kr/learn/courses/30/lessons/42628 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포..

[백준] 2206번 벽 부수고 이동하기(java) [내부링크]

https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로 www.acmicpc.net bfs문제이다. 핵심 1은 벽을 의미하고, 0은 이동할 수 있는 길이다. 만약 벽이 있더라도 1번 부수고 이동할 수 있다. 즉 한 번도 벽을 부수지 않음 -> 벽을 부수고 이동 벽을 이미 부순 경우 -> 이동 불가 가 된다. 하지만 벽을 부수지 않고 이동한 경우가 더 빠를 수도 있다. 따라서 벽을 부수고 탐색하는 경우와 부수지 않고 탐색하는 경우를 가지고 처리해 주었다. ..

[백준] 7576번 토마토(java) [내부링크]

https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net bfs 문제이다. 핵심 이 문제는 시작점이 여러 개인 bfs 문제이다. 시작점이 여러 개라고 해서 크게 달라지는 것은 없다. 각 시작점에서 점차 값을 증가시키면 쉽게 풀 수 있다. 정답 코드 import java.util.*; import java.io.*; public class Main { static int N; static int M; static int[][] map; s..

[백준] 10986번 나머지 합(java) [내부링크]

https://www.acmicpc.net/problem/10986 10986번: 나머지 합 수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) www.acmicpc.net 누적합 문제이다. 핵심 이 문제는 연속한 합이 입력값 M으로 나누어지는 케이스를 구하는 것이다. 이를 각 배열의 합, 그때의 나머지를 구하면 아래와 같다. index 0 1 2 3 4 5 arr[i] 1 2 3 1 2 sum[i] 1 3 6 7 9 sum[i]%M 1 0 0 1 0 이때 우선 나머지가 0인 곳은 이전까지의 합이라 생각할 수 있으며, ..

[백준] 11286번 절댓값 힙(java) [내부링크]

https://www.acmicpc.net/problem/11286 11286번: 절댓값 힙 첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0 www.acmicpc.net 이 문제는 이름에서도 알 수 있듯이 힙 문제이다. 문제자체는 매우 단순하다. 핵심 문제를 그대로 해석하면 0이면 절댓값이 작은 수를 반환하고, 0이 아닌 수이면 큐에 넣는 것이다. 우선큐의 Comparator를 재정의하면 쉽게 풀 수 있다. 정답 코드 import java.util.PriorityQueue; import java.util.Scanner; public class..

[백준] 1931번 회의실 배정(java) [내부링크]

https://www.acmicpc.net/problem/1931 1931번: 회의실 배정 (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다. www.acmicpc.net 이 문제는 그리디 카테고리에 있는 문제이다. 핵심 이 문제의 핵심은 어떻게 배정을 해야 많은 사람이 이용할 수 있을까?이다. 끝나는 시간이 빠른 순서대로 정렬을 하고 그에 맞게 회의실에 넣어주면 된다. 코드를 보면 쉽게 이해할 수 있다. 정답 코드 import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Scanner; public class Main { public static void main(..

[SWEA] 10507번 영어 공부- 투 포인터(java) [내부링크]

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXNQOb3avD0DFAXS SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 문제 자체는 간단하고 이해하기 쉽다. 연속해서 출석을 할수록 높은 점수를 받는다. 이미 출석이 되어있고, P 개를 수정하여 가장 큰 연속된 수를 찾는 것이다. 핵심 이러한 문제가 대부분 그러하듯이 브루트포스로 풀게 되면 시간초과가 나오게 된다. 이 문제는 투 포인터를 사용해야 한다. 예제) 5 2 3 5 6 10 11 visited라는 배열에 공부한 날을 체크한다. 이미 출석한 날을 체크 이후 연속..

[백준] 2138번 전구와 스위치(java) [내부링크]

https://www.acmicpc.net/problem/2138 2138번: 전구와 스위치 N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는 상태와 꺼져 있는 상태 중 하나의 상태를 가진다. i(1 < i < N)번 스위치를 누르면 i-1, i, i+1의 세 개의 전구의 상태가 바뀐다. 즉, 꺼져 www.acmicpc.net 핵심 완전탐색을 하면 시간초과가 뜨게 된다. 따라서 다른 방법을 사용해야 한다. 그리디를 사용해서 풀면 쉽게 풀린다. 자기 자신의 스위치를 누르면 양옆과 본인의 스위치가 변한다. 0~n까지 이동할 때, i-1을 바꿀 수 있는 전구는 i 뿐이다. 즉 첫 번째 전구가 꺼진 경우와 켜진 경우 2가지를 나누어서 풀 수 있다. 정답 코드 import java.util.Scann..

[SWEA] 13736번 사탕 분배 - 분할 정복(java) [내부링크]

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AX8BB5d6T7gDFARO&categoryId=AX8BB5d6T7gDFARO&categoryType=CODE&problemTitle=%EC%82%AC%ED%83%95&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 나연이는 A개의 사탕을, 다현이는 B개의 사탕을 갖고 있다. 두 사람은 아래와 같은 작업을 정확히 K번 반복하려고 한다..

[SWEA] 7701번 염라대왕의 이름정렬 - 정렬(java) [내부링크]

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWqU0zh6rssDFARG SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 염라대왕은 이승의 사람들의 모든 이름을 가지고 있다. 어느 날 저승에 일어난 진도 8.0 지진에 항상 정리되어 있던 이승 명부가 흐트러졌다. 이승 명부는 이름의 길이가 짧을수록 이 앞에 있었고, 같은 길이면 사전 순으로 앞에 있었다. 이왕 이렇게 된 김에 모든 이름을 다시 정리하고 같은 이름은 하나만 남겨놓기로 한 염라대왕을 도와주자. 핵심 문제는 매우 단순하다. 우리가 원하는 조건으로 정렬을 하는..

[백준] 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 ..

[백준] 16948번 데스 나이트(java) [내부링크]

https://www.acmicpc.net/problem/16948 16948번: 데스 나이트 게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다. 크 www.acmicpc.net 핵심 bfs를 안다면 매우 쉽게 풀 수 있는 문제이다. 기존에 다루었던 네 방향에서 조금 응용된 느낌이다. 하지만 똑같은 방식으로 풀 수 있다. 정답 코드 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; class Main { ..

Servlet, Spring MVC 정리 [내부링크]

Servlet이란? 서블릿은 클라이언트 요청을 처리하고, 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그램이다. 이전의 웹 프로그램들은 클라이언트의 요청에 대한 응답으로 만들어진 페이지를 넘겨주었으나, 현재는 동적인 페이지를 가공하기 위해서 웹 서버가 다른 곳에 도움을 요청한 후 가공된 페이지를 넘겨주게 된다. 이때 서블릿을 사용하게 되면 웹 페이지를 동적으로 생성하여 클라이언트에게 반환해 줄 수 있다. Servlet의 예시 @WebServlet(name = "helloServlet", urlPatterns = "/hello") public class HelloServlet extends HttpServlet { @Override protected void s..

[프로그래머스] 이중우선순위큐 [내부링크]

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

[프로젝트] 커뮤니티 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..

[프로그래머스] 소수 찾기(java) [내부링크]

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

[프로그래머스] 가장 큰 수(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[]..

[백준] 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..

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

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

[백준] 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의 가치를 넣을..

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

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

[백준] 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을 ..

[프로젝트] 커뮤니티 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..

[프로젝트] 커뮤니티 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..

[프로젝트] 커뮤니티 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..

[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*으로 변환되고 이를 계산한다. 따라서 해당 문제에서는 트리를 입력받고 후위 순..

[프로젝트] 커뮤니티 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..

비트마스크(BitMask) [내부링크]

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

[프로젝트]커뮤니티 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..

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

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

Spring Security + JWT 회원가입, 로그인 기능 구현 [내부링크]

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

[알고리즘랩스]수료 및 후기 [내부링크]

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

QueryDSL [내부링크]

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

[백준]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..

[삼성전자 DX] 알고리즘 특강 [내부링크]

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

[백준]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..

페치 조인 [내부링크]

페치 조인(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; ..

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, ..

JPA의 데이터 타입 [내부링크]

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

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

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

프록시 & 지연로딩 [내부링크]

프록시란? 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..

엔티티 매핑 [내부링크]

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

영속성 컨텍스트 [내부링크]

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

HTTP 상태 코드 [내부링크]

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

빈의 생명주기 [내부링크]

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

컴포넌트 스캔과 의존 관계 자동 주입 [내부링크]

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

스프링 컨테이너와 스프링 빈 [내부링크]

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

[개발일기#4] 2022년의 마지막 개발 일기 [내부링크]

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

Spring Boot 동작 원리 [내부링크]

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

스프링의 핵심 [내부링크]

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

JPA란 무엇인가? [내부링크]

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

*BFS(너비 우선 탐색)* 목수의 미로 탈출 [내부링크]

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

[프로그래머스] 여행경로(java) [내부링크]

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

동적계획법(DP) [내부링크]

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

다익스트라 [내부링크]

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

우아한테크코스 5기 - 불합격 및 배운점 [내부링크]

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

[원티드 프리온보딩] 백엔드 인프라 설계 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에서 사..

[원티드 프리온보딩] 백엔드 인프라 설계 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 + 배포 버전..

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

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

[개발일기#3] 앞으로의 계획 [내부링크]

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

[프로그래머스] 명예의 전당(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..

우아한테크코스 5기 - 4주차 후기 [내부링크]

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

우아한테크코스 5기 - 3주차 후기 [내부링크]

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

너비 우선 탐색(BFS) [내부링크]

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

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차 저장장치에 해당하는 메인..

우아한테크코스 5기 - 2주차 후기 [내부링크]

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

깊이 우선 탐색(DFS) [내부링크]

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

교내 SW 프로그램 경진 대회 수상 및 후기 [내부링크]

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

자료구조(Graph) [내부링크]

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

우아한테크코스 5기 - 1주차 후기 [내부링크]

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

자료구조(Tree) [내부링크]

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

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)란? 대칭키의 키 분배 문제를 해결하기 위해 고안됨.(대칭키일 때는 송수신..

자료구조(Stack&Queue) [내부링크]

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

우아한테크코스5기 - 프리코스 시작전 다짐 [내부링크]

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

*재귀함수* 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=..

[개발일기#2] SW대회 수상 [내부링크]

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

이진탐색 [내부링크]

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

재귀함수 [내부링크]

우선 함수에 대해 알아보자 함수란 값을 입력받아 특정 연산을 수행하여 결과를 반환하는 것이다. 다음은 재귀 함수에 대해 알아보자 자기 자신을 부르는 함수 대표적인 예시는 팩토리얼이다. 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); } } 위 코드를 보면 계속해서 자기 자신을 ..

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): 물리..

[프로그래머스]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

[개발일기 #1] 더욱 열심히하자 [내부링크]

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

[프로그래머스]문자열 내 마음대로 정렬하기(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..

[백준] 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..

*재귀함수* 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[..

*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

정렬-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/..

*에라토스테네스의 체* 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..

정렬-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

시간복잡도(기본) [내부링크]

문제를 효율적으로 해결하는 것은 무엇일까? 똑같은 문제를 해결해도 빠르게 해결하는 것이 중요하다. 같은 입력을 제공했을 때, 어느 프로그램이 더 빠른가? 내 프로그램은 얼마나 빠를까? 라는 의문을 가지고 나오게 된 것이 시간 복잡도이다. 프로그램이 대략적으로 몇 개의 명령을 수행하는가? 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를 나타내고 읽을 때는 빅-오 또는 오더라..

*완전 탐색* 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

완전탐색 [내부링크]

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

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가지 요소가 필요함 장점: 실수를 정수부와 표현하여 단순하다. 단점: 표현의..

Docker설치 및 실행하기 [내부링크]

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

*완전 탐색* 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..

*완전 탐색* 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

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) 컴퓨터 하드웨어는 컴퓨터 시스템이 작동하는 데 필요한 물리적 구성 요소이다. 하드웨어가 없다면, 컴퓨터를 유용하게 만드는 필수 소프트웨어를 실행할 방법이 없다. 시스템의 속도는 사용하는 하드웨어에 많은 영향..

*완전 탐색* 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

*완전탐색* 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

*완전 탐색* 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..

[백준]1213번 팰린드롬 만들기(java) [내부링크]

https://www.acmicpc.net/problem/1213

다중 반복문&배열 [내부링크]

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

*배열* 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

*다중 반복문* 숫자 피라미드(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..

조건문&반복문(java) [내부링크]

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

[백준]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..

[백준] 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..

[백준]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..

[백준]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..

[백준]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..

[백준]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..

[백준]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..

[백준]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..

[백준]1094번 막대기(java) [내부링크]

https://www.acmicpc.net/problem/1094 1094번: 막대기 지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대 www.acmicpc.net 백준 1094번 막대기 문제 링크입니다. 핵심 문제를 해석해보면 매우 쉬운 문제라는 것을 알 수 있다. 64보다 작거나 같은 자연수를 2진수로 바꾸었을 때, 1의 개수를 구하는 것이다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(..

[백준]1463번 1로 만들기(java) [내부링크]

https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 백준 1463번 1로 만들기 문제 링크입니다. 핵심 단순하게 3으로 나누고, 2로 나누고, 1을 빼는 순서로 풀게 된다면, 함정에 걸린 것이다. 바로 10이 그 예시이다. 제일 적게 조합해서 만드는 방법을 0부터 차례대로 생각해야 한다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main{ public static void main(String[] args..

[백준]2579번 계단 오르기(java) [내부링크]

https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net 백준 2579번 계단 오르기 문제 링크입니다. 핵심 계단을 1칸, 2칸 이동 가능하다. 마지막 계단은 반드시 밟아야 한다. 3개 연속으로 계단은 올라갈 수 없다. 가장 중요한 것이 3개의 계단을 연속으로 올라갈 수 없다는 것이다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner ..

[백준]1912번 연속합(java) [내부링크]

https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 백준 1912번 연속합 문제 링크입니다. 핵심 연속된 수의 합이 가장 큰 값을 찾는 것이다. 이전까지 탐색했던 값과 새로운 값을 비교해나가면 쉽게 풀 수 있다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = i..

[백준]9184번 신나는 함수 실행(java) [내부링크]

https://www.acmicpc.net/problem/9184 9184번: 신나는 함수 실행 입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다. www.acmicpc.net 백준 9184번 신나는 함수 실행 문제 링크입니다. 핵심 동적 계획법을 사용하는 것인데, 재귀와 메모이제이션을 사용한다. 정답 코드 import java.util.Scanner; public class Main{ public static int[][][] arr = new int[21][21][21]; public static void main(String[] args) { Scanner sc = n..

[백준]2164번 카드2(java) [내부링크]

https://www.acmicpc.net/problem/2164 2164번: 카드2 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 www.acmicpc.net 백준 2164번 카드 2 문제 링크입니다. 핵심 큐를 사용하면 쉽게 풀 수 있는 문제이다. 가장 먼저 넣은 수를 제거하고, 그 뒤의 수를 맨뒤로 보낸다. 카드가 1개 남았을 때까지 반복한다. 정답 코드 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { public stat..

[멘토링]스프링 Response만들기, 예외처리 추가 [내부링크]

Response을 커스텀하는 이유 -> 기존에 쓰던 ResponeEntity클래스를 통해 리턴해주면 형식을 수정할 수 없음 예외처리 하기 Advice : Exception을 관리하는 중앙관리소 Exception : 예외처리를 위해 우리가 커스텀으로 만드는 Exception 예외처리를 하는 이유 -> 명확한 오류의 이유를 알려주기 위함 패키지 entity - 클래스 Board package com.example.mentoring.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.Entity; import javax.persistence.Gene..

[백준]9663번 N-Queen(java) [내부링크]

https://www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net 백준 9663번 N-Queen 문제 링크입니다. 핵심 N*N크기의 체스판에 N개의 퀸을 놓는다. 퀸은 일직선, 대각선으로 쭉 움직일 수 있다. 즉 각각의 퀸이 일직선과 대각선에 위치하면 안 된다. 1차원 배열을 사용하여, 각 배열의 index를 열, 값을 행으로 본다. 정답 코드 import java.util.Scanner; public class Main { public static int[] arr; publ..

[백준]14888번 연산자 끼워넣기(java) [내부링크]

https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, www.acmicpc.net 백준 14888번 연산자 끼워넣기 문제 링크입니다. 핵심 N개의 수를 받고, N-1개의 연산자를 받는다. 모든 경우의 수를 찾아야 한다. 즉 백트래킹을 통해 모든 경우의 수를 확인하는 재귀 호출 문제이다. 정답 코드 import java.util.Scanner; public class Main { public static int max=Int..

[백준]11729번 하노이 탑 이동 순서(java) [내부링크]

https://www.acmicpc.net/problem/11729 11729번: 하노이 탑 이동 순서 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 www.acmicpc.net 백준 11729번 하노이 탑 이동 순서 문제 링크입니다. 핵심 첫 번째 칸에 있는 원판을 마지막 칸으로 옮기는 것인데, 작은 원판 위에 큰 원판이 올라갈 수 없고, 한 번에 1개씩 옮길 수 있다. 재귀 호출을 통해 해결할 수 있다. 정답 코드 package main; import java.io.*; public class Main { public static StringBuilder ..

[백준]10828번 스택(java) [내부링크]

https://www.acmicpc.net/problem/10828 10828번: 스택 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 www.acmicpc.net 백준 10828번 스택 문제 링크입니다. 핵심 매우 쉬운 문제이다. 스택에 관련된 문제를 입력하면, 그에 해당하는 스택의 메서드를 실행하면 된다. push의 경우에는 숫자를 한번 더 받는다. 정답 코드 import java.util.*; public class Main { public static void main(String[] args){ Scanner sc = new Sca..

[백준]1620번 나는야 포켓몬 마스터 이다솜(java) [내부링크]

https://www.acmicpc.net/problem/1620 1620번: 나는야 포켓몬 마스터 이다솜 첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면 www.acmicpc.net 백준 1620번 나는야 포켓몬 마스터 이다솜 문제 링크입니다. 핵심 이 문제는 순서대로 들어온 포켓몬의 이름을 순서대로 도감에 저장한다. 그리고 숫자를 입력하면 그 숫자에 해당하는 포켓몬 이름이 나오고, 이름을 입력하면 그 포켓몬의 순서가 나와야 한다. 따라서 HashMap을 사용하는 것이 적절하다. 정답 코드 import java.io.BufferedReader; i..

[멘토링]스프링 CRUD게시판 만들기 [내부링크]

이번 방학에 멘토링을 통해 스프링을 배우게 시작하였다. 처음 배우다 보니 아직 어려운 부분이 있는다는 생각을 하였다. 따라서 복습 및 개인 공부를 위해 기록하기로 하였다. CRUD는 Create, Read, Update, Delete의 약자이다. 이번에 매우 간단하게 CRUD 게시판 틀을 만들어봤다. 가장 중요한 파일 구조 및 JPA Reposioty - JPA를 이용해서 데이터베이스의 데이터를 가져온다. Entity - JPA를 이용해서 테이블 생성 및, 데이터를 다룰 수 있다. Service - 기능 구현 담당, Repository를 불러와서 기능을 구현하거나, 데이터를 저장한다 Controller - 클라이언트와 직접적으로 통신하며, Service를 불러서 기능 구현을 명령한다. 클라이언..

[백준]2004번 조합0의 개수(java) [내부링크]

https://www.acmicpc.net/problem/2004 2004번: 조합 0의 개수 첫째 줄에 정수 $n$, $m$ ($0 \le m \le n \le 2,000,000,000$, $n \ne 0$)이 들어온다. www.acmicpc.net 백준 2004번 조합 0의 개수 문제 링크입니다. 핵심 2와 5개가 짝을 이루어 곱해질 때마다 끝자리에 0이 1개 추가된다. 2와 5의 개수가 다르게 나올 수 있기 때문에, 둘 중 적게 나온 수만큼 0이 추가된다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; publ..

[백준]15650번 N과M(2) (java) [내부링크]

https://www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 백준 15650번 N과 M(2) 문제 링크입니다. 핵심 https://kimtaesoo99.tistory.com/17 [백준]15649번 N과 M(1) (java) https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해..

[백준]15649번 N과 M(1) (java) [내부링크]

https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해 www.acmicpc.net 백준 15649번 N과 M(1) 문제 링크입니다. 핵심 이 문제는 백트래킹을 사용하여서 풀어야 한다. 재귀 호출을 통해 푸는 방식이다. https://namu.wiki/w/%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9 백트래킹 - 나무위키 일반적으로 특정 퀘스트나 스토리를 클리어하기 위해 게임을 진행한 뒤, 자동으로 초기 지점으로 돌아오는 기능 등이 없어 왔던 길을 플레이어가..

[백준]1002번 터렛(java) [내부링크]

https://www.acmicpc.net/problem/1002 1002번: 터렛 각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다. www.acmicpc.net 백준 1002번 터렛 문제 링크입니다. 핵심 이 문제는 해석하면, 두 원의 접점의 개수를 찾는 것이다. 가장 먼저 개수가 무한대일 경우는 두 원의 중심이 같고, 반지름이 같은 경우이다. 그다음 접점이 없는 경우인데, 이는 아래와 같은 그림일 때이다. 이는 다른 원이 내부에 있을 때인데, 식으로 나타내면 (x1-x2)^2+(y1-y2)^2(r1-r2)^2이다. 다음은 접점이 한 개일 때이다. 내접한다는 의미이고, 식은 (x1-x2)^2+(y1-y2)^..

[백준]2477번 참외밭(java) [내부링크]

https://www.acmicpc.net/problem/2477 2477번: 참외밭 첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지 www.acmicpc.net 백준 2477번 참외밭 문제 링크입니다. 핵심 반드시 육각형이고, 시계 반대방향으로 돌아간다. 우리는 가장 큰 가로변과 세로 변을 구하여 가장 바깥쪽의 직사각형을 구하고 그 직사각형에서 작은 직사각형이 잘린 크기를 구할 것이다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args){ Sc..

[백준]7568번 덩치(java) [내부링크]

https://www.acmicpc.net/problem/7568 7568번: 덩치 우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩 www.acmicpc.net 백준 7568번 덩치 문제 링크입니다. 핵심 우선 입력 값은 5 55 185 58 183 88 186 60 175 46 155 이다. 출력은 2 2 1 2 5이다. 이는 키와 몸무게가 다른 사람에 비해 크면 더 덩치가 크고 키나 몸무게 둘 중 1가지만 크면 같은 덩치이고, 둘 다 작으면 덩치가 더 작은 것이다. 이문제는 브루트 포스에 분류된 것처럼 반복해서 비교하는 것이다. 정답 코드..

[백준]2981번 검문(java) [내부링크]

https://www.acmicpc.net/problem/2981 2981번: 검문 트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 시간 www.acmicpc.net 백준 2981번 검문 문제 링크입니다. 핵심 여러 수를 받고 그 수들을 나누었을 때, 나머지가 같은 값이 나오게 하는 수를 찾는 것이다. 단순한 방법으로는 2부터 1씩 증가시키면서 값을 나누었을 때, 나머지를 비교하는 것이지만, 이러한 방법은 시간 초과가 뜨게 된다. 따라서 우리는 유클리드 호제법을 사용하여 문제를 풀어야 한다. https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B..

[백준]10816번 숫자 카드2(java) [내부링크]

https://www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net 백준 10816번 숫자 카드 2 문제 링크입니다. 핵심 이 문제는 처음 제시된 숫자 중에서 아래 제시된 숫자가 몇 번 나왔는지를 체크하는 것이다. 핵심은 HashMap을 사용하는 것이다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; ..

[백준]10815번 숫자 카드(java) [내부링크]

https://www.acmicpc.net/problem/10815 10815번: 숫자 카드 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net 백준 10815번 숫자 카드 문제 링크입니다. 핵심 처음 입력된 숫자 중에서 상근이가 가지고 있는 숫자가 있으면 1 아니면 0을 출력하는 것이다. 처음에는 contains를 사용하여, 포함 여부를 확인해보았는데, 이는 시간이 너무 오래 걸려서 시간 초과가 떴다. 이문제는 binarySearch를 사용하는 것이 핵심이다. 정답 코드 import java.io.*; im..

[백준]18870번 좌표 압축(java) [내부링크]

https://www.acmicpc.net/problem/18870 18870번: 좌표 압축 수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌 www.acmicpc.net 백준 18870번 좌표 압축 문제 링크입니다. 핵심 여러 가지 수를 받고, 작은 값이 0 값을 갖고 그 뒤로 1씩 증가되는 형태이다. 이때 핵심은 HashMap을 사용하는 것이다. 정답 코드 import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.uti..

[백준]1181번 단어정렬(java) [내부링크]

https://www.acmicpc.net/problem/1181 1181번: 단어 정렬 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. www.acmicpc.net 백준 1181번 단어 정렬 문제 링크입니다. 핵심 여러가지 단어를 받고, 길이가 짧은 순으로 정렬하고, 길이가 같으면 사전 순으로 정렬시킨다. 정답 코드 import java.util.*; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int N = sc.nex..

[백준]2798번 블랙잭(java) [내부링크]

https://www.acmicpc.net/problem/2798 2798번: 블랙잭 첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장 www.acmicpc.net 백준 2798번 블랙잭 문제 링크입니다. 핵심 여러 수를 받고, 그중에 3장을 골라 합이 우리가 원하는 값인 M에 근접한 값을 찾는 것이다. 이 문제는 브루트 포스로 분류되어 있는데, 이는 무차별 대입이란 뜻이다. 문제의 분류에 맞게 무차별 대입의 방법을 사용하자. 정답 코드 import java.util.Scanner; public class Main { publ..

[백준]2108번 통계학(java) [내부링크]

https://www.acmicpc.net/problem/2108 2108번: 통계학 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다. www.acmicpc.net 백준 2108번 통계학 문제 링크입니다. 핵심 여러 가지 수를 받은 다음에 평균, 중앙값, 최빈값, 범위를 구하는 것이다. 최빈값을 구하는 것이 이 문제에서 가장 핵심이다. 정답 코드 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Scanner; public class Main {..

[백준]2581번 소수(java) [내부링크]

https://www.acmicpc.net/problem/2581 2581번: 소수 M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다. www.acmicpc.net 백준 2581번 소수 문제 링크입니다. 핵심 두 수를 입력받고 두 수사이의 값 중 소수의 합을 구하고 최솟값을 구하는 문제이다. 정답 코드 import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int M = sc.nextInt(); int N =..

[백준]2838번 설탕 배달(java) [내부링크]

https://www.acmicpc.net/problem/2839 2839번: 설탕 배달 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그 www.acmicpc.net 백준 2838번 설탕 배달 문제 링크입니다. 핵심 5와 3의 배수를 조합해서 구하는 문제인데, 5의 배수로 나누어질 경우가 가장 봉지수가 적다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextI..

[백준]10757번 큰수A+B(java) [내부링크]

https://www.acmicpc.net/problem/10757 10757번: 큰 수 A+B 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 백준 10757번 큰 수 A+B 문제 링크입니다. 단순한 A+B를 계산하는 문제이지만, 값이 매우 크다는 문제가 있습니다. 핵심 흔히 사용되는 기본형 8개의 값은 위의 범위를 초과하면 안 된다. 하지만 우리가 구하려는 값은 위의 범위를 훨씬 뛰어넘는다. 이때 사용하는 것이 바로 BigInteger 클래스이다. 정답 코드 import java.util.Scanner; import java.math.BigInteger; public class Main { public static void main(String..

[백준]4673번 셀프넘버(java) [내부링크]

https://www.acmicpc.net/problem/4673 4673번: 셀프 넘버 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때, www.acmicpc.net 백준 4673번 셀프 넘버 문제 링크입니다. 핵심 1부터 10000까지의 정수 중에서 셀프 넘버를 찾는 것입니다. boolean타입의 배열을 사용하는 것입니다. 정답 코드 public class Main { public static void main(String[] args) { boolean[] check = new boolean[10001]; ..

[백준] 1316번 그룹단어 체커(java) [내부링크]

https://www.acmicpc.net/problem/1316 1316번: 그룹 단어 체커 그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때 www.acmicpc.net 백준 1316번 그룹 단어 체커 문제 링크입니다. 핵심 그룹 단어의 개수를 찾는 것입니다. 하지만 규칙이 있는데, 연속된 문자는 허용하지만, 같은 문자가 떨어져서 나오면 그룹 단어가 아니게 됩니다. 정답 코드 import java.util.Scanner; public class Main { public static void main(String[] args) { S..

[멘토링]스프링 팀플 쇼핑몰 만들기 [내부링크]

그전까지 멘토링 활동을 통해 스프링에 대해 배웠습니다. 이후 팀플을 하며 쇼핑몰의 기능을 구현해봤는데, 만드는 과정을 올리고 싶었으나. 아직 부족한 점도 많고, 더 공부가 필요하다고 생각되어 올리지 않았습니다. 해당 결과는 깃허브 링크를 적겠습니다. https://github.com/kimtaesoo99/ShoppingMall GitHub - kimtaesoo99/ShoppingMall: 명지대 22년도 스프링 멘토링 A팀 프로젝트 명지대 22년도 스프링 멘토링 A팀 프로젝트. Contribute to kimtaesoo99/ShoppingMall development by creating an account on GitHub. github.com 위 프로젝트에 대한 자세한 내용과 설명은 많은 공부와 정리..