팀원: 유진, 현지, 효권, 이삭
문제
https://www.acmicpc.net/problem/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
'Team 발표 과제' 카테고리의 다른 글
백준 (자바)문제 7785번 "회사에 있는 사람" (0) | 2024.10.03 |
---|---|
1417. 국회의원 선거 (0) | 2024.10.02 |
No 2775번 부녀회장이 될테야 (0) | 2024.10.02 |
백준 30802번 웰컴 키트 (0) | 2024.10.02 |
백준 2839번 설탕배달 (1) | 2024.10.01 |