본문 바로가기
Team 발표 과제

백준 java 1356번 유진수

by new CoStudy 2024. 9. 30.
더보기
팀원: 유진, 현지, 효권, 이삭
문제
https://www.acmicpc.net/problem/1356




<백준 1356번 문제>


 

문제 이해하기

<유진수 이해하기>


  • 처음 그림은 순차적으로 곱해준 배열이고, 두번째 그림은 역순으로 곱해준 배열이다.
  • 순차적 배열의 마지막 값과 역순 배열의 첫 번째 값은 모든 값을 곱한 값과 같기 때문에 유진수로 볼 수 없다.
  •  1과 36, 2와 18,  6과 6 이런 식으로 비교할 때 6과 6이 서로 같기 때문에 1236 문자열은 유진수가 된다.

 

예제

  • 입력
1236
  • 출력
YES
  • 입력
1
  • 출력
NO
  • 입력
42393338
  • 출력
YES


 

코드 상세


package study;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.stream.Stream;

public class study_1356_2 {
	public static void main(String[] args) throws NumberFormatException, 
	                                                       IOException {
	
	
	System.out.println("입력하세요");
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//입력
	while(true) {
		int multiF = 1;
		int multiB = 1;
		boolean ynum = false; 
	Integer num = Integer.parseInt(br.readLine());//입력
	int[] fNum = Stream.of(String.valueOf(num).split("")).mapToInt
	   (Integer::parseInt).toArray();
	    System.out.println("int[] fNum : " + Arrays.toString(fNum)); 
	 
	 for(int i =0;i<fNum.length-1;i++) {			 
		  int j = (fNum.length-1);//-i;			
		  multiF *= fNum[i];			
		  //System.out.println("f는 "+multiF);	
		  
		  for(int k=j; k>i;k--) {
			  multiB *= fNum[k];	
		//	  System.out.println("b는 "+multiB);	
			  
		  }
		 // System.out.println("b는 "+multiB);	
		  if((multiF == multiB)) {
			  ynum=true;
			  System.out.println("유진수");
		  }
		
		  multiB = 1;
		  
	    }
	    if(ynum!=true) {
		  System.out.println("유진수아님");
	    }
  	   }
	  }
	 }

 

 


 

 

코드 방법2 상세


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

public class Main {

	public static void main(String[] args) throws IOException{ // IO객체 예외처리 작업 필요
	      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 키보드 입력, 입력된 데이터가 버퍼를 거쳐 전달
	      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 할당된 버퍼에 값을 저장
	      
	      while(true) {
	    	  int n = Integer.parseInt(br.readLine()); //  정수형 타입으로 입력값을 저장하는 변수 선언
	    	  
	    	  if(n <= 2147483647 && n > 0) { // 범위에 해당하는 값만 입력값으로 받는 조건주기
	    		  String N = Integer.toString(n); // 정수타입으로 받은 값을 문자열로 형변환하여 저장하는 변수 선언.
	    		  
		    	  char[] arrStr = N.toCharArray();// String 객체 타입을 char 문자형 배열로 저장하는 배열 선언.
		    	  
		    	  int[] arrInt = new int[arrStr.length]; // 위의 선언한 char 배열과 같은 배열크기를 가진 정수형 배열 선언.
			      
		    	  // arrStr 배열에 저장된 배열의 주소값을 arrInt 배열의 값으로 저장. 
			      for(int i = 0; i < arrStr.length; i++) {
			         arrInt[i] = arrStr[i] - '0'; 
			      }
			        
			      int[] num1 = new int[arrInt.length]; // 원래 순서대로 비교할 값을 저장한 배열인 num1.
			      									   //arrInt배열의 크기와 같은 크기로 지정해야 인덱스가 맞음. 

			      for(int i = 0; i < arrInt.length; i++) {
			    	  if(i == 0) { 				// 인덱스가 0일때는
			    		  num1[i] = arrInt[i]; 	// arrInt[0]의 값을 num1[0]에 저장함.
			    	  }else {							   // 예) 인덱스가 1~3일때는
			    		  num1[i] = num1[i-1] * arrInt[i]; // 예) num[2]에 num[1] * arrInt[2] 값을 대입. 
			    	  }
			      }
			         
			      int[] num2 = new int[arrInt.length];  // 역순으로 비교할 값을 저장한 배열인 num2.
					   									// 똑같이 arrInt배열의 크기와 같은 크기로 지정해야 인덱스가 맞음. 
			      
				  for(int j = arrInt.length - 1; 0 <=  j ; j--){ // arrInt.length - 1 이렇게 초기값을 주어야 원래순서의 배열()에서 
					  											 // 마지막 인덱스의 값을 처음 인덱스로 저장하는 형태인 배열 num2를 생성할 수 있음.
					  if(j == arrInt.length - 1) {				 // 배열 arrInt 마지막 인덱스의 값이 시작 인덱스 값과 같을 때, 
						  num2[j] = arrInt[arrInt.length - 1];	 // 배열 arrInt 마지막 인덱스의 값을 시작 인덱스 값에 대입
					  }else {									 // 예) 이후 배열의 인덱스를 3~1로 감소시킬때, 
						  num2[j] = num2[j + 1] * arrInt[j];	 // 예) num2[2] = num2[3] * arrInt[2] 값을 대입.
					  }      
				  }
				  
			      String result = "NO"; // 결과값에 유진수가 아닐때 초기값 NO가 출력됨.
				  for(int e = 0; e < arrInt.length - 1; e++) {
					  if(num1[e] == num2[e+1]) { // num1 배열의 마지막 값과 num2 배열의 처음 값은 모든 수를 더한 수이기에 유진수로서 비교할 가치가 없음.
						  result = "YES"; // 비교 후 두 배열의 값, 즉 유진수가 존재한다면 결과값 변수에 YES를 다시 저장(이전의 객체(NO)는 삭제되고 새로운 객체로 선언됨)
						  break; // 유진수가 존재하므로 for문 탈출.
					  }
				  }
				  
			      bw.write(result); // 버퍼에 담긴 값(result 저장값) 출력
				  break; // 입력값의 범위를 주기 위한 while문 탈출
	    	  }else {
	    		  System.out.println("다시 입력해주세요"); // 처음 입력값의 범위가 "2,147,483,647보다 작거나 같은 자연수"가 아니면 재입력
	    	  }
	      }
	      
	      // 남아있는 데이터를 모두 출력시키고, 스트림을 닫음.
	      bw.flush();
	      bw.close();
	      br.close();
	   }
}

 

 


 

테스트 결과


  • BufferedReader로 입력값을 받고,
  • BufferedWriter라는 객체로 결과값을 출력했는데 성능이 좋게 나옴.

참조

 

(JAVA) 백준 1356번 : 유진수 --- [문자열, 수학]

https://www.acmicpc.net/problem/1356 1356번: 유진수 첫째 줄에 수 N이 주어진다. 이 수는 2,147,483,647보다작거나 같은 자연수이다. www.acmicpc.net 안녕하세요. 이 문제는 문자열 + 수학 문제이다. int 최대치까지

maivve.tistory.com

 

 

[백준/BOJ] 1356번 : 유진수 (JAVA / 자바)

안녕하세요~ 코딩하는 코알못 코메인입니다. https://www.acmicpc.net/problem/1356 1356번: 유진수 첫째 줄에 수 N이 주어진다. 이 수는 2,147,483,647보다 작거나 같은 자연수이다. www.acmicpc.net - 문제 - 난이도

comain.tistory.com

 

 

[JAVA] BufferedReader 와 Bufferedwriter 사용법

BufferedReader :Scanner와 유사. Bufferedwriter :System.out.println();과 유사 둘은 모두 기존에 ...

blog.naver.com

 

 

[Java] 증감연산자 쉽게 이해하기

증감연산 (++, --)자바는 ++, -- 기호를 이용하여 값을 증가하거나 감소시킬 수 있다. 이러한 ++, -- 기호를 증감 연산자라고도 한다.다음의 예를 보자.System.out.println(i);System.out.println(j);i에 0, j에 10을

velog.io

 

 

[Java] String을 int로, int를 String으로 변환하기 (문자열 숫자 변환)

String -> int (문자열을 숫자로) String 문자열을 int로 변환하기 위해서는 java.lang.Integer 클래스의 parseInt()와 valueOf() 메소드를 사용할 수 있습니다. Integer.parseInt() static int parseInt​(String s) java.lang.Intege

hianna.tistory.com