kimtaesoo99의 등록된 링크

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

Tistory

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

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

Tistory

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

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

Tistory

[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를 이용한 문제이다...

Tistory

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

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

Tistory

[프로젝트] 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..

Tistory

[프로젝트] 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 ..

Tistory

[JAVA] 체스를 구현하면서 배운점

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

Tistory

[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 오늘도 어제와 같은 윈도우 슬라이..

Tistory

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

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

Tistory

네이버 부스트캠프 8기 웹, 모바일 합격 & 후기

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

Tistory

[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 전형적인 윈도우 슬라이딩 문제이다. 난이도가 높지 않고 매우 ..

Tistory

[개발일기#9] 1년

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

Tistory

[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 친구의 추천으로 리트코드 문제를 처음 풀어보았다..

Tistory

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

Tistory

[AWS] 클라우드

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

Tistory

[JAVA] 블랙잭을 구현하면서 배운 점

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

Tistory

[JAVA] 리플렉션(Reflection)

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

Tistory

최소 신장 트리(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)이 만든 최소 신장 트리 알고리즘이다. 프림 알고리즘은 최..

Tistory

[개발일기#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)이 만든 최소 신장 트리 알고리즘이다. 프림 알고리즘은 최..

Tistory

[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)를 전달한다. 그렇기..

Tistory

객체지향 설계 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..

Tistory

[프로그래머스] 경주로 건설(java)

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

Tistory

다양한 가비지 컬렉션(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..

Tistory

객체지향의 사실과 오해(7장)

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

Tistory

이터레이터 패턴(Iterator Pattern)

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

Tistory

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

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

Tistory

[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

Tistory

[프로그래머스] 보석 쇼핑(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..

Tistory

[JAVA] JVM 동작원리 및 기본 개념

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

Tistory

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

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

Tistory

프록시 패턴(Proxy Pattern)

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

Tistory

[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 을 반환하면 에러가 발생..

Tistory

필터(Filter) vs 인터셉터(Interceptor) 차이

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

Tistory

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

Tistory

옵저버 패턴(Observer Parttern)

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

Tistory

의존성 주입(Dependency Injection)

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

Tistory

객체지향의 사실과 오해(6장)

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

Tistory

전략 패턴(Strategy Pattern)

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

Tistory

@Configuration안에서 @Bean을 사용해야하는 이유

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

Tistory

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

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

Tistory

단위테스트? 통합테스트? 런던파 vs 고전파

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

Tistory

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

Tistory

@RequestBody, @ModelAttribute, @RequestParam의 차이

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

Tistory

@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 등을 주요 속..

Tistory

팩토리 메소드 패턴(Factory Method Pattern)

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

Tistory

객체지향의 사실과 오해(5장)

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

Tistory

[삼성전자 DX] SW역량강화 특강 수료

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

Tistory

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

Tistory

객체지향의 사실과 오해(4장)

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

Tistory

싱글톤 패턴(Singleton Pattern)

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

Tistory

컴퓨터 시스템의 구성

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

Tistory

객체지향의 사실과 오해(3장)

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

Tistory

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

Tistory

관계 데이터 연산

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

Tistory

데이터베이스 언어 SQL

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

Tistory

객체지향 생활 체조 원칙

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

Tistory

데이터베이스 시스템(DBS)

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

Tistory

관계 데이터 모델

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

Tistory

객체지향의 사실과 오해 (1장)

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

Tistory

객체지향의 사실과 오해(2장)

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

Tistory

데이터베이스의 기본 개념

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

Tistory

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

Tistory

자바 코드 컨벤션

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

Tistory

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

Tistory

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

Tistory

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

Tistory

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

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

Tistory

[프로그래머스] 메뉴 리뉴얼(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;..

Tistory

[프로그래머스] 순위검색(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;..

Tistory

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

Tistory

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

Tistory

[개발일기#5] 2023년 첫 개발일기 및 방학후기

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

Tistory

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

Tistory

[프로그래머스] 이모티콘 할인행사(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..

Tistory

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

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

Tistory

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

Tistory

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

Tistory

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

Tistory

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

Tistory

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

Tistory

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

Tistory

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

Tistory

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

Tistory

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

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

Tistory

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

Tistory

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

Tistory

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

Tistory

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

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

Tistory

[백준] 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 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포..

Tistory

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

Tistory

[백준] 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인 곳은 이전까지의 합이라 생각할 수 있으며, ..

Tistory

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

Tistory

[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라는 배열에 공부한 날을 체크한다. 이미 출석한 날을 체크 이후 연속..

Tistory

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

Tistory

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

Tistory

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

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

Tistory

[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번 반복하려고 한다..

Tistory

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

Tistory

Servlet, Spring MVC 정리

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

Tistory

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

1 2 3