20161213


*이문제는 dovelet 에 있는 알고리즘 문제입니다.

 

지하 차도/truck

프로그램 명: truck

 

제한시간: 1 초

제 1 지하차도 를 지나면 2 지하차도 를 지나면 3 지하차도로 이어져있다.

차의 높이가 168 인 경우 세 지하차도의 높이가 주어질 때 지하차도에 충돌하지 않고 건널수 있는지 ( NO CRASH ) 아니면 지하차도에 부딪히는지 ( CRASH X )를 알아내는 프로그램을 작성하는 것이 문제이다.

입력

지하차도의 높이가 입력으로 주어진다. 각 지하차도의 높이는 0 에서 300 이다.

출력

세 개의 지하차도를 무사히 빠져 나가면 "NO CRASH" 를 출력하고 아니면 "CRASH X" 를 출력한다.

즉 지하차도의 높이는 168 이하이면 부딪히고 , X 는 최초로 부딪히는 지하차도의 높이이다.

입출력 예

입력

180 160 170

출력

CRASH 160
출처:South Central USA 2003


제 풀이



1) 풀이1

import java.io.PrintStream;
import java.util.Scanner;

 

 

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

  Scanner sc = new Scanner(System.in);
  
  int carRoad1 = sc.nextInt();
  int carRoad2 = sc.nextInt();
  int carRoad3 = sc.nextInt();
    
  String result = "CRASH ";
  

if(carRoad1 <= 168){       result += carRoad1;
  }else if(carRoad2 <= 168){      result += carRoad2;
  }else if(carRoad3 <= 168){      result += carRoad3;
  }else{                          result = "NO CRASH";
  }
  

System.out.println(result);
 

}
}

 

1) 풀이2

import java.io.PrintStream;
import java.util.Scanner;

 

public class Main {
 
 public static void main(String[] args){
  
  Scanner sc = new Scanner(System.in);
  
  int carRoad1 = sc.nextInt();
  int carRoad2 = sc.nextInt();
  int carRoad3 = sc.nextInt();
     int temp = 0;

     if((temp = carRoad1) > 168 &&(temp = carRoad2) > 168 && (temp = carRoad3) > 168){
   System.out.println("NO CRASH");
  }else{
   System.out.print("CRASH " + temp);
  }
 }
}

 

 

* 개인적인 풀이 내용입니다. 정해진 정답은 없습니다.


 오늘의 풀이는 2가지 입니다.

제가 풀었던 과정은 풀이1 이고 다른 분들 코드에서 참신한 코드가 있어서 풀이2 로 비슷하게 구현해 봤습니다.

 

1번 풀이) 풀이 1의 내용은 입력 받은 3개의 값을 크기를 비교해서 168 보다 같거나 작으면 CRASH + 값 으로 출력하고

모두 기준보다 크면 "NO CRASH" 를 출력합니다.

최초로 출동한 값을 출력하기 위해서 if , else if , else 순서를 이용해서 최초 충돌되는 값을 출력하게 구현 했습니다.

 

2번 풀이) 풀이 2번의 내용은 and 연산자(&&) 를 매우 매력적으로 활용한 코딩이라서 비슷하게 구현해 봤습니다.

168 값과 비교하는 값을 매번 임시 temp 변수에 넣어서 비교를 합니다. 

그리고 && 연산자에서 false 가 나오면 뒷 부분의 비교는 하지 않습니다.

그래서 제일 처음 false 가 판단 될때 temp 값에 들어가는 값이 최초의 충돌 값인 것이죠

 

    그럼 오늘도 열공하세요!

 

20161213


*이문제는 dovelet 에 있는 알고리즘 문제입니다.

 

해킹 회사/hack

프로그램 명:hack

당신은 해킹회사의 사장이다. 이 회사는 친구들을 골리는데 사용하는 악의적인 소프트웨어를 개발하여 이제 출시를 눈 앞에 두고 있다.

가능한 더 많은 제품을 팔기위해 홍보를 고려하고 있다.

홍보를 할 경우의 수입과 하지 않을 경우의 수입을 알때

  • 홍보를 하는 것이 유리한가 아니면
  • 하지 않는 것이 유리한가 아니면
  • 하던 안 하던 수입은 관계가 없는가를 알고자 한다.

입력

입력은 세 개의 정수 r , e ,c 가 주어진다.

  • r 은 홍보를 하지 않을 경우의 수입
  • e 는 홍보를 할 경우의 수입
  • c 는 홍보 비용

출력

세 가지 중 하나를 출력한다.

  • "advertise" : 홍보를 할 경우 유리한 경우
  • "do not advertise" : 차라리 홍보를 하지 않을 경우 유리한 경우
  • "does not matter" : 하던 , 안하던 수입이 같은 경우

입출력 예

입력

0 100 70

출력

advertise

입력

100 130 30

출력

does not matter

출처: Nordic 2006

 


제 풀이



1) 풀이

import java.io.PrintStream; import java.util.Scanner;

public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int b = sc.nextInt(); int a = sc.nextInt(); int c = sc.nextInt(); String temp = ""; if(b > a-c ){ temp = "do not advertise"; }else if(b == a-c){ temp = "does not matter"; }else{ temp = "advertise"; } System.out.println(temp); } }

 




* 개인적인 풀이 내용입니다. 정해진 정답은 없습니다.


  3가지 경우를 구하는 문제 입니다.

   홍보를 해서 수익이 높은 경우 , 홍보를 안해서 높은 경우, 홍보랑 상관 없는 경우 이렇게 3가지 경우가 나오네요.

   자 그럼 입력 되는 값은 3가지 입니다. 홍보를 안했을때 b, 홍보를 했을때 a , 홍보 비용 c

   그럼 이 값들을 가지고  홍보 효과가 있는지를 판단 해야겠죠

   홍보를 했을때 수익에서 홍보 비용을 뺀값과 홍보를 안했을 때 수익을 비교하면 알 수 있습니다. 

   [홍보를 안했을때 VS 홍보를 했을때 - 홍보 비용]    으로 판단을 하는거죠

    이 판단으로 

    

    홍보를 안했을때 가 더 높은 경우

    홍보를 한 경우가 더 높은 경우

    홍보를 안했을때와 했을때가 같은 경우

    

    로 나눠서 판단하면 되는거죠


    네 아직은 어렵지 않네요. 그럼 모두 열공!

 

 

 



  

 

20161209


*이문제는 dovelet 에 있는 알고리즘 문제입니다.

 

수영장 가는 날/swimming

프로그램 명: swimming

제한시간: 1 초

컴돌이는 월,수,금 수영을 신청했습니다.

  1. 월요일
  2. 화요일
  3. 수요일
  4. 목요일
  5. 금요일
  6. 토요일
  7. 일요일

만약의 경우를 위해 수영장 가는 날인지 아닌지를 체크해 주는 프로그램을 다음과 같이 작성하기로 했습니다.

입력

1 에서 7 사이의 자연수가 입력으로 주어진다.

출력

수영장 가는 날이면 enjoy , 아니면 oops 를 출력

입출력 예

입력

1

출력

enjoy

입력

4

출력

oops

 

 


 


제 풀이



1) 풀이

import java.io.PrintStream;
import java.util.Scanner;
public class Main {
 
 Scanner sc = new Scanner(System.in);
 PrintStream p = System.out;
 static int temp = 0;
 public static void main(String[] args)
 {
  
  Main ma = new Main();
  ma.input();
  
     if(temp == 1 || temp ==3 || temp == 5) System.out.println("enjoy");
     else System.out.println("oops");
    
 }
 
 void input()
 {
  temp = sc.nextInt();
 }
}

 




* 개인적인 풀이 내용입니다. 정해진 정답은 없습니다.


   1부터 7까지 숫자 중에서 1,3,5 일경우 "enjoy" 그 이외의 경우는 "ooops" 를 출력하는 문제 입니다.

   저는 if 문 안에 OR 연산자( || ) 를 사용해서 1, 3, 5 인경우 "enjoy" 를 출력하고 그 이외의 경우는 모두

   "oops" 를 출력하게 해줬습니다.

  

   다른 분들의 경우는 1, 3, 5 가 모두 홀수 이기 때문에 2로 나눈 나머지가 1 일때 enjoy 를 출력하도록 했습니다.

   하지만 7 인경우는 피하기 위해서 입력값이 7보다 작은 경우를 추가로 작성 하신 분들이 많습니다.

    if(temp %2 ==1 && temp <7)  이런식으로 간결해 졌네요.

 

 

 

 

 



아래 흰트 개념이 있습니다. 




흰트 개념



수영장 가는날 hint 논리 연산자를 연습하는 문제 입니다.

논리연산자는 세 가지

  • and 연산자(&&): 모두가 참인경우 참
  • or 연산자(||): 하나라도 참이면 참
  • not 연산자(!): 참을 거짓으로 , 거짓을 참으로 변경

이 문제에서는 or 연산자를 사용하면 됩니다.

1
2
3
4
5
6
7
int a;
 
if ( a == 1 || a == 3 || a == 5 ) {// a 값이 1 , 3 ,5 중에 하나이면 참
   ....
}else{
 .....
}

다음 형태로는 사용하지 못합니다.

1
a == 1 || 3 || 5  (x)

 



  

 

20161209


*이문제는 dovelet 에 있는 알고리즘 문제입니다.

 

음표/coci note 

프로그램 명: coci_note

 

제한시간: 1 초

C 장조의 음계는 8 개로 나타내어진다(c d e f g a h C). 이를 1 에서 숫자 8 로 약속을 한다.

1 에서 8 까지의 수가 임의의 순서로 한 번 나오는 수열이 주어질 때 이 수열이 오름차순(ascending)인지 내림차순(descending)인지 아니면 섞여(mix) 있는지 를 알아내는 문제이다.

입력

1 에서 8 까지의 수가 임의의 순서로 한 번 나타난다.

출력

ascending , descending , mixed 중 하나를 출력한다.

입출력 예

입력

1 2 3 4 5 6 7 8

출력

ascending

입력

8 7 6 5 4 3 2 1

출력

descending

입력

8 1 7 2 6 3 5 4

출력

mixed
출처: coci 2009/2010 contest1 1/6

 

 

 


 


제 풀이



1) 풀이

import java.io.PrintStream;
import java.util.Scanner;

public class Main {
 
 Scanner sc = new Scanner(System.in);
 PrintStream p = System.out;
 
 int [] input = new int[8];
 int ascending = 0;
 int descending = 0;
 String result = "";
 
 public static void main(String[] args)
 {
  
  Main ma = new Main();
     for(int i =0; i<8; i++)
     {
      ma.input(i);
     }
     ma.result();
 }
 
 void input(int i) {
  input[i] = sc.nextInt(); 
 }
 
 void result(){
  for(int a = 0; a < input.length-1; a++)
  {
   if(input[a] < input[a+1]) ascending = 1;
   else descending = 1;
  }
  int temp = ascending-descending;
  
  if(temp == 0) result = "mixed";
  else if (temp == 1) result = "ascending";
  else result = "descending";
  
  System.out.println(result);
 }
}




* 개인적인 풀이 내용입니다. 정해진 정답은 없습니다.


   입력한 8개의 값을 오름차순 과 내림차순 그 이외 경우 'Mixed' 를 구별하는 문제 입니다. 

   2층 문제는 If (조건문)으로만 해결하는게 좋긴 하지만 너무 for 문을 쓰고 싶게 만드는 문제 였습니다.

   저는 for 문을 이용해서 오름차순 1개 내림차순 1개 변수를 만들어줘서 발생할때 1을 입력해주고

   마지막에 연산한 결과로 3가지 경우를 판단하는 코드를 작성했습니다.

  다른 분들 code 를 보면

   if( 1번 값 < 2번값 && 2번값 < 3번값 ....) 반복해서 if, else if, else 로 for(반복문) 없이 푼 분들도 있었습니다.

   계속 반복해서 비교 해줘야 한다는 생각에 and 연산자(&&)를 생각 못 했던 것 같네요.

  

20151126


*이문제는 dovelet 에 있는 알고리즘 문제입니다.



분수 크기 비교/compare 



프로그램 명: comparefrac

제한시간: 1 초


a/b 와 c/d 의 대소를 판단하는 프로그램이다.

입력

자연수 a , b, c ,d 가 입력으로 주어진다. 입력되는 수는 10000 이하이다.

출력

  • a/b > c/d 이면 1
  • a/b = c/d 이면 0
  • a/b < c/d 이면 -1

을 출력한다.

입출력 예

입력

3 4 5 6

출력

-1




제 풀이



1) 풀이

import java.io.PrintStream;
import java.util.Scanner;
  
public class Main {
   
    Scanner sc = new Scanner(System.in);
    static PrintStream p = System.out;
    double a;
    double b;
    double c;
    double d;
      
    public static void main(String[] args) {
        Main m = new Main();
        m.input();
        m.Output();
    }
    void input(){
        a = sc.nextInt();
        b = sc.nextInt();
        c = sc.nextInt();
        d = sc.nextInt();
    }
    void Output(){
        a = a/b;
        c = c/d;
        if(a > c){
            p.print("1");
        }else if(a == c){
            p.print("0");
        }else{
            p.print("-1");
        }
    }  
}




*짧게 코딩하는것도 좋지만 저는 함수와 객체 지향개념을 쓰고 싶어서 이렇게 코딩 했습니다.


분수의 크기를 비교하는 문제 입니다. 정수형인 int 값으로 분수 형태를 저장하게 되면 몫

나눈 몫 값만 남게 되기 때문에 분수의 크기를 비교 할 수 없습니다. 그래서 저는 실수 값도 받는

Double 형으로 받아서 문제를 해결했습니다.


좀 더 수학적인 방법으로는 아래와 같은 흰트 개념을 참고해서 분수의 크기를 정수로 처리가 가능합니다.
컴퓨터에서 가능하면 실수처리를 피하는게 좋다고 하니 흰트 개념을 잘 이용해 보세요.



아래 흰트 개념이 있습니다. 




흰트 개념



분수크기 비교 hint

입력되는 수가 정수이므로 정수로 입력을 받습니다.   
1
scanf("%d %d %d %d",&a,&b,&c,&d); //  a/b , c/d
두 분수를 통분하면

b*d 의 부호는 양수이므로 분자의 a*d - b*c 가 양수인지 0 인지 음수인지만 판단하면 됩니다.

컴퓨터에서 정수처리가 가능하다면 실수처리를 피하는 게 좋습니다. 실수연산의 결과는 완전히 신뢰할수가 없습니다.






20151124


*이문제는 dovelet 에 있는 알고리즘 문제입니다.



대소 판별하기/compare 



프로그램 명: compare

제한시간: 1 초


두 정수를 입력으로 받아

  • 앞수가 뒷수 보다 크면 >
  • 앞수가 뒷수 보다 작으면 <
  • 같으면 =

를 출력하는 프로그램을 작성하세요.

입출력 예

입력

3 4

출력

<

입력

4 4

출력

=





제 풀이



1) 풀이

import java.io.PrintStream;
import java.util.Scanner;
  
public class Main {
   
    Scanner sc = new Scanner(System.in);
    static PrintStream p = System.out;
    int n1;
    int n2;
      
    public static void main(String[] args) {
        Main m = new Main();
        m.input();
        m.Output();
    }
    void input(){
        n1 = sc.nextInt();
        n2 = sc.nextInt();
    }
    void Output(){
        if(n1 > n2){
            p.print(">");
        }else if(n1 < n2){
            p.print("<");
        }else{
            p.print("=");
        }
    }
  }




*짧게 코딩하는것도 좋지만 저는 함수와 객체 지향개념을 쓰고 싶어서 이렇게 코딩 했습니다.


간단한 조건문인 if 문법만 알면 푸는 문제 였습니다.ㅎ

풀이가 필요없죠.


+ Recent posts