[백준 알고리즘] 단계별 문제풀이 Lv.4 while문

Song·2022년 1월 3일
0

studyAlgorithm

목록 보기
4/5

백준 10952번

A+B를 while문으로 출력하라

입력받은 두 수의 더한값을 출력하는 문제인데, for문 때의 문제와 다르게 첫번째 입력값으로 테스트 케이스의 개수가 정해져 들어오지 않는다. 즉, for문 돌릴 때 필요한 범위 제한 값이 없기 때문에 언제까지 반복문을 돌려야하는지 정확한 개수가 정해져 있지 않은 경우 while문을 사용한다.

while문은 조건문이 false가 되는 순간 while문을 빠져나온다.

따라서 다음과 같이 코드를 작성했는데, 틀렸다고 나왔다.

import java.util.*;

public class Q10952 {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        
        int result = 1;
        //result = 1 (result 초기값은 1로 설정)
        //첫번째 입력: result = 1, num1 = 1, num2 = 1   
        //두번째 입력: result = 2, num1 = 2, num2 = 3
        //세번째 입력: result = 5, num1 = 0, num2 = 0
        // -> 세번째 입력의 경우 0과 0의 입력이 들어오는 순간 while문에 들어가지 않고 while문을 빠져나와야 하는데, 두번째 입력의 result값이 5로 저장되어 있기 때문에 while문을 들어간 후 그 다음 네번째 입력 전에 while문을 빠져나온다.
        
        while(result != 0){
        	//1
            //2
            int num1 = scan.nextInt();
            //1
            //3
            int num2 = scan.nextInt();
            
            //2
            //5
            result = num1 + num2;
            System.out.println(result);
        }
        
    }
}

위의 코드와 같이 처리할 경우 출력 결과가 마지막 0일때까지도 더한 값 0을 출력하기 때문이다.
하지만 0일때는 출력하지 않고 while문을 빠져나와야 하기 때문에 조정해줘야 한다.

public class Q10952 {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        
        int result = 1;
        
        
        while(result != 0){
            int num1 = scan.nextInt();
            int num2 = scan.nextInt();

            result = num1 + num2;
            if(result != 0){
            //더한값이 0일때는 출력하지 않도록 조건 하나를 더 걸어준다.
                System.out.println(result);
            }
        }
        
    }
}

결국은 조건을 하나 더 추가하여 출력예제와 똑같이 나오도록 했다. 문제를 통과했지만 찝찝한 점은... 이렇게 if조건 하나하나 덕지덕지 붙여가며 코딩하는건 좋지 않은 것 같아 while문 안에서만 해결할 수 있는 방법이 있는지 다시 생각해봐야 했다.

백준 10951번

A + B 출력

입력의 끝이 정해져 있지 않은 채로 scanner 입력을 받아 더한 값을 출력해준다.

다음과 같은 값들이 입력값으로 들어온다. 이때까지의 더하기 값 출력하기 문제들과 다른 점은 입력값이 언제 끝날지 모른다는 것이다. EOF(End of File)는 더이상 파일에서 데이터를 읽어들일 수 없을 때로 이를 활용할 수 있다. 끝나는 지점을 명확히 알기 어려운 경우에 필요하다.

public class Main {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        //결과값 초기화
        int sum = 1;
        
        //hasNext() 함수는 scanner가 입력값을 읽어올 때, 다음으로 불러올 data가 있는지를 따져본다.
        //다음에도 값이 있다면 
        while(scan.hasNext()){
        	//반복해서 다 더한 값을 출력해냄
            
            int a = scan.nextInt();
            int b = scan.nextInt();
            sum = a+b;
            System.out.println(sum);
        }
    }
}

scanner를 사용해 입력값을 받았다면 hasNext()함수로 그 다음으로 올 문자열을 확인해 볼 수 있다. 만약 다음에 입력값이 또 있다면 hasNext()는 true값이 되어 while문을 돌게 된다.

백준 1110번

더하기 사이클


import java.util.*;
public class Q1110 {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);

        int originNum = scan.nextInt();
        

        int newNum = originNum;
        int count = 0;
        //String mixedNumString = "";
        //int mixedNumInt = 0;
        
        //while문 조건을 true 말고 직접 조절하려고,
        //while(mixedNumInt != originNum)으로 했는데 백준에서는 계속 틀렸다고 나온다
        //디버깅 결과는 동일하게 나옴
        
        
        while(true){
            //입력받은 수의 일의 자리수를 구함
            int digit2 = newNum % 10;
            //입력받은 수의 십의 자리수를 구함
            int digit1 = newNum / 10;

            int sum = digit1 + digit2;
            
            //처음에는 문자열로 바꿔서 숫자 하나씩 이어붙이는걸로 생각했다
            //숫자 -> 문자열 -> 숫자
            //과정이 복잡해짐
            // mixedNumString = Integer.toString(digit2) + Integer.toString(sum % 10);
            // mixedNumInt = Integer.parseInt(mixedNumString);
            
            
            //더 간단한 방법 - 정수에서 해결
            newNum = (digit2 * 10) + (sum % 10);
            count++;
            
            if(newNum == originNum){
                break;
            }
        }
        System.out.println(count);
    }
}

처음에 생각한 문제 해결 방안은 자리수 하나씩 문자열로 변환하여 이어 붙인 후 다시 정수로 변환하는 방식으로 생각했다.

하지만 십의 자리수, 일의 자리수를 다 구했다면 이 둘을 합쳐서 두자리수를 곱셈식으로 나타낼 수 있기 때문에 더 간단한 방법으로 바꿀 수 있다.

다만, while문 조건 작성에 있어 의문점이 생겼다. 처음에 작성한 코드는 아래와 같았는데 디버깅은 결과가 문제 없이 나왔었다. 하지만 백준 채점 결과에서는 계속 틀렸습니다가 나와서 아무리 생각해도 이유를 알 수가 없다...예제로 나온 입력예제 다 넣어봤는데 결과값이 일치한다.


처음에 작성했던 whilewhile(mixedNumInt != originNum){
            //입력받은 수의 일의 자리수를 구함
            int digit2 = newNum % 10;
            //입력받은 수의 십의 자리수를 구함
            int digit1 = newNum / 10;

            int sum = digit1 + digit2;

            
            //새로만들어진 수를 한 번 더 복사해서 사용했다
            //if 조건문 사용을 피하고 싶어서...
            mixedNumInt = (digit2 * 10) + (sum % 10);
            newNum = mixedNumInt;
            count++;
            
        }
        System.out.println(count);
        

왜 틀렸는지가 나오면 좋을텐데 채점 기준을 다시 살펴봐야겠다.

2개의 댓글

comment-user-thumbnail
2022년 2월 15일

유용한 글 감사합니다^,^~ 마지막 문제는 초기화 한 mixedNumInt값과 입력한 originNum값이 같은 경우 반복문을 안돌기 때문일까요? 어렵네요;~;

1개의 답글