일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- JPQL
- 제네릭
- 프로젝트생성
- 스프링데이터흐름
- 대량쿼리
- 엔티티직접사용
- joinfetch
- paging
- LIST
- calendar
- JPA
- springflow
- jQueryUI
- javaservlet
- values()
- 제너릭
- fetchjoin
- fullcalendar
- 벌크연산
- 자바서블릿
- jQuery값전달
- jQuery값전송
- 페치조인
- 페이징
- javascriptcalendar
- JQuery
- jscalendar
- Hibernate
- Generic
- namedQuery
- Today
- Total
가자공부하러!
알고리즘(3) - 배수,보수,그레이코드 등 본문
> 1부터 100까지의 수 중 5의 배수의 개수와 합을 출력하는 코드 작성
내 코드(java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package Test.java; public class TestMain { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = new int[100]; int sum=0, cnt=0; for(int i=0; i<100; i++) { //100번 반복 arr[i]=i+1; //1부터 100까지 배열에 입력 if( (arr[i] % 5) == 0 ) { //배열의 i번째 수를 5로 나눈 값의 나머지가 0이면 == 5의 배수이면? sum += arr[i]; //sum에 누적 cnt++; //cnt변수에 +1 } } System.out.println("1부터 100까지 5의 배수의 개수 : "+cnt); System.out.println("1부터 100까지 5의 배수의 합 : "+sum); } } | cs |
*틀렸던 부분 :
교재 코드(C)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include "pch.h" #include <iostream> #include <stdio.h> #define _CRT_SECURE_NO_WARNINGS int main(){ int cnt, hap, mok, nmg, i; cnt = 0, hap = 0; for (i = 1; i <= 100; i++) { mok = i / 5; nmg = i - mok * 5; if (nmg == 0) { cnt++; hap += i; } } printf("%d %d", cnt,hap); } | cs |
입력값 :
출력값 : 20 1050
> 10개의 1자리 양의 정수를 입력 받아 배열에 저장한 후 저장된 자료 중 7에 가장 가까운 자료를 찾는 코드 작성. 단, 자료는 1자리 정수이고 근사값이 2개인 경우에는 나중에 찾은 값을 출력
내 코드(java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package Test.java; import java.util.*; import java.math.*; public class TestMain { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scn = new Scanner(System.in); int[] arr = {1,2,3,4,5,6,7,8,9,0}; int cnr=9, obj=0; //제어변수(7과 얼마나 가까운지 비교)값 초기화, 목표값 초기화 System.out.println("0부터 9사이의 정수를 1개씩 입력하세요."); System.out.println("10이상의 정수를 입력하면 1의자리만 저장됩니다."); System.out.println("예) 13입력 -> 3저장"); for(int i=0; i<10; i++) { //10번 반복 System.out.print((i+1)+"번 째 정수 입력 : "); arr[i]=(scn.nextInt() % 10); //1부터 9 사이의 정수 입력 및 저장 if( Math.abs( (7-arr[i]) ) <= cnr){ cnr = Math.abs( (7-arr[i]) ); //제어변수 값 갱신 obj = arr[i]; //목표값 저장 } } System.out.print("입력된 값 : "); for(int i=0;i<10;i++) System.out.print(arr[i]+" "); System.out.println("입력된 값 중 7과 가장 가까운 값 : "+obj); } } | cs |
*틀렸던 부분 :
> 22번줄 목표값 변수를 설정하지 않음(제어변수와 목표값을 구분하지 못함)
교재 코드(C)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include "pch.h" #include <iostream> #include <stdio.h> #define _CRT_SECURE_NO_WARNINGS int main() { int i, j, k, l, m; int a[10]; int FIND = 7; i = -1; do { i++; scanf("%d", &a[i]); } while (i < 9); j = 9; for (k = 0; k <= 9; k++) { if (a[k] >= FIND) l = a[k] - FIND; else l = FIND - a[k]; if (l <= j) { j = l; m = a[k]; } } printf("%d", m); } | cs |
입력값 : 1 2 3 4 5 6 7 8 9
출력값 :
>0 또는 1로 입력되는 다섯 개의 숫자를 배열에 입력받아 1의 보수와 2의 보수를 구하는 코드 작성.
내 코드(java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package Test.java; import java.util.*; public class TestMain { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scn = new Scanner(System.in); int[] arr = {1,0,1,1,1}; int[] arr2 = new int[5]; //1의 보수 배열 int[] arr3 = new int[5]; //2의 보수 배열 int i=0, j=4,c=1; for(i=0; i<5; i++) { //10번 반복 arr2[i]=1-arr[i]; //1의 보수 저★장 arr3[j]=arr2[j]+c; //2의 보수 배열 오른쪽 자리부터 arr2에 1을 더한 값 저★장 arr3[j]=arr3[j]%2; //2의 보수 배열에 2또는 0이 저장되어 있으면 0 1이 저장되어 있으면 1 입력 c=arr2[j]*c; //마지막으로 입력한 값이 1이면 자리올림수는 1, 마지막으로 입력한 값이 0이면 자리올림수는 0 j--; } for(i=0;i<5;i++) { System.out.print(arr[i]+" "); } System.out.println(" "); for(i=0;i<5;i++) { System.out.print(arr2[i]+" "); } System.out.println(" "); for(i=0;i<5;i++) { System.out.print(arr3[i]+" "); } } } | cs |
*틀렸던 부분 :
> 2의 보수 배열 저장하는 방법 이해 안되서 교재 코드 보고 따라함.
> 다행히 이해했음 :)
교재 코드(C)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include "pch.h" #include <iostream> #include <stdio.h> #define _CRT_SECURE_NO_WARNINGS int main() { int a[5], b1[5], b2[5]; int i = -1, c = 1; do { i++; scanf("%d", &a[i]); b1[i] = 1 - a[i]; } while (i < 4); do { b2[i] = b1[i] + c; b2[i] = b2[i] % 2; c = b1[i] * c; i--; } while (i >= 0); for (int k = 0; k < 5; k++) printf("%d", a[k]); printf(" "); for (int k = 0; k < 5; k++) printf("%d", b1[k]); printf(" "); for (int k = 0; k < 5; k++) printf("%d", b2[k]); } | cs |
입력값 : 0 1 0 1 1
출력값 : 01011 10100 10101
>
내 코드(java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package Test.java; import java.util.*; public class TestMain { public static void main(String[] args) { Scanner scn = new Scanner(System.in); int[] input = new int[5]; int output[]=new int[4]; int i=0; System.out.print("입력할 숫자가 이진수면 0, 그레이 코드면 1 입력 : "); input[0] = scn.nextInt(); System.out.println(" "); for(i=1; i<5;i++) { System.out.print(i+"번 째 숫자"); input[i]=scn.nextInt(); System.out.println(" "); } output[0]=input[1]; System.out.println("입력된 숫자"); for(i=0; i<5;i++) { System.out.print(input[i]+" "); } System.out.println(" "); for(i=0; i<3;i++) { if(input[0]==1) { //그레이코드인 경우 이진수로 변환 System.out.println("그레이 코드를 이진수로 변환합니다."); if(input[i+2] == output[i]) //입력된 숫자와 이진수 비교 output[i+1]=0; else output[i+1]=1; } else { System.out.println("이진수를 그레이 코드로 변환합니다."); if(input[i+1] == input[i+2]) //입력된 숫자와 옆 숫자 비교 output[i+1]=0; else output[i+1]=1; } } System.out.print("출력 : "); for(i=0; i<4; i++) { System.out.print(output[i]+" "); } } } | cs |
*틀렸던 부분 :
> 13번 줄 input[0]에 입력값 안내를 뒤바꿔서 함(그레이0 이진수1)
> 22번 줄 input[1]을 input[0]으로 잘못계산
> 29~44번 줄 반복문을 조건문 아래로 두어서 반복문 중복 발생 -> 반복문을 위로 변경
교재 코드(C)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include "pch.h" #include <iostream> #include <stdio.h> #define _CRT_SECURE_NO_WARNINGS int main() { int i; int input[5], cont[4]; for (i = 0; i <= 4; i++) scanf("%d", &input[i]); cont[0] = input[1]; if (input[0] == 1) { //그레이 코드를 이진수로 변환 for (i = 0; i <= 2; i++) { if (input[i + 2] == cont[i]) cont[i + 1] = 0; else cont[i + 1] = 1; } } else { //이진수를 그레이코드로 변환 for (i = 0; i <= 2; i++) { if (input[i + 1] == input[i + 2]) cont[i + 1] = 0; else cont[i + 1] = 1; } } if (input[0] == 1) printf("이진수 "); else printf("그레이 코드 "); for (i = 0; i <= 3; i++) printf("%d", cont[i]); } | cs |
입력값 : 1 1 0 1 1(그레이코드)
출력값 : 1 0 1 1 (이진수)
> 100건 이내의 12자리로 구성된 숫자를 더하는 코드 작성. 단, 12자리 숫자는 각 자리가 분리되어 배열에 입력된다.
> 예를 들어 999,999,999,999는 {9,9,9,9,9,9,9,9,9,9,9,9}와 같이 입력된다.
> 배열의 첫 번째 요소로 0을 입력 받으면 계산 후 결과를 출력하고 프로그램을 종료한다.
> 결과값이 들어갈 배열은 초기값으로 0이 들어 있다고 가정한다.
내 코드(java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package Test.java; import java.util.*; public class TestMain { public static void main(String[] args) { Scanner scn = new Scanner(System.in); int[] input = new int[12]; //입력값 배열 int sum[]=new int[14]; //출력값 배열 int i=0,j=0,qtt=0,rmd=0; String str; for(i=0;i<14;i++) { //배열 초기화 if(i<12) input[i]=0; sum[i]=0; } System.out.println("12자리 정수를 입력해주세요.(예 123456789123"); for(i=0;i<100;i++) { //출력값 배열이 14자리 이므로 100번까지만 반복입력 가능 System.out.print(i+"번째 숫자 : "); str = scn.next(); if(str.charAt(0) == '0') { System.out.println("0이 입력되었으므로 입력을 종료합니다."); break; //0이 입력되면 입력 종료 } for(j=0;j<12;j++) { input[j]=(int)(str.charAt(j)-'0'); //입력된 값을 정수 배열에 저장 sum[j+2]+=input[j]; //입력된 값을 출력 배열에 누적 } System.out.println(""); } System.out.println(sum[13]/10); for(i=13;i>0;i--) { //출력 배열 정리 qtt = sum[i]/10; //최 우측 값 부터 10으로 나눈 몫 계산 rmd = sum[i]-(qtt*10); //최 우측 값 부터 나머지 계산 sum[i]=rmd; //계산된 나머지 값 저장 sum[i-1] += qtt; //다음 계산할 값에 몫 누적 } System.out.print("입력한 숫자의 합 : "); while(i<14) { System.out.print(sum[i++]); } } } | cs |
*틀렸던 부분 :
> 36번 줄에 i--를 i++로 잘못씀
교재 코드(C)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include "pch.h" #include <iostream> #include <stdio.h> #define _CRT_SECURE_NO_WARNINGS int main() { int i, j, k, mok, nmg; int a[12], b[14] = { 0 }; while (1) { for (i = 0; i <= 11; i++) scanf("%d", &a[i]); if (a[0] == 0) break; else for (i = 0; i <= 11; i++) b[i + 2] += a[i]; } for (i = 13; i >=1 ; i--) { mok = b[i] / 10; nmg = b[i] - mok * 10; b[i] = nmg; b[i - 1] += mok; } if (b[0] == 0) j = 1; else j = 0; for (i = j; i <= 13; i++) printf("%d", b[i]); } | cs |
입력값 : 123456789123 123456789123
출력값 : 0246913578246
'공부 > 정보처리기사(실기)' 카테고리의 다른 글
알고리즘(6) - 배열응용 (0) | 2019.04.02 |
---|---|
알고리즘(5) - 병합, 스택, 배열 (0) | 2019.04.02 |
알고리즘(4) - 정렬 (0) | 2019.03.28 |
알고리즘(2) - 진법 변환, 최대최소 구하기 (0) | 2019.03.27 |
알고리즘(1) - 소수, 약수, 소인수분해 등 (0) | 2019.03.27 |