llabllab   2년 전

안녕하세요.도움이 필요합니다!


import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        Scanner scan=new Scanner(System.in);
        int N=sc.nextInt();
        String str=scan.nextLine();
        int result=0;
        int i;
     for(i=0; i<str.length();i++){
     result=result+str.charAt(i);
    }System.out.println(result);
     }
}

답이 안나오는 이유가 뭘까요..실행은 되는데..

occidere   2년 전

위의 소스코드에서는 대략 3부분을 수정해야 합니다.

  1. 값 더하는 계산 부분
  2. 스캐너 객체 부분
  3. nextInt()의 개행부분


우선 첫번째의 값 더하는 부분입니다.

입력받으실 때, String str=scan.nextLine();를 사용하셨습니다.

즉, "문자열" 값으로 입력받으신 것입니다.


이때, 문자열(String)의 각 문자(char)들은 ASCII 코드표에 나와있는 정수 값을 가지게 됩니다.

ex) char형 1 = int형 49, char형 0 = int형 48

만일 이 상태에서 char형 1과 char형 0을 더해버리면 1+0으로 생각될 수도 있으나, 실제로는 정수값인 49+48이 됩니다.

이를 반영하여 char 형 값을 정수 값으로 활용하고 싶으시면 해당 문자에서 '0'이나 48을 빼주셔야 됩니다.

result = result + str.charAt(i)-'0'; //또는 -48


두번째로 스캐너 객체 부분입니다.

스캐너 객체는 재사용이 가능한 객채로써 굳이 Scanner sc, Scanner scan과 같이 2개를 사용하실 필요가 없습니다.

-> Scanner sc = new Scanner(System.in); 하나만 사용하시면 됩니다.


세번째로 개행(줄바꿈) 관련 부분입니다.

입력 예제를 보시면 두개의 숫자가 2줄에 걸쳐 들어옵니다. 즉, 엔터로 분리되어 있습니다.

a.PNG이는 곧 첫번째 5를 입력받은 뒤 -> "엔터(개행)"를 입력받고 -> 마지막의 54321을 입력받는 것입니다.

그러나 스캐너의 sc.nextInt()는 개행문자까지 입력받지 않으므로, sc.nextLine()을 이용하여 개행문자를 직접 입력받아 줄바꿈을 해주셔야 됩니다.


위 3가지 부분을 아래와 같이 수정하시면 됩니다.

llabllab   2년 전

명쾌한 설명 감사합니다. 덕분에 많이 배웠습니다. 감사합니다!

heykj   2년 전

위에분 저게 뭔소리임? 저걸로 됨?

개행문자를 입력받는다? nextLine은 공백까지 받는거 아니였나ㅎ

어차피 엔터치는데 뭔 소리인지 모르겠음

그리고 애초에 for문에서의 조건문 자체도 틀렸음 

str.length()만큼 도는게 아니라 입력받은 int N만큼 돌려야 되는거지 

sc.nextLine(); //개행문자 입력받음 이부분 필요없고

혹시모르니 String str = sc.next(); 이렇게 고치고


int i;
for (i = 0; i < str.length(); i++) {
result = result + str.charAt(i)-'0'; //또는 -48
}


이거는 

for(int i=0; i<N; i++){

result += str.charAt(i) - '0';

}

이렇게 고쳐보세요


llabllab   2년 전

조언 감사합니다. 두 분 다 많은 도움 되었습니다!

occidere   2년 전

@heykj

제가 질문글에 답변 남겨드릴 때는 전부 "수정 후 제출했을 때, 정답 받았을 경우" 에만 답글 남깁니다.


이건 맨 처음 질문 답변드릴때 저 대로 작성해서 통과한 소스코드이고 https://www.acmicpc.net/source...

이건 혹시나 해서 방금 제출한 똑같은 소스코드입니다 https://www.acmicpc.net/source...


nextInt()와 nextLine()을 병행했을 때 문제점을 잘 모르시는 것 같은데, nextInt() 는 개행문자("\n")값을 읽어들이지 않습니다. 

따라서  sc.nextInt()해서 숫자 5를 읽어들인 뒤 -> 엔터("\n")를 치고 -> 54321을 쓰려고 하면, sc.nextLine()부분이 좀 전에 친 엔터(개행문자) 값을 읽어들여서 런타임 에러가 발생합니다.

본인이 적으신 방법도 틀린방법은 아닙니다. n값과, 문자열 모두 "개행 값 자체"를 안 읽어오기 때문이죠.

그러나 제가 적은 방법 역시 맞습니다. 제 방법으로는 n값과 문자열 모두 "개행 값 자체"를 읽어오는 방법입니다.

뭔소린지 이해가 안가신다면 아래 nextInt(), nextLine() 사용법 관련 질문글을 참고하시길 바랍니다.

http://hashcode.co.kr/question...


그리고 반복문 범위 str.length()로 해도 맞습니다.

입력 조건이 "첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다." 라고 되있는데, 들어오는 숫자들이 암묵적으로 1자리 수 들만 들어오고 있습니다.

애시당초 1자리 수 이상의 숫자들이 들어오는 경우라면 저렇게 54321처럼 한줄에 붙여 들어올 리가 없겠죠.

54321이 5, 4, 3, 2, 1 인지, 54, 321 인지 알 방법이 없으니 별도 조건이 주어지거나 암묵적으로  1자리 수들로 이루어졌거나 인데, 다른 조건이 없으므로 후자라고 봐도 무방하니 결국, 문자열의 길이 = 숫자의 개수 가 성립하는 것입니다.


마지막으로 글 적으실 때는 최소한의 예의를 지켜 적으시길 바랍니다. 누군가 당신이 쓴 글에 저런식으로 답글 남겨놓으면 참 읽을 때 기분 좋겠습니다.

qjatn0955   1달 전

위에 분 말씀에 깊은 동의를 표하는 바입니다. ^^ 뀨잇~

댓글을 작성하려면 로그인해야 합니다.