13번. 자리수 구하기

10아래가 될때까지 n을 10으로 나눈 나머지 1의 자리수를 더한 후,n을 10으로 나눠서 입력해 1의 자리수를 버린다.
그리고 계속 루프.
14.약수의 합
class Solution {
public int solution(int n) {
int answer = 0;
if(n>=0&&n<=3000){
for(int i=1;i<=n;i++){
if(n%i==0){
answer+=i;
}}
}
return answer;
}}
Exception in thread "main" java.lang.ArithmeticException: / by zero
어떤 수를 0으로 나눴을 때 생긴 에러. 0을 다른 값으로 고치면 해결
나같은 경우는 습관대로 i=0부터 시작해 n을 나눴더니 이런 에러가 발생.
i의 시작 값을 1로 지정하니 해결.
다른 분 코드
class SumDivisor {
public int sumDivisor(int num) {
int answer = 0;
for(int i =1 ; i<=num/2;i++){
if(num%i==0){
answer+=i;}}
return answer+num;
}
왜 입력값을 2로 나누고 그것까지만 for문을 돌리나 했더니,
약수의 두번째로 큰 값은 n/2이기 때문. 그리고 마지막에 입력값을 답에 더하면 끝.
15.나머지가 1이 되는 수 찾기

class Solution {
public int solution(int n) {
int answer = 0;
if(n>=3&&n<=1000000){
for(int i=1;i<n;i++){
if(n%i==1){
answer=i;
break;
}
}}
return answer;
}
}
다른 사람의 풀이
class Solution {
public int solution(int n) {
int answer = 1;
while(true) {
if (n%answer==1) break;
answer++;
}
return answer;
}
}
왜 이런 코드를 썼을까 보니 이렇게 쓰면 if가 필요 없고,훨씬 더 간편해짐.
답 변수를 1부터 시작해 나머지가 1이 될때까지 게속 더하기.
16.x만큼 간격이 있는 n개의 숫자
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
int init=x;
if(n<=1000){
for(int i=0;i<n;i++){
answer[i]=(long)x;
x=x+init;
}}
return answer;
}
}
ArrayIndexOutOfBoundsException
배열의 인덱스 범위 초과 예외. 자바 배열은 선언할 때 꼭 크기를 지정해야한다.
크기 조정이 자유로운 건 collection 문
테스트 결과는 맞는데 통과가 안된다.
질문을 보니 long형 때문이라는데, 어떻게 수정해야할지 좀 더 고민해야겠다.
ArrayList al = new ArrayList();//자바 일반배열과 다르게 크기 선언 필요 없음
al.add(10);
al.add(20);
al.add(30);//값 추가
System.out.println(al);
al.set(2,35);//al[2]값을 35로 바꿈
System.out.println(al);
al.remove(0);
System.out.println(al.get(0));//0번째 값을 지우니 1번째 값이 0번째로 당겨져서 출력됨
al.clear();//값을 모두 지움
System.out.println(al);
LinkedList<Integer> ll=new LinkedList<Integer>(); //값을 조회할 때는 arraylist보다 느리지만, 추가 삭제는 빠름
ll.add(10);
ll.add(20);
ll.add(30);
System.out.println(ll);
ll.set(1,2);//1번째를 2로 교체
System.out.println(ll);
ll.remove(0);
System.out.println(ll);
ll.add(1,99);
System.out.println(ll);//인덱스 1번에 99추가하면서 기존 1이 뒤로 밀림.
결과값

import java.util.LinkedList;
import java.util.Scanner;
import java.util.ArrayList;
//TIP 코드를 <b>실행</b>하려면 <shortcut actionId="Run"/>을(를) 누르거나
// 에디터 여백에 있는 <icon src="AllIcons.Actions.Execute"/> 아이콘을 클릭하세요.
public class Main {
public static void main(String[] args) {
ArrayList<String> recipe = new ArrayList<String>();
String list = new String(); //자료구조명 입력 변수
Scanner sc = new Scanner(System.in);
System.out.println("저장할 자료구조명을 입력합니다:");
list = sc.nextLine();
System.out.println("요리 제목을 입력하세요:");
recipe.add(sc.nextLine());
// System.out.println("레시피를 입력해주세요:");
//
// for(int i=1;i<10;i++){
// recipe.add(sc.nextLine());
//
// if(recipe.get(i).equals("끝"))
// recipe.remove(i);
// break;
// }//아니면 while 문으로 무한 반복
//
int last = 0;//레시피 마지막 배열값 참조 변수
System.out.println("레시피를 입력해주세요:");
while (true) {
recipe.add(sc.nextLine());
last++;
if (recipe.get(last).equals("끝")) {
recipe.remove(last);
break;
}
}
System.out.println("[" + list + "으로 저장된 " + recipe.get(0) + "]");
for (int i = 1; i < recipe.size(); i++) {
System.out.println(i + "." + recipe.get(i));
}
}
}


강의를 들으면서 자바 클래스에 대해 자리잡은 현재 내 개념은
클래스- 개발자가 창작한 틀
객체- 그 틀을 이용해 만든 물건, 수량, 이름 등은 개발자의 마음대로 정할 수 있다.
생성자- 그 객체를 실제로 사용하려고 불러내는 것.
부모 자식 클래스- 부모의 속성을 상속받음으로서 코드의 중복성을 줄일 수 있다.
캡슐화- 캡슐처럼 속 안은 보이지 않는 것, 즉 보안성을 말함.
전체 공개, 패키지 내 공개, 클래스 내 공개 별로 명령어가 있다.
다른 패키지의 클래스를 불러올 경우
setter,getter- 보안이 철저한 외부클래스는 속성을 멋대로 변경할 수 없다 그래서 간접적으로 메소드를 통해 지정. camelCase로 쓰는 것이 보통.
setModel(int a){}; getModel(int b){};
2주차까진 기초적인 연산, 함수에 대해 배웠다면
3주차부턴 내가 직접 클래스를 제작하고 객체로 독립적으로 이용하는 개념의 기초를 배우는 중이다.
강의 듣는 것이 생각보다 더뎌서 주말에도 듣고 정리해야 할 것 같다.
5주차까지 얼른 듣고 과제를 풀고 싶다.
아니면 그냥 3주차 마저 듣고 바로 과제로 넘어가면서 중간중간 강의를 들으며 과제를 푸는 게 더 효율적일지도 모르겠다.