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

 

2993번: 세 부분

첫째 줄에 원섭이가 고른 단어가 주어진다. 고른 단어는 알파벳 소문자로 이루어져 있고, 길이는 3보다 크거나 같고, 50보다 작거나 같다.

www.acmicpc.net

부르트 포스 알고리즘 비슷한 유형을 풀어봐서 쉽게 푼 거 같다. 아니면 아이디어가 안 떠올랐을 거 같다.

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		String str = bf.readLine();
		ArrayList<String> arrStr = new ArrayList<>();

		StringBuffer sb;

		for (int i = 0; i < str.length(); i++) {
			for (int j = i + 1; j < str.length(); j++) {
				for (int k = j + 1; k < str.length(); k++) {
					String strTemp = "";

					sb = new StringBuffer(str.substring(0, j));
					strTemp += sb.reverse().toString();
					sb = new StringBuffer(str.substring(j, k));
					strTemp += sb.reverse().toString();
					sb = new StringBuffer(str.substring(k, str.length()));
					strTemp += sb.reverse().toString();
					arrStr.add(strTemp);
				}
			}
		}
		Collections.sort(arrStr);
		System.out.println(arrStr.get(0));
	}
}

 

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

 

11478번: 서로 다른 부분 문자열의 개수

첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000 이하이다.

www.acmicpc.net

HashMap을 Value 값을 계속해서 덮어서 썼다.

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws Exception {

		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		String str = bf.readLine();

		HashMap<String, Integer>map = new HashMap<String, Integer>();
		int index = 0;
		int length = 1;

		while (true) {
			if (index + length > str.length()) {
				index = 0;
				length++;
			}
			if (length <= str.length()) {

			} else {
				break;
			}
			String strTemp = str.substring(index, index + length);
			index++;
			map.put(strTemp, 1);
		}
		System.out.println(map.size());	
	}
}

 

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

 

9996번: 한국이 그리울 땐 서버에 접속하지

총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.

www.acmicpc.net

백준 정답률이 낮을 때는 의심을 하고 풀었는데도 반례가 있었다..

역시나가 역시다.. 질문 게시판을 참고했다.

 

반례

1
abab*abab
ababab

 

import java.io.*;
import java.util.*;


public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int cnt = Integer.parseInt(bf.readLine());
        String standard = bf.readLine();

        String first = "";
        String second = "";

        //기준점 * 앞뒤로 잘라주기!
        for (int i = 0; i < cnt; i++) {
            String str = bf.readLine();
            for (int j = 0; j < standard.length(); j++) {
                if (standard.charAt(j) == '*') {
                    first = standard.substring(0, j);
                    second = standard.substring(j + 1, standard.length());
                }
            }
            boolean bFirstOk = false;
            boolean bSecondOk = false;
            for (int j = 0, k = str.length() - 1, h = second.length() - 1; j < str.length(); j++, k--, h--) {
                if (j < first.length()) {
                    if (first.charAt(j) != str.charAt(j)) {
                        break;
                    }
                } else {
                    bFirstOk = true;
                }

                if (j < second.length()) {
                    if (second.charAt(h) != str.charAt(k)) {
                        break;
                    }
                } else {
                    bSecondOk = true;
                }
            }

            if (bFirstOk && bSecondOk && !(first.length() + second.length() > str.length())) {
                System.out.println("DA");
            } else {
                System.out.println("NE");
            }
        }
    }
}

 

 

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

 

11899번: 괄호 끼워넣기

첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.

www.acmicpc.net

푸는 문제집에 유형이 스택이 많이 나오는 거 같다.

https://www.acmicpc.net/workbook/view/9432

 

문제집: 문자열 실버 문제 모음 (y_cat)

 

www.acmicpc.net

import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws Exception {

		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		Stack<Character> stack = new Stack<>();

		String str = bf.readLine();
		int cnt = 0;
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == '(') {
				stack.add(str.charAt(i));
				continue;
			}
			if (!stack.isEmpty()) {
				if (str.charAt(i) == ')') {
					stack.pop();
					continue;
				}
			}
			cnt++;
		}
		System.out.println(cnt + stack.size());
	}
}

면접에서 추상 클래스와 인터페이스의 차이를 물어보셨다.

핑계지만 C++로 개발하던 중이었던 나는 어렴풋이 알고 있어서 대답을 못했다.

소잃고 외양간을 고치듯이 지금이라도 대답을 해보려 한다.

 

  • 인터페이스는 다중 상속이 가능하나 추상클래스는 다중 상속이 안된다!
  • 인터페이스는 멤버 변수를 선언할 시에 public static final 즉 상수만 된다!
  • 추상 클래스는 일반 메서드와 멤버 변수를 선언할 수 있다!

 

더 많은 특징들이 있지만 대답이 바로 나올 수 있는 것들만 정리했다.

 

각자 기능들의 특징을 정리하고자 한다!

 

내가 좋아하는 재벌집 막내아들로 구현을 해보았다.


추상 클래스

public abstract class 순양 {

	// abstract는 멤버 변수 선언이 가능하다.
	private String name = "진양철";

	// abstract는 메서드 선언이 가능하다.
	public void 진양철() {	
		System.out.println("순양은 내꺼다!");
	}

	public abstract void 지주사주총();

	//지주사 주총 메서드 작성을 해야 하는데 abstract로 구현하면 떠넘기기가 가능하다.
	public abstract class 물산 extends 순양 {

		public abstract void 물산주총();
	}
	
	// 일반 클래스로 구현하면 상속받은 추상 클래스에 추상메소드를 구현을 해야 한다.
	public class 증권 extends 순양 {

		@Override
		public void 지주사주총() {

		}
	}

	//물산 클래스를 상속받았지만 작성을 하지 않은 순양 클래스 메서드도 같이 구현해야 한다.
	public class 전자 extends 물산 {

		@Override
		public void 물산주총() {

		}

		@Override
		public void 지주사주총() {

		}
	}
}

인터페이스

public interface 순양 {
    //필드 변수는 상수만 된다!
    public static final String name = "진양철";

    public interface 물산 {
        public static final String name = "진영기";

        void 물산주총();
    }

    public interface 증권 {
        public static final String name = "진동기";

        void 증권주총();
    }

    //인터페이스는 다중 상속이 가능하다!
    //인터페이스끼리 상속할 때는 extends!
    public interface 전자 extends 순양, 증권 {
        void 전자주총();
    }

    //인터페이스를 가져올 때는 implements
    //상속받은 구현부는 다 재정의를 해줘야 한다.
    class 미라클 implements 전자 {

        @Override
        public void 증권주총() {

        }

        @Override
        public void 전자주총() {

        }
    }

}

public class Factorial {
    public static void main(String[] args) {
        Factorial fac = new Factorial();
        System.out.println(fac.factorial1(3));
        System.out.println(factorial2(3));;
    }
    public int factorial1 (int num) {
        if (num == 1)
            return 1;

        return num * factorial1 ( num - 1 );
    }

    public static int factorial2 (int num) {
        if (num == 1)
            return 1;

        return num * factorial2 ( num - 1 );
    }
}

결과값

 

c++에서 java로 넘어오니 너무 느낌이 다르다...

ide도 바뀌고 Mac도 배우고 있고 왜 static으로 하면 바로 나오는지 모르겠다..

왜 main을 감싸고 있을까 클래스가..

+ Recent posts