티스토리 뷰
천재 수재 둔재
비슷한 말로는 생이지지 학이지지 곤이지지 라는 말이 있습니다. 이 말은 논어에 나온 말입니다.
여러가지 주석들이 있습니다만 그대로 해석을 해보면 태어나면서 부터 아는 것 배워서 아는 것 어렵게 아는 것 이런 것입니다.
저는 곤이지지인 것 같습니다. 알고리즘 공부가 그렇게 어려울 수가 없습니다. 그렇다고 다른게 쉽다는 것은 아닙니다만 코딩테스트 통과 할 정도로 알고리즘을 하는게 왜 이리 어려울까요?
레벨2까지는 한 2년 정도 짬짬히 공부 하니까 겨우겨우 통과를 하겠는데 레벨3은 손도 못대겠네요 ㅜ.ㅜ
스텍 계산기 만들기 1달
처음 알고리즘이라는 것을 공부해본 것이 계산기 만들기였는데요, 계산기는 어딜 가나 있지만 (1+2)*(3-9) 이런 식을 입력하면 12+39-* 이렇게 후위식(Postfix)으로 변환 해서 스텍에 넣었다 뺐다 하면서 계산을 해주는 알고리즘을 구현한 코드를 만드는 개인 프로젝트였습니다.
인터넷에는 찾아보면 코드가 널려 있고 난이도도 그렇게 어려운 것은 아니었지만 문과생이었던 저에게는 너무나 어려운 문제였습니다. 대학교 2학년 겨울방학 내내 이 문제를 풀려고 한달 동안 하루에 4시간씩 집중해서 자바로 계산기를 구현 했던 기억이 있습니다.
<%@ page language="java" contentType="text/html; charset=euc-kr" pageEncoding="euc-kr"%>
<%@ page import="java.util.*" %>
<%!
ArrayList arl1 = new ArrayList();
Stack postFix = new Stack();
Stack stack = new Stack();
public String inToPost(String exp1){
String value1 = exp1;
StringTokenizer st = new StringTokenizer(value1, "(){}[]+-*/^", true);
try{
arl1.add("----------------------------------------------\n\n");
arl1.add("1.infix¸¦ postfix·Î\n\n");
arl1.add("----------------------------------------------\n\n");
while(st.hasMoreTokens()){
String str = st.nextToken();
if("(){}[]+-*/^".indexOf(str) == -1){
postFix.push(str);
}
else if(str.equals(")")){
while(!stack.peek().equals("("))
postFix.push(stack.pop());
stack.pop();
}
else if(str.equals("}")){
while(!stack.peek().equals("{"))
postFix.push(stack.pop());
stack.pop();
}
else if(str.equals("]")){
while(!stack.peek().equals("["))
postFix.push(stack.pop());
stack.pop();
}
else{
while(!stack.isEmpty() && inStackPriority((String)stack.peek())
>= incomingPriority(str)){
postFix.push(stack.pop());
}
stack.push(str);
}
arl1.add("postFix" + postFix + "\n\n");
arl1.add("stack" + stack + "\n\n");
}
arl1.add("----------------------------------------------\n\n");
while(!stack.isEmpty()){
postFix.push(stack.pop());
}
String ppost = "";
for (int i=0; i<postFix.size() ; i++ )
{
ppost = ppost + postFix.get(i)+" ";
}
arl1.add("postfix : " + ppost + "\n\n");
} catch(Exception e1){arl1.add("½Ä¿¡ ¿¡·¯°¡ ÀÖ½À´Ï´Ù. ÈÄÀ§½Ä º¯È¯Áß ¿¡·¯°¡ ³µ½À´Ï´Ù.\n\n"); }
return calculate(postFix);
}
//ÈÄÀ§½ÄÀ» ¿¬»êÇÏ´Â ºÎºÐ
String calculate(Stack _postFix){
Stack postFix1 = _postFix;
Stack postFix2 = new Stack();
arl1.add("----------------------------------------------\n\n");
arl1.add("2.postfix ¿¬»êÇϱâ\n\n");
arl1.add("----------------------------------------------\n\n");
try{
while(!postFix1.isEmpty()){
postFix2.push(postFix1.pop());
}
Double d_value2 = 0d;
Double d_value1 = 0d;
String operator1 = "";
while(!postFix2.isEmpty()){
postFix1.push(postFix2.pop());
// arl1.add("postFix.peek() :" + postFix.peek() + "\n\n");
Double c = 0d;
if(postFix1.peek().equals("+") || postFix1.peek().equals("-") ||
postFix1.peek().equals("*") || postFix1.peek().equals("/") || postFix1.peek().equals("^")){
operator1 = postFix1.pop();
d_value2 = Double.valueOf(postFix1.pop()).doubleValue();
d_value1 = Double.valueOf(postFix1.pop()).doubleValue();
if(operator1.equals("+")){
postFix1.push(Double.toString(d_value1 + d_value2));
c = d_value1 + d_value2;
}
else if(operator1.equals("-")){
postFix1.push(Double.toString(d_value1 - d_value2));
c = d_value1 - d_value2;
}
else if(operator1.equals("*")){
postFix1.push(Double.toString(d_value1 * d_value2));
c = d_value1 * d_value2;
}
else if(operator1.equals("/")){
postFix1.push(Double.toString(d_value1 / d_value2));
c = d_value1 / d_value2;
}
else if(operator1.equals("^")){
postFix1.push(Double.toString(Math.pow(d_value1, d_value2)));
c = Math.pow(d_value1, d_value2);
}
else{
System.out.println("¿¡·¯");
}
arl1.add(d_value1 +" " + operator1 + " " + d_value2 + " = " + c + "\n\n");
}
}
}
catch(Exception e1){
arl1.add("¿¬»êÁß ¿¡·¯°¡ ³µ½À´Ï´Ù. ½ÄÀ» È®ÀÎÇØ ÁÖ¼¼¿ä.\n\n");
String error_01 = "¿¬»êÁß ¿¡·¯°¡ ³µ½À´Ï´Ù. ½ÄÀ» È®ÀÎÇØ ÁÖ¼¼¿ä.";
return error_01;
}
return postFix1.peek();
}
private int inStackPriority(String s){
if(s.equals("^")) return 5;
else if(s.equals("*")) return 4;
else if(s.equals("/")) return 4;
else if(s.equals("+")) return 3;
else if(s.equals("-")) return 3;
else if(s.equals("(")) return 2;
else if(s.equals("{")) return 1;
else if(s.equals("[")) return 0;
else return 0;
}
private int incomingPriority(String s){
if(s.equals("^")) return 5;
else if(s.equals("*")) return 4;
else if(s.equals("/")) return 4;
else if(s.equals("+")) return 3;
else if(s.equals("-")) return 3;
else if(s.equals("(")) return 7;
else if(s.equals("{")) return 8;
else if(s.equals("[")) return 9;
else return 0;
}
%>
<%=inToPost(request.getParameter("expression"))%>
위 코드가 그 때 만들었던 코드 입니다. 2010년 12월부터 1월초까지 만들었던 것 같습니다. jsp로 만들었었네요. 에디트플러스로 짰던 것 같구요 유니코드로 저장도 안해놔서 한글도 깨져있습니다.
지금 보면 무슨 뜻인지 읽히는데 그 때는 뭔지도 모르고 만들었던 것 같습니다. 100%를 제가 구현한건 아니고 90%정도는 제가 구현하고 10%는 인터넷에서 찾아서 만들었던 것 같습니다.
그때는 한달 걸려서 힘들게 했지만 그 한달이 지금 8년째 개발자로 밥을 먹고 살게 해준 것 같습니다. 곤이지지라도 알면 된다고 생각 합니다. 오늘도 곤이지지는 힘을 내봅니다.
end
- Total
- Today
- Yesterday
- Sh
- vim
- 도커각티슈박스
- 도커각티슈케이스
- 이직
- docker container tissue box
- docker container case
- docker container tissue
- 도커티슈케이스
- 개발자
- Linux
- 싱가폴
- 도커컨테이너
- shellscript
- 도커티슈박스
- 2017 티스토리 결산
- docker container whale
- docker container
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |