8월, 2015의 게시물 표시

try-cat.ch 4

삼각형의 종류를 판별하라 삼각형의 세변의 길이가 주어질때 직각삼각형인지, 예각삼각형인지, 둔각 삼각형인지를 판별하시오 --------------------------------------------------------------------- package trycatch; import java.util.Scanner; public class no4 { public static void main(String [] args){ Scanner sc=new Scanner(System.in); System.out.print("숫자 3개를 입력하시오 : "); int fst=sc.nextInt(); int snd=sc.nextInt(); int lst=sc.nextInt(); String result=Trian(frs,scd,lst); System.out.println(result); } static String Trian(int a,int b,int c){ int sum=(int)Math.pow(a,2)+(int)Math.pow(b,2); if(sum==Math.pow(c,2))return "직각"; else if(sum>Math.pow(c,2))return "예각"; else return"둔각"; } } ------------------------------------------------------------------------------- 이렇게 풀었으나 정답은 입력값으로 하는 것을 원한게 아니라 그냥 고정값을 원했다. 이게 더 어려워 보여서 그냥 이걸로 올릴란다.

#2 <칼의 노래>를 읽으며..

이미지
책 정보 저자 : 김훈 출판사 : 생각의 나무 "버려진 섬마다 꽃이 피었다." 칼의 노래의 첫 마디이다. 전쟁 중 피난 간 백성들이 버린 섬에 시간이 지나 꽃은 여전히 피어있다는 것 같다. 문장 하나가 책 한 권을 함축하고 있다. 저번에 읽은 담론과 비슷하게 문장 하나하나가 아름답고 단순하다. 임금 선조의 여린 마음씨와 무능한 조정 그리고 그 사이에서 왜군과 힘들게 싸우고 있는 이순신 장군의 위대함을 알 수 있는 책이었다. 책을 읽으며 궁금해서 책에 대해 네이버에 쳐봤는데 이순신 장군의 업적이나 영국 발라드 제독이 이순신 장군과 영국의 영웅 넬슨 제독과 견주어 평가했고 일본 도고 제독 또한 이순신 장군에 비하면 자신은 부사관도 못했을 것이다라는 평가를 보고 위대함을 느꼈다. 마지막으로 감명 받았던 부분을 적어야겠다. 이순신 장군의 부하 송여종이 적군과 싸우고 돌아와서 포로로 잡혀온 적군을 자신이 모두 죽이고 싶다고 이순신의 허락을 맡는 부분이다. 하지만 포로는 왜군에게 포로로 잡혀간 조선 백성이었다. 송여종이 자신의 부하를 죽인 조선 백성을 죽이겠다고 하자 베어져야 할 자는 너다라는 말을 한다. 또한 이순신 장군 자신 또한 베어져야한다고 한다. 백성을 온전히 지켰더라면 , 어찌 백성이 너에게 총을 쏘았겠느냐고 하자 송여종은 외면하고 다음 날 포로를 죽이지 않았다. 멋있는 리더십이다. 적고 싶은 것들이 많지만 이 정도로만 해야겠다.

프로젝트 오일러 31

영국의 화폐 단위는 파운드(£)와 펜스(p)이고, 동전의 종류는 아래와 같습니다. 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p), £2 (200p) 이 동전들을 가지고 2파운드를 만드는 방법은 다양할 것입니다. 예를 하나 들면 이렇습니다. 1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p 2파운드를 만드는 서로 다른 방법은 모두 몇가지나 있습니까? ------------------------------------------------------------- target = 200 coins = [1, 2, 5, 10, 20, 50, 100, 200] ways = [1] + [0]*target for coin in coins:     for i in range(coin, target+1):         ways[i] += ways[i-coin] print ways[-1] ----------------------------------------------------------------- 이런 알고리즘 사용하는 게 아직 쉽지 않다.. 나는 for문 여러개 만들어서 했지만 답은 dp 알고리즘이 더 간단하다. 아직 읽지 못한 알고리즘 책을 읽어야겠다..

프로젝트 오일러 30

각 자리의 숫자를 4제곱해서 더했을 때 자기 자신이 되는 수는 놀랍게도 단 세 개밖에 없습니다. 1634 = 1 4  + 6 4  + 3 4  + 4 4 8208 = 8 4  + 2 4  + 0 4  + 8 4 9474 = 9 4  + 4 4  + 7 4  + 4 4 (1 = 1 4 의 경우는 엄밀히 말해 합이 아니므로 제외합니다) 위의 세 숫자를 모두 더하면 1634 + 8208 + 9474 = 19316 입니다. 그렇다면, 각 자리 숫자를 5제곱해서 더했을 때 자기 자신이 되는 수들의 합은 얼마입니까? ------------------------------------------------------------------------------------- res=0 ans=0 num=2 while True:     strNum=str(num)     for i in range(0,(len(strNum))):         res+=pow(int(strNum[i]),5)     if(res==num):         ans+=num     num+=1     res=0     if(num==200000):break print ans ---------------------------------------------------------------------------------------- 반복문 종료조건을 정확히 했어야 했는데 수학적으로 접근하기 힘들어서 그냥 무한루프 돌리고 마지막 값 종료 조건으로 해서 풀었다. 뭔가 맞히고도 찜찜하다...

try-cat.ch 3

해당하는 모든 소수를 출력하라 소수란 1과 자기 자신만을 약수로 가지는 수이다. 100이하의 자연수 중 모든 소수를 출력하시오. 소수를 오름차순으로 출력한다. 각 출력값 사이는 공백으로 구분하고, 출력값 5개 마다 줄바꿈을 한다. ------------------------------------------------------------------- public class Main { public static void main(String[] args) { int count=0,count1=1;         int i,j;         System.out.print(2+" ");         for(i=3;i             for(j=2;j                 if(i%j==0)break;                 else count++;             }             if(count1==4 && count==i-2){             System.out.println(i+" ");             count1=0;                 continue;             }     ...

프로젝트 오일러 29

2 ≤  a  ≤ 5 이고 2 ≤  b  ≤ 5인 두 정수  a ,  b 로 만들 수 있는  a b 의 모든 조합을 구하면 다음과 같습니다. 2 2 =4,  2 3 =8,  2 4 =16,  2 5 =32 3 2 =9,  3 3 =27,  3 4 =81,  3 5 =243 4 2 =16,  4 3 =64,  4 4 =256,  4 5 =1024 5 2 =25,  5 3 =125,  5 4 =625,  5 5 =3125 여기서 중복된 것을 빼고 크기 순으로 나열하면 아래와 같은 15개의 숫자가 됩니다. 4,  8,  9,  16,  25,  27,  32,  64,  81,  125,  243,  256,  625,  1024,  3125 그러면, 2 ≤  a  ≤ 100 이고 2 ≤  b  ≤ 100인  a ,  b 를 가지고 만들 수 있는  a b 는 중복을 제외하면 모두 몇 개입니까? ---------------------------------------------------------- result=list() for i in range(2,101):     for j in range(2,101):         result.append(pow(i,j)) result=list(set(result)) n=len(result) print n ------------------------------------------------------------- 문제가 점점 가면 갈수록 쉬워지고 코드가 짧아지니 ...

try-cat.ch 2

주어진 숫자를 한글로 읽어보자 숫자단위에 아직 미숙한 어린 아이들을 대상으로 숫자가 한글로 출력되는 프로그램을 만들고자 한다. --------------------------------------------------------------------------------------------------- package trycatch; import java.util.Scanner; public class no2 { public static void main(String[] args){ Scanner scan=new Scanner(System.in); int i,plc=0,result; String numString=null; int num=scan.nextInt(); String[] han={"일","이","삼","사","오","육","칠","팔","구"}; String[] han1={" ","십","백","천","만","십만","백만","천만","억",}; no2 myNo2=new no2(); int findNum=myNo2.find(num)-1; for(i=findNum;i>=0;i--){ plc=(int) (num%Math.pow(10,i)); plc=num-plc; result=(int)(plc/Math.pow(10,i)); result=result%10; switch(result) { case 1 : numString="일"; break; case 2 : numString="...

프로젝트 오일러 28

숫자 1부터 시작해서 우측으로부터 시계방향으로 감아 5×5 행렬을 만들면 아래와 같이 됩니다. 21  22 23 24  25 20   7   8   9  10 19  6   1   2 11 18   5   4   3  12 17  16 15 14  13 여기서 대각선상의 숫자를 모두 더한 값은 101 입니다. 같은 방식으로 1001×1001 행렬을 만들었을 때, 대각선상의 숫자를 더하면 얼마가 됩니까? --------------------------------------------------------------------------- result=0 for i in range(2,502):     result+=2*(pow((2*i-1),2)+pow((2*i-3),2)+2*(i-1)) print result+1 ----------------------------------------------------------------------------- 그냥 수열화해서 풀었다. 

프로젝트 오일러 27

오일러는 다음과 같은 멋진 2차식을 제시했습니다. n 2  +  n  + 41 이 식의  n 에다 0부터 39 사이의 숫자를 넣으면, 그 결과는 모두 소수가 됩니다. 하지만  n  = 40일 때의 값 40 2  + 40 + 41 은 40×(40 + 1) + 41 이므로 41로 나누어지고,  n  = 41일 때 역시 41 2  + 41 + 41 이므로 소수가 아닙니다. 컴퓨터의 발전에 힘입어  n 2  − 79 n  + 1601  이라는 엄청난 2차식이 발견되었는데, 이것은  n 이 0에서 79 사이일 때 모두 80개의 소수를 만들어냅니다. 이 식의 계수의 곱은 -79 × 1601 = -126479가 됩니다. 아래와 같은 모양의 2차식이 있다고 가정했을 때, n 2  +  an  +  b     (단  |  a  | < 1000, |  b  | < 1000) 0부터 시작하는 연속된  n 에 대해 가장 많은 소수를 만들어내는 2차식을 찾아서, 그 계수  a 와  b 의 곱을 구하세요. ------------------------------------------------------------------------------- import math def get_primes(n):     numbers = set(range(n, 1, -1))     primes = []     while numbers:         p = numbers.pop()         primes.append(p)       ...

프로젝트 오일러 25

피보나치 수열은 아래와 같은 점화식으로 정의됩니다. F n  = F n -1  + F n -2   (단, F 1  = 1, F 2  = 1). 이에 따라 수열을 12번째 항까지 차례대로 계산하면 다음과 같습니다. F 1  = 1 F 2  = 1 F 3  = 2 F 4  = 3 F 5  = 5 F 6  = 8 F 7  = 13 F 8  = 21 F 9  = 34 F 10  = 55 F 11  = 89 F 12  = 144 수열의 값은 F 12 에서 처음으로 3자리가 됩니다. 피보나치 수열에서 값이 처음으로 1000자리가 되는 것은 몇번째 항입니까? ------------------------------------------------------------------ a,b,i=0,1,1 while b     a,b=b,a+b     i=i+1 print b , i ------------------------------------------------------------------- 제일 적은 코드로 쓴 것이다. a,b=b,a+b라는 코드를 구글 보고 찾아냈다. 파이썬이라 그런지 굉장히 간편했다.

프로젝트 오일러 22

여기 5천개 이상의 영문 이름들이 들어있는 46KB짜리 텍스트 파일  names.txt  이 있습니다 (우클릭해서 다운로드 받으세요). 이제 각 이름에 대해서 아래와 같은 방법으로 점수를 매기고자 합니다. 먼저 모든 이름을 알파벳 순으로 정렬합니다. 각 이름에 대해서, 그 이름을 이루는 알파벳에 해당하는 숫자(A=1, B=2, ..., Z=26)를 모두 더합니다. 여기에 이 이름의 순번을 곱합니다. 예를 들어 "COLIN"의 경우, 알파벳에 해당하는 숫자는 3, 15, 12, 9, 14이므로 합이 53, 그리고 정렬했을 때 938번째에 오므로 최종 점수는 938 × 53 = 49714가 됩니다. names.txt에 들어있는 모든 이름의 점수를 계산해서 더하면 얼마입니까? ---------------------------------------------------------------------- result=0 sum=0 li=list() f = open("C:/Users/15U530/Desktop/names.txt",'r') lines = f.readline() li=lines.split(',') li.sort() for i in range(0,5163):     for j in range(0,len(li[i])-2):         sum+=ord(li[i][j+1])-64     result+=sum*(i+1)     print result     sum=0 f.close() -------------------------------------------------------------------------- 이때까지 파일 입출력과 문자열이 나오면 굉장히 힘들었지만 파이썬으로 하니 함수가 다 있어 너무 편하다. 좋다. 프로젝트 오일러 문제는 파이썬으로 풀어야겠다.

프로젝트 오일러 21

n 의 약수들 중에서 자신을 제외한 것의 합을  d ( n ) 으로 정의했을 때, 서로 다른 두 정수  a ,  b 에 대하여  d ( a ) =  b  이고  d ( b ) =  a  이면 a ,  b 는 친화쌍이라 하고  a 와  b 를 각각 친화수(우애수)라고 합니다. 예를 들어 220의 약수는 자신을 제외하면 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 이므로 그 합은  d (220) = 284 입니다. 또 284의 약수는 자신을 제외하면 1, 2, 4, 71, 142 이므로  d (284) = 220 입니다. 따라서 220과 284는 친화쌍이 됩니다. 10000 이하의 친화수들을 모두 찾아서 그 합을 구하세요. --------------------------------------------------------------------------- sum=0; sum2=0; Fsum=0; for i in range(2,10001):         for j in range(1,i):         if i%j==0:             if i==j:                 break;             sum+=j;         else:             continue;     for k in range(1,sum):         if sum%k==0: ...

프로젝트 오일러 20

n ! 이라는 표기법은  n  × ( n  − 1) × ... × 3 × 2 × 1을 뜻합니다. 예를 들자면 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800 이 되는데, 여기서 10!의 각 자리수를 더해 보면 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 입니다. 100! 의 자리수를 모두 더하면 얼마입니까? --------------------------------------------------------------------------------- ans = 1; i=1 j=1; sum; for j in range(1,100):      ans *= j; print ans; while True:     if ans==0:         break;          if i==1:         sum = ans%10;     else:         sum+=ans%10;          ans= ans // 10; //버젼 3으로 올라가면서 자동으로 소수점을 없앤다지만 버젼 2는 아직                              //연산자를 써야 소수점이 없어진다.     i=i+1;       print sum; ------------------------------------------------------------------------------ 파이썬은 프로젝트 오일러를 풀기에 적합한...

#1 <담론>을 읽으며..(3)

이제 1부를 모두 다 읽고 2부를 읽고 있다. 저자의 말씀으로는 2부가 1부보다 더 쉽다고 했는데 내용이 더 깊다. 2부에는 쓰고 싶은 부분이 너무 많다. 2부의 80페이지 가량 읽었지만 감동한 부분이 한 두 곳이 아니다. 그래도 최대한으로 추려서 적어야봐야겠다.  P.219 쪽에 청구회 추억 후기부분이다. "우리의 삶은 수많은 추억으로 이루어져 있음은 물론입니다. 그러나 우리는 우리의 모든 추억을 다시 만날 수 있는 것은 아닙니다. 과거를 만나는 곳은 언제나 현재의 길목이기 때문이며, 과거의 현재에 대한 위력은 현재가 재구성하는 과거의 의미에 의하여 제한되기 때문일 것입니다. 더구나 추억은 옛친구의 변한 얼굴처럼 전혀 다른 모습으로 나타나기 때문에 그것이 추억의 생환이란 사실을 훨씬 나중에야 깨닫게 되기도 합니다. ......... 생략  ........... 그러나 우리는 추억에 연연해하지 말아야합니다. 추억은 화석 같은 과거의 이야기가 아니라 부단히 성장하는 살아있는 생명체이며, 언제나 새로운 만남으로 다가오기 때문입니다."  쓰다보니 거의 대부분을 썼다. 참 멋있는 문구이다. 사실 나는 추억에 대해 별로 얘기할 거리가 없다. 기억력이 안좋아서 그런지 여행이나 좋은 기억들을 모두 잊어버리기 때문이다. 최근에 "내일로" 기차 여행도 순천의 자전거 여행과 패러글라이딩의 메스꺼움과 게스트 하우스 밖에 기억이 안난다. 올해 초에 갔던 유럽은 정말 한참 더듬어야 기억이 난다.  위 문구 중에도 마지막 부분인 "언제나 새로운 만남으로 다가오기 때문입니다."가 가장 감명 깊었다. 과거의 '나'가 느꼈던 추억, 현재의 '나'가 느끼는 추억과 미래의 '나'가 느낄 추억이 모두 다를 것이다. "내일로" 여행 중 제일 좋았던 순천 자전거 여행이 미래에 어떻게 다가 올지 기대된다.  P.251 쪽에 주인공과 엑스트라의 차이에 대한 부분이다. ...