Compound Pattern (컴파운드 패턴)

Compound Pattern

 

정의


반복적으로 생길 수 있는 일반적인 문제를 해결하기 위한 용도로 두 개 이상의 디자인패턴을 결합하여 사용하는 것이다.


또한, 여러 패턴을 같이 사용한다고 해서 compound pattern이 되는 것이 아닌, 문제를 해결하기 위한 용도로 사용하여야 한다.

 


시나리오


1.    Duck들이 있었는데, Goose가 등장하여 자신도 Quackable이 되고 싶다고 요청


A.     Adapter Pattern을 이용하여 goosequackable에 맞게 구현하여 goose객체의 quack()를 호출하면 자동으로 honk()가 호출된다.


2.    학자들이 quack소리의 횟수를 세고 싶다고 함


A.     Decorator Pattern을 이용하여 QuackCounter decorator를 추가하였다


Quack() 메소드 호출 자체는 그 decorator로 쌓여 있는 Quackable에 의해 처리되고 quack()의 호출된 횟수를 셀 수 있게 되었다.


3.    QuackCounterdecorator 되지 않은 Quackable Object 문제


A.     Abstract factory pattern을 적용하여 object를 만들도록 구성한다.


4.    모든 duck goose, Quackable Object들을 관리하는데 무리가 생김


A.     Composite Pattern을 이용하여 duck을 모아서 ducks로 관리


B.     Iterator를 통하여 반복작업까지 처리할 수 있게 됨


5.    Quackable에서 quack를 호출하였다는 signal을 받고 싶어함


A.     Observer Pattern을 이용하여 QuackologistQuackable observer로 등록하여 signal을 받게 되었으며, signal을 돌릴 때 iterator pattern을 적용하였다.

 


소스코드


interface


//Quckable interface
public interface Quackable {
   
public void quack();
}

 

Duck object


//implement Quackable interface
public class MallardDuck implements Quackable {
   
@Override
    public void
quack() {
       
System.out.println("Quack");
    }
}
public class RedheadDuck implements Quackable {
   
@Override
    public void
quack() {
       
System.out.println("quack");
    }
}
public class RubberDuck implements Quackable{
   
@Override
    public void
quack() {
       
System.out.println("Squeak");
    }
}
public class DuckCall implements Quackable{
   
@Override
    public void
quack() {
       
System.out.println("Kwak");
    }
}

 

GooseAdapter

//goose adapter to bind Duck class
/*
class interface client에서 사용하고 하는 다른 interface로 변환한다.
adapter
를 이용하면 interface의 호환성 문제 때문에 같이 사용할 수 없는 class를 쓸 수 있다.
 */
public class GooseAdapter implements Quackable {

   
Goose goose;

   
public GooseAdapter(Goose goose) {
       
this.goose = goose;
    }

   
@Override
    public void
quack() {
       
goose.honk();
    }
}

 

Goose

//add goose
public class Goose {
   
public void honk() {
       
System.out.println("Honk");
    }
}

 

Abstract factory pattern

//abstract factory pattern
//
구체적인 클래스를 지정하지 않고 관련성을 갖는 객체들의 집합을 생성하거나
//서로 독립적인 객체들의 집합을 생성할 수 있는 인터페이스를 제공한다.
public abstract class AbstractDuckFactory {

   
public abstract Quackable createMallardDuck();
   
public abstract Quackable createRedheadDuck();
   
public abstract Quackable createDuckCall();
   
public abstract Quackable createRubberDuck();
}

 

Counting duck factory

public class CountingDuckFactory extends AbstractDuckFactory{

   
@Override
    public
Quackable createMallardDuck() {
       
return new QuackCounter(new MallardDuck());
    }

   
@Override
    public
Quackable createRedheadDuck() {
       
return new QuackCounter(new RedheadDuck());
    }

   
@Override
    public
Quackable createDuckCall() {
        
return new QuackCounter(new DuckCall());
    }

   
@Override
    public
Quackable createRubberDuck() {
       
return new QuackCounter(new RubberDuck());
    }
}

 


main

//run
public class DuckSimulator {

   
public static void main(String [] args) {
        
DuckSimulator simulator = new DuckSimulator();
       
AbstractDuckFactory duckFactory = new CountingDuckFactory();
       
simulator.simulator(duckFactory);
    }


   
void simulator(AbstractDuckFactory duckFactory) {
       
Quackable mallardDuck = duckFactory.createMallardDuck();
       
Quackable redheadDuck = duckFactory.createRedheadDuck();
       
Quackable duckCall = duckFactory.createDuckCall();
       
Quackable rubberDuck = duckFactory.createRubberDuck();
       
Quackable gooseDuck = new GooseAdapter(new Goose());

       
System.out.println("\nDuck Simulator");

       
simulator(mallardDuck);
       
simulator(redheadDuck);
       
simulator(duckCall);
       
simulator(rubberDuck);
       
simulator(gooseDuck);

       
System.out.println("The Ducks quacked " + QuackCounter.getQuacks() + " times");
    }

   
void simulator(Quackable duck) {
       
duck.quack();
    }
}

 


 결과화면



UML


intellij (인텔리제이) 단축키 모음

이 게시물도 그냥 내가 매번 찾기 귀찮아서 쓴다...



Editing

Ctrl + Space Basic code completion (the name of any class,method or variable)

Ctrl + Shift + Space Smart code completion (filters the list of methodsand variables by expected type)

Ctrl + Shift + Enter Complete statement

Ctrl + P  함수호출시 인수 정보 확인 (within method call arguments)

Ctrl + Q  코드에 대한 문서창 팝업

Shift + F1 코드에 대한 문서 인터넷 브라우저로 팝업 

Ctrl + mouse  코드를 링크처럼 타고 들어감

Ctrl + F1 Show descriptions of error or warning at caret

Alt + Insert  코드 생성 (Getters, Setters, Constructors,hashCode/equals, toString)

Ctrl + O  메서드 오버라이드 구현

Ctrl + I    인터페이스 메서드 구현

Ctrl + Alt + T  다음으로 코드 감싸기… (if..else, try..catch, for,synchronized, etc.)

Ctrl + / 줄 단위 주석 토글

Ctrl + Shift + /  블럭 단위 주석 토글

Ctrl + W 가장 안쪽의 괄호부터 선택(점점 확장 된다.)

Ctrl + Shift + W Decrease current selection to previous state

Alt + Q Context info

Alt + Enter Show intention actions and quick-fixes

Ctrl + Alt + L  파일 단위 재정렬 (이클립스의 ctrl + shift + f) 

Ctrl + Alt + O import 문 최적화

Ctrl + Alt + I  줄단위 재정렬

Tab / Shift + Tab  들여쓰기/내어쓰기

Ctrl + X or Shift + Delete 잘라내기 (블럭 선택이 안되어 있으면 라인을 잘라냄)

Ctrl + C or Ctrl + Insert 복사하기(블럭 선택이 안되어 있으면 라인을 복사함)

Ctrl + V or Shift + Insert 붙여넣기

Ctrl + Shift + V 복사하기 (목록에서 선택하여)

Ctrl + D 선택된 블럭을 복제

Ctrl + Y 캐럿을 있는 곳의 라인 삭제

Ctrl + Shift + J 스마트하게 코드를 한 줄로 합친다.

Ctrl + Enter 스마트하게 코드를 여러줄로 나눈다.

Shift + Enter 커서가 어디에 있건 다음 라인을 생성하고 첫줄로 이도 

Ctrl + Shift + U 커서가 있는 곳이나 블럭이 있는 곳을 대문자 및 소문자로 치화

Ctrl + Shift + ] / [  가장 가까운 괄호 시작/종료로 이동

Ctrl + Delete 단어 삭제 (커서 시작부터)

Ctrl + Backspace Delete to word start

Ctrl + NumPad+/- Expand/collapse code block

Ctrl + Shift + NumPad+ Expand all

Ctrl + Shift + NumPad- Collapse all

Ctrl + F4 Close active editor tab

 

 

Double Shift Search everywhere

Ctrl + F Find

F3 Find next

Shift + F3 Find previous

Ctrl + R Replace

Ctrl + Shift + F Find in path

Ctrl + Shift + R Replace in path

Ctrl + Shift + S Search structurally (Ultimate Edition only)

Ctrl + Shift + M Replace structurally (Ultimate Edition only)

 

 

 

Usage Search

Alt + F7 / Ctrl + F7 Find usages / Find usages in file

Ctrl + Shift + F7 Highlight usages in file

Ctrl + Alt + F7 Show usages

 

 

Compile and Run

Ctrl + F9 Make project (compile modifed and dependent)

Ctrl + Shift + F9 Compile selected file, package or module

Alt + Shift + F10 Select configuration and run

Alt + Shift + F9 Select configuration and debug

Shift + F10 Run

Shift + F9 Debug

Ctrl + Shift + F10 Run context configuration from editor

 


Debugging

F8 Step over

F7 Step into

Shift + F7 Smart step into

Shift + F8 Step out

Alt + F9 Run to cursor

Alt + F8 Evaluate expression

F9 Resume program

Ctrl + F8 Toggle breakpoint

Ctrl + Shift + F8 View breakpoints

 

 

Navigation

Ctrl + N Go to class

Ctrl + Shift + N Go to file

Ctrl + Alt + Shift + N Go to symbol

Alt + Right/Left Go to next/previous editor tab

F12 Go back to previous tool window

Esc Go to editor (from tool window)

Shift + Esc Hide active or last active window

Ctrl + Shift + F4 Close active run/messages/find/... tab

Ctrl + G Go to line

Ctrl + E Recent files popup

Ctrl + Alt + Left/Right Navigate back/forward

Ctrl + Shift + Backspace Navigate to last edit location

Alt + F1 Select current file or symbol in any view

Ctrl + B or Ctrl + Click Go to declaration

Ctrl + Alt + B Go to implementation(s)

Ctrl + Shift + I Open quick definition lookup

Ctrl + Shift + B Go to type declaration

Ctrl + U Go to super-method/super-class

Alt + Up/Down Go to previous/next method

Ctrl + ] / [ Move to code block end/start

Ctrl + F12 File structure popup

Ctrl + H Type hierarchy

Ctrl + Shift + H Method hierarchy

Ctrl + Alt + H Call hierarchy

F2 / Shift + F2 Next/previous highlighted error

F4 / Ctrl + Enter Edit source / View source

Alt + Home Show navigation bar

F11 Toggle bookmark

Ctrl + F11 Toggle bookmark with mnemonic

Ctrl + #[0-9] Go to numbered bookmark

Shift + F11 Show bookmarks

 

  

Refactoring

F5 Copy

F6 Move

Alt + Delete Safe Delete

Shift + F6 Rename

Ctrl + F6 Change Signature

Ctrl + Alt + N Inline

Ctrl + Alt + M Extract Method

Ctrl + Alt + V Extract Variable

Ctrl + Alt + F Extract Field

Ctrl + Alt + C Extract Constant

Ctrl + Alt + P Extract Parameter

 

 

VCS/Local History

Ctrl + K Commit project to VCS

Ctrl + T Update project from VCS

Alt + Shift + C View recent changes

Alt + BackQuote (`) ‘VCS’ quick popup

 

 

Live Templates

Ctrl + Alt + J Surround with Live Template

Ctrl + J Insert Live Template

iter Iteration according to Java SDK 1.5 style

inst Check object type with instanceof and downcast it

itco Iterate elements of java.util.Collection

itit Iterate elements of java.util.Iterator

itli Iterate elements of java.util.List

psf public static final

thr throw new

 


General

Alt + #[0-9] Open corresponding tool window

Ctrl + S Save all

Ctrl + Alt + Y Synchronize

Ctrl + Shift + F12 Toggle maximizing editor

Alt + Shift + F Add to Favorites

Alt + Shift + I Inspect current file with current profile

Ctrl + BackQuote (`) Quick switch current scheme

Ctrl + Alt + S Open Settings dialog

Ctrl + Alt + Shift + S Open Project Structure dialog

Ctrl + Shift + A Find Action

Ctrl + Tab Switch between tabs and tool window


Proxy Pattern (프록시 패턴)

Proxy Pattern


 

프록시


1.    원격프록시 : 원격객체에 대한 접근을 제어


2.    가상프록시 : 생성하기 힘든 자원(ex. Image)에 대한 접근을 제어


3.    보호프록시 : 접근권한이 필요한 자원에 대한 접근을 제어


 

사용 목적


실제 객체의 생성시간이 오래걸리는 경우 일을 분업하여 간단한 초기 작업을 프록시에서 하고


가장 중요한 마지막 작업에서 프록시객체는 실제 객체를 생성하고 위임한다.


 

특징


1.    프록시는 실제 서비스와 같은 이름의 메소드를 인터페이스를 사용하여 구현한다.


2.    프록시는 실제 서비스에 대한 참조 변수를 갖는다.


3.    대리자는 실제 서비스의 같은 이름을 가진 메소드를 호출하고 그 값을 클라이언트에게 돌려준다.


4.    대리자는 실제 서비스의 메소드 호출 전후에도 별도의 로직을 수행할 수 있다.



 

원격프록시


로컬 환경에 존재하며, 원격객체(JVM Heap에 있는 객체)에 대한 대변자 역할을 하는 객체


서로 다른 주소 공간에 있는 객체에 대해 마치 같은 주소 공간에 있는 것처럼 동작하게 만드는 패턴


 

가상프록시


꼭 필요로 하는 시점까지 객체의 생성을연기하고, 해당 객체가 생성된 것처럼 동작하도록 만들고 싶을 때 사용하는 패턴


 

보호프록시


객체에 대한 접근 권한을 제어하거나 객체마다 접근 권한을 달리하고 싶을 때 사용하는 패턴으로 


실객체에 대한 접근을 가로채어 중간에서 권한 점검을 수행


 

소스코드


인터페이스

public interface Image {
   
void display();
}

 

프록시

public class ProxyImage implements Image {
   
private RealImage realImage;
   
private String fileName;

   
public ProxyImage(String fileName){
       
this.fileName=fileName;
    }

   
@Override
    public void
display() {
       
if(realImage == null){
           
realImage = new RealImage(fileName);
        }
       
realImage.display();
    }
}

 

실제

public class RealImage implements Image {

   
private String fileName;

   
public RealImage(String fileName){
       
this.fileName=fileName;
       
loadFromDisk(fileName);
    }
   
private void loadFromDisk(String fileName){
       
System.out.println("Loading " + fileName);
    }
   
@Override
    public void
display() {
       
System.out.println("Displaying " + fileName);
    }
}

 

메인

public class Main {
   
public static void main(String[] args){
       
Image image = new ProxyImage("test.jpg");
       
image.display();
    }
}



결과화면




UML



아스키 코드표 (ASCII code table)

솔직히 그냥 내가 매번 찾기 귀찮아서 올림...



State Pattern (스테이트 패턴)

State Pattern

 


정의


Object의 내부 상태가 바뀜에 따라서 object의 행동을 바꿀 수 있다.


마치 object class가 바뀌는 것과 같은 결과를 얻을 수 있다.


State patternstateclass로 표현한다


그 이유는, class의 교체를 통해서 state의 변화를 나타낼 수 있고, 새로운 state를 추가해야 할 때, 편리하기 때문이다.

 


적용 영역


1.    Object의 행위가 object state에 의존하고 그 object의 행위가 실행 시점에서 object state에 따라 변화해야 할 경우


2.    Operation이 크고, objectstate에 따라 다수의 조건문을 포함하는 경우


 

State vs Strategy (pattern)


State pattern을 사용할 때는 state object의 행동이 캡슐화 된다


State에 따라 context object에서 여러 state object 중 한 object에게 모든 행동을 위임한다.


해당 object의 내부 state에 따라 현재 state를 나타내는 object가 바뀌고


그 결과 context object의 행동도 바뀐다. Clientstate object에 대해서 몰라도 된다.


하지만, strategy patternclient에서 context object한테 어떤 object를 사용할지 정한다


Strategy pattern은 주로 실행시에 전략 object를 변경할 수 있는 유연성을 제공하기 위한 용도로 쓰이며, 가장 적합한 전략 object를 선택해서 사용한다.


, strategy pattern은 외부에서 상황에 맞게 변화를 줄 수 있고, state pattern은 자신이 직접 상태변화에 관여한다는 것이다



구성요소


1.    State를 나타내는 state


2.    state간의 전의를 표현하는 action


3.    state 전이에 나타나는 onEntry, onExit 함수


 

소스코드


Action(enum)

public enum Action {
   
EAT, DIGEST, GOTOBED;
}

 

State(enum)

public enum State {
   
HUNGRY{
       
public State act(Action action){
           
switch (action){
                
case EAT: return FULL;
               
default: return null;
            }
        }
    },
   
FULL{
       
public State act(Action action){
           
switch (action){
               
case EAT: return ANGRY;
               
case DIGEST: return HUNGRY;
               
case GOTOBED: return SLEEPING;
               
default: return null;
            }
        }
    },
   
ANGRY{
       
public State act(Action action){
           
switch (action){
               
case DIGEST: return FULL;
                
default: return null;
            }
        }
    },
   
SLEEPING{
       
public void onEntry(){
           
System.out.println("go bed");
        }
       
public State act(Action action){
           
return null;
        }
    };
   
abstract State act(Action action);
   
public static State getInitState(){
       
return HUNGRY;
    }
   
public static boolean isFinalState(State state){
       
return state==SLEEPING;
    }
   
public void onEntry(){}
   
public void onExit(){}
}

 

StateContext(class)

public class StateContext {
   
private State currentState;
   
public StateContext(){
       
currentState = State.getInitState();
    }
   
public void processEvent(Action action){
       
State next= currentState.act(action);
       
if(next != null){
            
currentState.onExit();
           
System.out.println(action +"에 의해 State " +
                   
currentState+"에서 "+next+"로 바뀜");
           
currentState=next;
           
currentState.onEntry();
           
if(State.isFinalState(currentState)){
               
System.out.println("i'm final State");
            }
        }
else{
           
System.out.println(action+" state " +currentState
           
+"에서는 의미 없는 짓");
        }
    }
}

 

Main

public class Main {
   
public static void main(String[] args){
       
StateContext context = new StateContext();
       
context.processEvent(Action.EAT);
       
context.processEvent(Action.EAT);
       
context.processEvent(Action.GOTOBED);
       
context.processEvent(Action.DIGEST);
       
context.processEvent(Action.EAT);
       
context.processEvent(Action.GOTOBED);
       
context.processEvent(Action.DIGEST);
       
context.processEvent(Action.GOTOBED);
    }
}



결과




UML



Composite Pattern (컴포지트 패턴)

Composite Pattern

 


정의


Object group이 단일 object와 동일하게 다루는 것이다.


client들이 단일 object와 복합체(composition)들을 동일하게 다룬다.


 

용도


Clientobject들의 composition과 단일 object 사이 차이를 무시해야 할 때 사용한다


여러 개의 object들을 같은 방법으로 사용하거나


object들에게 비슷한 코드를 사용한다면 composite pattern을 생각해 볼 수 있다.


 

구조


1.    Composite


자식들을 다루는 메소드로 일반적으로 자식들에게 기능을 위임하여 component의 모든 method를 구현한다.


2.    Component


composite 하나를 포함하는, 자신을 포함한 모든 component들의 추상화로 composite에서 object들을 위한 interface를 제공한다


또한 선택적으로 component의 부모에 접근하기 위해 recursive structure interface를 구현하기도 한다.


3.    Leaf


composition에서 leaf 객체들을 나타내며, component의 모든 method들을 구현한다.


 

소스코드


Component

package CompositePattern;

public interface Component {
   
public void show();
}

 

composite

package CompositePattern;

import java.util.ArrayList;
import java.util.List;

public class Composite implements Component {

   
private List<Component> childComponents = new ArrayList<Component>();

   
public void add(Component component){
       
childComponents.add(component);
    }

   
public void remove(Component component){
       
childComponents.remove(component);
    }

   
@Override
    public void
show() {
       
childComponents.forEach(Component::show);
    }
}

 


 

Leaf

package CompositePattern;

public class Leaf implements Component {
   
private String name;
   
public Leaf(String name){
       
this.name=name;
    }
    
@Override
    public void
show() {
       
System.out.println(name);
    }
}

 

main

package CompositePattern;

public class Main {
   
public static void main(String[] args){
       
Leaf leaf1 = new Leaf("leaf 1");
       
Leaf leaf2 = new Leaf("leaf 2");
        
Leaf leaf3 = new Leaf("leaf 3");
       
Composite composite1 = new Composite();
       
composite1.add(leaf1);

       
Composite composite2 = new Composite();
       
composite2.add(leaf2);
       
composite2.add(leaf3);

       
composite1.add(composite2);
       
composite1.show();

       
System.out.println("remove 1");
       
composite1.remove(leaf1);
       
composite1.show();

       
System.out.println("remove composite 2");
       
composite1.remove(composite2);
       
composite1.show();

       
System.out.println("print composite 2");
       
composite2.show();
    }
}


결과화면




UML






Iterator Pattern (반복자 패턴)

Iterator Pattern


 

정의


collection의 구현을 드러내지 않으면서도 collection에 있는 모든 object에 대해 반복 작업을 할 수 있다.


Interface를 통해서 Array List, HashTable 등 서로 다른 집합 객체 구조에 대해서도 반복자를 구현할 수 있다.

 



장점


1.    리스트 등의 객체의 코드가 수정되어도 순회하는 코드에 영향이 없다.


2.    하나의 리스트 등 의 집합객체에 여러가지 순회방법을 정할 수 있다.


3.    Iteratoraggregate classinterface를 단순화



 

순서


1.    클래스 정의


2.    반복자 정의 (요소를 순서대로 검색해가는 API 결정)


3.    집합객체 정의 (Aggregate이 결정한 interface를 실제로 구현)


4.    Aggregate 정의 (리스트에 새로운 항목을 추가하거나 삭제)


5.    Iterator class를 재정의 하는 iterator (리스트상의 현재 위치를 조정)



 


소스코드

 

Aggregate

public interface Aggregate {

         public abstract Iterator iterator();

}

 

Food

public class Food {
         private String name;    
         public Food(String name){
                 this.name = name;
         }
         public String getName(){
                 return name;
         }
}

 

FoodBook

public class FoodBook implements Aggregate{
         private Food[] foods;
         private int last=0;
         public FoodBook(int maxsize){
                 this.foods = new Food[maxsize];
         }
         public Food getFoodAt(int index){
                 return foods[index];
         }
         public void appendFood(Food food){
                 this.foods[last] = food;
                 last++;
         }
         public int getLength(){
                 return last;
         }
         @Override
         public Iterator iterator() {
                 // TODO Auto-generated method stub
                 return new FoodBookIterator(this);
         }
}


Iterator

public interface Iterator {
         public abstract boolean hasNext();
         public abstract Object next();
}

 

FoodBookIterator

public class FoodBookIterator implements Iterator{
         private FoodBook foodBook;
         private int index;       
         public FoodBookIterator(FoodBook foodBook) {
                 // TODO Auto-generated constructor stub
                 this.foodBook=foodBook;
                 this.index=0;
         }
         @Override
         public boolean hasNext() {
                 return index < foodBook.getLength();
         }
         @Override
         public Object next() {
                 Food food = foodBook.getFoodAt(index);
                 index++;
                 return food;
         }
}

 

Main

public class Main {
         public static void main(String[] args) {
                 FoodBook foodBook = new FoodBook(4);             
                 foodBook.appendFood(new Food("kimchi"));
                 foodBook.appendFood(new Food("bulgogi"));
                 foodBook.appendFood(new Food("bibimbab"));
                 foodBook.appendFood(new Food("pizza"));
                 
                 Iterator iterator = foodBook.iterator();
                 
                 while(iterator.hasNext()){
                          Food food = (Food)iterator.next();
                          System.out.println(food.getName());
                 }
         }
}



UML


백준알고리즘 2557번 java


public class Main {
public static void main(String[] args)
{
System.out.print("Hello World!");
}
}


'SW > 백준알고리즘' 카테고리의 다른 글

백준알고리즘 1001번 java  (0) 2017.09.14
백준알고리즘 10172번 java  (0) 2017.09.14
백준알고리즘 10718번 java  (0) 2017.09.14
백준알고리즘 11718번 java  (0) 2017.09.14
백준알고리즘 11719번 java  (0) 2017.09.14

백준알고리즘 1001번 java

import java.util.Scanner;

public class Main {
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.print(a-b);
}
}


'SW > 백준알고리즘' 카테고리의 다른 글

백준알고리즘 2557번 java  (0) 2017.09.14
백준알고리즘 10172번 java  (0) 2017.09.14
백준알고리즘 10718번 java  (0) 2017.09.14
백준알고리즘 11718번 java  (0) 2017.09.14
백준알고리즘 11719번 java  (0) 2017.09.14

백준알고리즘 10172번 java


'SW > 백준알고리즘' 카테고리의 다른 글

백준알고리즘 2557번 java  (0) 2017.09.14
백준알고리즘 1001번 java  (0) 2017.09.14
백준알고리즘 10718번 java  (0) 2017.09.14
백준알고리즘 11718번 java  (0) 2017.09.14
백준알고리즘 11719번 java  (0) 2017.09.14

'분류 전체보기'에 해당되는 글 125건

1 2 3 4 ··· 13 →