[ 성능 요약 ]
메모리: 17708 KB, 시간: 208 ms
[ 분류 ]
구현(implementation), 수학(math), 문자열(string)
[ 문제 설명 ]
N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.
[ 입력 ]
첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.
[ 출력 ]
입력으로 주어진 숫자 N개의 합을 출력한다.
[ 문제 링크 ]
https://www.acmicpc.net/problem/11720
import java.util.Scanner;
public class P11720_숫자의합 {
// N개의 숫자가 공백 없이 써 있다. 이 숫자를 모두 합해 출력하는 프로그램을 작성하시오.
public static void main(String[] args) {
// 1. 입력받은 숫자를 문자열로 받는다.
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 숫자의 개수로 입력받는 변수
String strNum = sc.next(); // 입력받는 것을 통째로 받는 변수
int sumNum = 0; // 숫자의 합 담는 변수(최종답)
// 2. 문자열을 하나의 문자씩 잘라서 int 형으로 형변환 후 int 형 변수에 더해준다.
for(int i = 0; i < strNum.length(); i++) {
// i가 문자열의 마지막 인덱스(마지막 인덱스 값 = 문자열길이-1)일때
// substring(i,i+1)을 하게되면 인덱스초과가 되므로
// if 조건절로 마지막 인덱스인 경우, 그냥 substring(i)로 처리해서 잘라주자.
if(i == strNum.length()-1){
sumNum += Integer.parseInt(strNum.substring(i));
break;
}
sumNum += Integer.parseInt(strNum.substring(i,i+1));
}
System.out.print(sumNum);
// next~() : 특정 데이터 유형의 값을 읽기 위해 사용하는함수
// nextLine() : 문자열, 한줄을 모두 읽기 위한 함수
// next() : 단일 문자(char) 읽기 위한 함수
// sc.next() : 스페이스 즉 공백 전까지 입력받은 문자열을 리턴한다.
// sc.nextLine() : 엔터를 치기 전까지 쓴 문자열을 모두 리턴한다.
// nextInt() 메서드 다음 nextLine() 메서드를 실행하려고 할 때
// nextLine() 메서드가 그냥 넘어가버리는 오류가 생겨난다.
// 그 이유는 nextInt() 메서드를 실행할 때 20을 콘솔에 입력하고 엔터를 누를때
// 20을 리턴시켰지만 Enter값은 그대로 남아있다. nextLine() 메서드는 Enter값을 기준으로
// 메서드를 종료시키기 때문에 nextLine() 메서드가 실행될 때 남아있는 Enter값을
// 그대로 읽어서 바로 종료가 된 것이다. 그래서 첫번째 문자열입력:이 넘어가고
// 두번째 정수입력:이 출력된 것이다.
// 만약 정수를 입력하고 그 다음 문자를 입력하려고 할 때 next() 메서드를 사용해야 한다.
// 아니면 위의 nextLine() 메서드를 한번 더 써줘서 Enter값을 없애줘야한다.
}
}
[ 슈도코드 작성 ]
N값 입력받기길이
N의 숫자를 입력받아 String형 변수 strNum에 저장하기
int형 sumNum 변수 선언하기
for ( strNum 배열 길이만큼 반복하기 ) {
if ( 문자열 인덱스가 마지막 인덱스인 경우 ) {
문자열 자르기를 substring(i) 로 처리하기
반복문 빠져 나가기
}
문자열 strNum을 하나의 문자씩 잘라 정수형으로 변환하여 sumNum 변수에 더하기
}
* 슈도코드(의사코드)에 대해서...
* 슈도코드(Pseudo Code)란 의사코드라고도 하는데,
의사(疑似: 비교할 의, 비슷할 사 | Pseudo: 가짜의- ) 코드는 컴퓨터 프로그램이나 알고리즘이 수행해야할 내용을
우리가 사용하는 언어 (한국어 또는 영어 등)로 간략히 서술해 놓은 것
* 의사코드와 코드 모두 같은 스타일로 일관성있게 작성하는 것이 원칙. 똑같은 연산 기호를 사용하며, 적절한 곳에, 이해될 수 있는 문장으로 작성한다. (긴 문장을 쓰지 않아도 된다. )
* 슈도 코드(의사코드)를 사용하는 이유
1) 나중에 그 프로그램 코드를 읽고 디버깅을 하거나 내용을 수정해야 하는 개발자에게 도움을 줄 수 있다.
2) 컴퓨터 프로그램 알고리즘이 어떻게 실행되어야 할지, 또는 어떻게 실행될 수 있을지 보여줄 수 있다.
3) 나중에 코드입력, 테스트, 디버그 수정 단계에서 작업하는 것보다 의사코드 설계 단계에서
미리 오류를 수정을 하는 것이 훨신 경제적이다.
4) 프로그램의 문제를 해결하기 위한 도구로, 또는 다른 사람들과 프로그램의 흐름에 대해
소통하기 위한 방법으로 활용한다.
* 슈도 코드(의사코드) 효과적으로 작성하는 방법
1) 불필요한 내용은 무시한다. 콤마( , )의 위치를 고민할 필요가 없다.
좋은 방법은 '시작/끝(begin/end)' '[ ]'(bracket) 등과 같이 일반적으로 많이 쓰이는 구조적인 기호나
단어들을 적절한 곳에 사용하는 것이다. 그러나 어법이나 구문에 크게 주의하지 않아도 된다.
2) 확실한 내용을 여러번 말하지 않는다. 문맥에 따라 값의 유형이 정해지는 경우가 종종 있다.
예를들어 값이 정수인지 실수인지 정하는 것이 중요한 목적이 아니라면,
정확하게 값을 구분하는 것이 필요 없을 수도 있다.
3) 프로그래밍에 쓰이는 문법(구문)을 이용해 작성한다, if-else 조건문, 반복문(loop)인 while은
영어 단어와 같기 때문에, 이를 사용하여 의사코드를 조금 더 명확하게 작성할 수 있다.
4) 적은 수의 단어를 조합하여 의사코드를 작성하는 것도 좋은 방법이다.
변수 사용은 의사코드를 간단명료하게 만들어주기 때문에 생략하지 않는 것이 좋다.
5) 사용할 목적과 상항에 주의하여 작성한다. 만약 빠른 정렬 (quick sort) 알고리즘을 쓰고자 할 때,
단순히 'quick sort'라고 의사코드를 작성하게 되면 상세한 내용을 생략하게 된 것이다.
6) 의사코드로 알고리즘 전체를 한번에 꿰뚫어볼 수 있어야 한다.
그렇지 않다면 알고리즘을 쉽게 분석하기 어려워진다.
7) 수준을 고려하여 작성한다. 다른 사람이 본인이 작성한 의사코드가 이해하기 너무 어려워 실제 코드로
옮기기 어렵다면(또는 둘다 모두일 경우), 난이도에 문제가 있다는 것이다.
이제 의사코드에서 많이 쓰이는 영어 단어에 대해 알아보자.
- 입력(Input): READ, OBTAIN, GET
- 출력(Output): PRINT, DISPLAY, SHOW
- 계산(Compute): COMPUTE, CALCULATE, DETERMINE
- 초기화(Initialize): SET, INIT
- 요소를 추가(Add one): INCREMENT, BUMP
- 선형적으로 증가할 때(linear progression): SEQUENCE
- 반복: WHILE, FOR
- 조건문: IF-THEN-ELSE
- 마지막에 조건문이 있는 반복문: REPEAT-UNTIL
- IF-THEN-ELSE 대신 조건 분기처리: CASE
- 부울 : TRUE / FALSE
- 그외 : REPEAT - UNTIL RETURN BEGIN / EXCEPTION / END
'Algorithm > Beakjoon' 카테고리의 다른 글
[Gold IV] 좋다_P1253 (0) | 2023.01.17 |
---|---|
[Gold III] 나머지 합_P10986 (0) | 2023.01.17 |
[Silver IV] 주몽_P1940 (0) | 2023.01.12 |
[Bronze I] 평균_P1546 (0) | 2023.01.12 |
[Silver V] 수들의 합5_P2018 (0) | 2023.01.07 |