전체 글 669

[JAVA] 백준 2750번 수 정렬하기1 : 버블 정렬 (Bubble Sort)

2750번: 수 정렬하기 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. www.acmicpc.net 1. 문제 추상화 N개의 수가 주어졌을 때, 오름차순으로 정렬하시오. 2. 알고리즘 ( 아래 포스팅에 정리해두었으니 참고바랍니다. ) [ JAVA ] 버블정렬 향상 시키기 버블정렬은 가장 쉽고 이해하기 쉬운 정렬이다. 그러나 시간복잡도가 O(n2)이어서 효율이 좋지 않다. 그러니 일반적인 버블정렬과 버블정렬의 효율을 높이는 방법 두 가지를 소개하겠다. 7개의 lordofkangs.tistory.com 3. 코드 구현 3-1) 버블정렬 코드 //..

[클린코드] switch문 사용법 : 제어의 역전

Clean Code 『CLEAN CODE(클린 코드)』은 오브젝트 멘토(OBJECT MENTOR)의 동료들과 힘을 모아 ‘개발하며’ 클린 코드를 만드는 최상의 애자일 기법을 소개하고 있다. 소프트웨어 장인 정신의 가치를 심어 주며 book.naver.com switch문은 클린코드에 부적합하다. 이유는 크게 두 가지이다. 1. 여러가지 case가 있어 한 가지 함수에 다양한 작업이 포함될 수 있다. 2. 작게 만들 수 없다. 함수는 작고 한 가지 작업만 수행되어야 한다고 믿는 로버튼 C. 마틴에게 swith문은 부적합한 문법이다. 사용하기 어려운 switch문 // 월급 계산법 public Employee caculatePay(Employee e) { switch(e.type) { case COMMISS..

[JAVA] 백준 1436번 영화감독 숌 : 문자열 찾기

1436번: 영화감독 숌 666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타 www.acmicpc.net 1. 문제 추상화 "666"이 들어간 수를 작은 순서대로 시리즈 넘버로 한다. N번째 시리즈의 번호를 구하라. 2. 알고리즘 API를 이용하면 굉장히 쉽게 풀 수 있는 문제다. String 객체의 contains() 메소드를 이용하여, 작은 수부터 666이 들어간 모든 경우의 수를 조사하면 된다. [ 브루트 포스 ] 그러나 나는 규칙성을 찾는 도중 재귀함수 냄새를 맡았고 재귀함수로 풀려다가 실패했다. contains() 메소드를 알고 있었지만 기억하지 못했다...

문제풀이/String 2021.07.31

[클린코드] 한 가지 추상화, 한 가지 추상화 수준 [ 함수 ]

Clean Code 『CLEAN CODE(클린 코드)』은 오브젝트 멘토(OBJECT MENTOR)의 동료들과 힘을 모아 ‘개발하며’ 클린 코드를 만드는 최상의 애자일 기법을 소개하고 있다. 소프트웨어 장인 정신의 가치를 심어 주며 book.naver.com '클린코드'의 저자 로버트 마틴은 말한다. 함수는 작은 함수가 좋다고 확신한다. 작은 함수는 한 가지 기능만 한다. 만약 함수가 두 가지 기능으로 설명된다면 이미 큰 함수이다. 여기서 한 가지 기능이란, 한 가지 '추상화'를 의미한다. 한 가지 추상화 아래 코드는 회원가입을 수행하는 함수이다. 회원가입 버튼을 누르면 해당 함수가 실행된다. 회원가입은 세 가지 작업으로 세분화된다. 1. ID 유효성 검사 2. DB에 저장 3. 페이지 전환 정리하면, 한..

[JAVA] 백준 1018번 체스판 다시 칠하기 : 정반대 경우의 수

1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다. www.acmicpc.net 1. 문제 추상화 M X N 크기의 보드를 8X8로 잘라 체스판을 만들려 한다. M X N의 보드는 격자마다 무작위로 색칠되어 있을 때, 어느 부분을 8X8로 잘라야 최소한의 색칠로 8X8체스판을 만들 수 있을까? ( 체스판은 격자간 색깔이 겹치면 안 된다. ) 2. 알고리즘 알고리즘 구상은 쉬우나 사소한 조건을 놓칠 수 있어 코드 구현이 만만치 않은 문제이다. 나는 두 가지 방법으로 풀었다. 첫 번째 방법은 나의 알고리즘이고 두 번째 방법은 인터넷에서 ..

문제풀이 2021.07.29

[JAVA] 백준 7568번 덩치 : 브루트 포스 (이차원 배열)

7568번: 덩치 우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩 www.acmicpc.net 1. 문제 추상화 A(x, y), B(p, q)에서 x > p 그리고 y > q 이면 A가 B보다 크다고 할 때,입력된 값들의 크기 순위를 매겨라. 순위는 자신보다 큰 수의 개수 + 1이다. 2. 알고리즘 풀이는 쉽지만 문제 뉘앙스가 헷갈릴 여지가 있다. 상식적으로 몸무게가 같고 키가 크면 덩치가 더 크다 말할 수 있다. 그러나 여기서는 아니다. 키와 몸무게가 둘 다 커야 덩치가 큰거다. 문제를 풀 때는 상식이 아닌 조건으로 풀어야 한다. 1. 이차..

[JAVA] 백준 2231번 분해합 : 브루트 포스

2231번: 분해합 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 www.acmicpc.net 1. 문제 추상화 임의의 값 M이 주어질 때, M의 생성자(N) 중 최소값을 구하라. ( 생성자(N)는 생성자와 생성자 각 자리 수의 합이 M과 같은 수를 의미한다. ) 2. 알고리즘 생성자(N)의 각 자리수의 합을 SUM이라 하겠다. M = N + SUM 이므로 M > N이다. 그러므로 가장 쉬운 방법은 1부터 M까지 모든 경우의 수를 조사하는 방법이다. (브루트 포스) 그러나 M은 1 ≤ M ≤ 1,000,000 이므로 경우의 수..

[JAVA] 백준 2798번 블랙잭 : 브루트포스

2798번: 블랙잭 첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장 www.acmicpc.net 1. 문제 추상화 주어진 값들 중 세 개를 추출하여 블랙잭 수보다 같거나 작은 최대값을 구하시오. 2. 알고리즘 굉장히 쉬운 문제지만 브루트포스를 몰라 어렵게 풀었다;; 브루트포스(BruteForce)란, Brute( 무식한 )과 Force ( 힘 )의 합성어로 무식한 힘이라는 의미다. 다시 말해서, 무식하게 모든 경우의 수를 탐색하여 조건에 맞는 결과를 내놓는 알고리즘이 효율적일 때가 있다는 말이다. 나는 모든 경우의 수를 조사..

[JAVA] 백준 2447번 별찍기-10 : 재귀함수

2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 www.acmicpc.net 1. 문제 추상화 입력된 값 N은 3의 거듭제곱이다. 만약 N이 3이면 출력은 아래와 같다. N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태로 출력하시오. 2. 알고리즘 어려운 문제다. 문제를 이해하기 힘들어서 인터넷을 찾아봐서 풀었다. 그래도 이번 문제를 통해 재귀함수를 깊이 이해할 수 있었다. 재귀적 사고와 선형적 사고는 다르다. 선형적 사고는 1..

문제풀이 2021.07.27

[스프링] 관심사의 분리 ( 관계설정 책임의 분리 )

[ 스프링 ] 관심사의 확장 ( 인터페이스 ) [ 스프링 ] 관심사의 분리 ( 클래스의 분리 ) [ 스프링 ] 관심사의 확장 ( 추상클래스 ) [ 스프링 ] 관심사의 분리 ( DAO ) 스프링 프레임워크를 사용하기 위한 기본 개념을 하나씩 정리해볼까 한다. lordofkangs.tistory.com 지난 포스팅까지 인터페이스를 이용한 확장을 알아 보았다. 그러나 한 가지 문제가 있었다. UserDao 클래스의 관심사는 'DB 엑세스를 위한 SQL실행'이지 'ConnectionMaker 인터페이스의 구현객체와의 관계 설정'은 관심사가 아니다. UserDao 클래스가 한 가지 구현객체를 선택하면 두 클래스는 '종속'되어 버린다. 종속은 변화에 좋지 않은 관계이다. "느슨한 결합"을 유지해야한다. 관계 설정 ..

SPRING/Spring Basic 2021.07.26