본문 바로가기

study/baekJun

[백준10817/자바/for문/if문]백준10817 세 수

 

출처 : https://www.acmicpc.net/problem/10817

세 수를 입력하고 그 중 두번째로 큰 수를 출력하는 문제

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;

public class qn10817{
   public static void main(String[] args) throws IOException{
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
      
      String init = br.readLine(); //일렬로 세 수 입력
      
      String[] num = init.split(" ");
      int [] nums = Arrays.stream(num).mapToInt(Integer::parseInt).toArray();
      int countMin = 0, countMax = 0;
      int min = 101, max = 0;
      int second = 0; //두번째로 큰 수
      
      for(int i=0;i<nums.length;i++){
         if (nums[i]<min){
            min = nums[i];
         }
         if(nums[i]>max){
            max = nums[i];
         }
      }
//      System.out.println("min :"+ min);
//      System.out.println("max :"+ max);
      
      for(int i=0;i<nums.length;i++){
         if (nums[i] != min && nums[i] != max) second = nums[i]; //세 값이 다 다를때
         else{ //두개가 같고 하나만 다를 경우
            if(nums[i] == min ){
               countMin ++;
               if(countMin == 2) second = min;
            }
            else if(nums[i] == max ){
               countMax ++;
               if(countMax == 2) second = max;
            }
            
         }
      }
      
      bw.write(String.valueOf(second));
      bw.flush();
      bw.close();
      br.close();
   }
}

 

먼저 String배열로 입력을 받고 int형 배열로 변환시켜준다.

Arrays.stream(num).mapToInt(Integer::parseInt).toArray();

 이 부분이 String -> int로 변환을 시켜주는 부분이다. 

일단 min과 max를 찾은 후

 

1. min도 아니고 max도 아닌 수를 찾기

 

2.만약 10 10 20, 20 30 30일 시에 min이나 max가 두개란 뜻인데 이를 방지하기 위해

이중if문을 작성하였다.

min과 max가 각각 하나씩밖에 없다면 minCount, maxCount가 각각 0인채로 끝났을 것이다.

 

10 10 20을 입력하여 min이 10이라면 else if문을 타고 들어가 countMin을 증가시킬 것이고

이 때 2가 되었을 때 min의 값을 출력해주면 된다.

 

 

주의할 부분이 있다면

for(int i=0;i<nums.length;i++){
         if (nums[i]<min){
            min = nums[i];
         }
         if(nums[i]>max){
            max = nums[i];
         }
      }

 

이 부분인데 for문 안에 if를 처음에 if(min)찾고 else if(max)를 찾았는데 결과가 실패로 뜨는 것이다.

로그를 찍어보니 min을 찾으면 max를 안찾고 코드가 끝나버리는 것이었다.

그래서 바로 if(min) if(max)를 찾아 성공하였다.

 

 

다른 사람과 코드를 비교했을 때 내 코드가 너무 쓸데없이 길고 시간도 두배이상 오래걸렸었다....

내가 너무 복잡하게 생각했나부다 ㅜ 담엔 더 간단하게 해야징..