function_test

Programming/JAVA 2016. 4. 20. 13:37
반응형

자바에서 다른 함수를 만들어주어 파라미터로 값을 넘겨주어 계산해주는 부분입니다.


sum이라는 클래스를 만들어 준 후,

메인 함수에서 sum_sum 함수에 파라미터 값으로 5를 넘어줍니다.

sum_sum함수는 main의 밖에서 선언되며, 5라는 int형 값을 파라미터로 받아서

내부적으로 for문을 통해 result에 i의 값을 저장해줍니다.

이 때 i는 1~5까지의 수가 되고, result에는 1 -> (1+2) -> (3+3) -> (6+4) -> (10+5) 의 5번 연산을 거쳐서 값이 저장됩니다.

즉, 최종 return(반환)되는 값은 15가 되어, main함수에서 print하여 찍어준 값은 15로 출력됨을 확인할 수 있습니다.

반응형

'Programming > JAVA' 카테고리의 다른 글

Java - (1) Java언어의 특징  (0) 2016.05.04
Java(Data Structure) - List, Set, Map  (0) 2016.04.22
리스트(List) TestList  (0) 2016.04.22
배열(Array) Test_Array  (0) 2016.04.22
Java 기초 코딩.  (0) 2016.04.20

WRITTEN BY
SiriusJ

,
반응형

저는 자바를 거의 해본 경험이 없어서 대학교 1학년 수준이랄까요..(?)ㅠㅠ


그래도 개발자라면 자신이 Python, C, C++, C# 또는 그 외 언어를 사용하는 분일지라도 


자바는 지금 회사에 들어가기 위해서는 필수적으로(?) 해야하는 언어라고 생각합니다.

(반드시 필수는 아니겠지만 그만큼 중요하다는 의미일 뿐입니다...^^)


기초는 C라고 생각하지만, 여러 라이브러리들을 이용해서 빠르게 작업하기 위해서는 


객체지향언어인 자바를 회사들에서는 많이 선호하는 편입니다.


따라서 자바에 대한 공부도 게을리 해서는 안됩니다.. 만 저는 좀 게을리했네요. 죄송합니다.


여튼, 원래 다른 분야에 대한 포스팅을 먼저 하려했는데 개인적인 사정으로 저도 다시 공부할겸하여 


자바쪽부터 하게 되었습니다.


매우 기초적인 단계부터 조금씩 자바코딩을 다루어 나갈 예정이니 저처럼


시작하는 단계의 초보분들께 조금이나마 도움이 되었으면 좋겠습니다.


필요한 공부부분을 우선적으로 할 예정이라 포스팅은 조금 두서없이 진행될 지도 모르겠습니다.


저는 Eclipse로 진행할 예정입니다.


Hello, world입니다.

우선, 프로젝트를 만들어 준 뒤, src폴더 모양을 마우스 우클릭한 뒤, class파일을 하나 만들어 주면

보기와 같이 New Java Class 창이 뜹니다. Name에는 Hello world, 그리고 아래에 public static void main(String[] args) 를 선택해서 클래스에 메인함수를 자동으로 만들어 주도록 하겠습니다.

도중도중 팁들에 대해 설명해드리면, System.out.println 이라고 일일이 타이핑 하기 귀찮으실 겁니다.

그럴 때에는 sysout <-까지만 친 뒤, 컨트롤+스페이스바 를 누르게 되면 자동적으로 System.out.println()이 생성되는 단축키로 시간을 절약할 수 있습니다.


그리고 빌드할 때, 빌드 단축키를 설정해놓으면 보다 편리하게 작업할 수 있습니다.

저는 컨트롤 + f10 키를 누르면, 보기처럼 창이 뜨게 됩니다.

단축키를 적극 활용하는 것을 권장하는 편입니다.

(원래는 타이핑하는 맛이 있었는데 단축키를 배워서 쓰다보니 훨씬 편하더군요...ㅎㅎ)


다음과 같이 콘솔창에 Hello world! 가 찍히는 것을 볼 수 있습니다.


자바 첫 포스팅이라 가장 기초인 Hello world부터 시작하였지만 다음으로는 여러 자료구조를 활용하고, 상속받는 부분들에 대해 다루도록 하겠습니다.

반응형

'Programming > JAVA' 카테고리의 다른 글

Java - (1) Java언어의 특징  (0) 2016.05.04
Java(Data Structure) - List, Set, Map  (0) 2016.04.22
리스트(List) TestList  (0) 2016.04.22
배열(Array) Test_Array  (0) 2016.04.22
function_test  (2) 2016.04.20

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 2501번 약수 구하기 문제입니다.

(참고 - https://www.acmicpc.net/problem/2501 )



코드 )

#include <stdio.h>

int main() {

int p, q, i, k, count=0;

int arr[BUFSIZ];

scanf("%d %d", &p, &q);

for(i = 0, k = 0; i < p; i++) {

if((p % (i+1)) == 0) {

arr[k++] = i+1;

count++;

}

}

if(count < q)

printf("0\n");

else

printf("%d\n", arr[q-1]);

return 0;

}


- 약수를 구하는 하나의 방법으로, i=1부터 차례대로 증가시켜주며 , p를 i로 나눈 나머지가 0인지 (0이면, i는 p의 약수입니다.) 비교하여 만약 약수라면, 배열 arr에 그 i의 값을 저장해주고, 약수의 갯수를 체크해주는 count라는 변수를 1 더해주게 됩니다.

for문의 수행이 끝나게 되면, arr에는 약수들의 값들이 저장되어 있을 것이고, count에는 약수의 갯수만큼 저장이 되어 있을 것입니다.

이 때, 문제에서 약수의 갯수가 q보다 적어서 q번째 약수가 존재하지 않을 때에는 0을 출력하라는 조건이 있었으므로 

if문을 이용하여 해당 케이스를 예외처리해줍니다.

그 외의 경우에는 배열arr에서 q번째(배열의 인덱스로는 q-1) 의 값을 출력해줍니다.

이와 같이 문제를 해결할 수 있습니다. 약수의 갯수를 어떻게 구하는지에 대한 알고리즘을 설계하는 것이 중점이라고 생각됩니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 2441번 별 찍기 문제입니다.

(참고 - https://www.acmicpc.net/problem/2441 )


C의 가장 원초적인 코딩, 별찍기 문제입니다. 

별 찍기 문제를 올릴까말까 고민하다가, 알고리즘의 기초라 생각하여 올리게 되었습니다.

백준 알고리즘 2438~2441까지 별찍기 1~4 문제이며,

알고리즘은 유사하기 때문에 저는 별 찍기 4번만 다루도록 하겠습니다.


코드 )

#include <stdio.h>

int main() {

int i, j, N;

scanf("%d", &N);

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

for(j=0; j<i; j++)

printf(" ");

for(j=N; j>i; j--)

printf("*");

printf("\n");

}

return 0;

}


- 사실 딱히 설명할 부분이 없습니다. 알고리즘 초반부에 for문과 printf, 더하여 이중 for문을 어떻게 활용해야하는 가에 대한 고민을 필요로 하는 문제라고 생각됩니다.

어떻게보면, 고민을 해보지 않으면 상당히 귀찮은 문제라 할 수도 있겠습니다.

'알고리즘을 하려면 무엇이던지 고민해보고, 생각하라!' 라는 의미의 문제랄까요.

printf를 이용한 공백과 별을, 이중 for문을 이용하여 적절히 섞어주면 됩니다.

어려운 규칙이 아닌데다가 보시는 분의 고민하는 시간을 드리고자 따로 설명은 갖지 않겠습니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 1789번 수들의 합 문제입니다.

(참고 - https://www.acmicpc.net/problem/1789 )


코드)

#include <stdio.h>

int main() {

long long int S, i, n=0;

int cnt=0;

scanf("%lld", &S);

for(i=1; ; i++) {

n += i;

cnt++;

if(n > S) {

                        cnt--;

break;

}

}

printf("%d\n", cnt);

return 0;

}


오답 )
#include <stdio.h>
int main() {
long long int S;
int i, n=0, cnt=0;
scanf("%lld", &S);

for(i=1; ; i++) {
n += i;
cnt++;
if(n > S) {
cnt--;
break;
}
}
printf("%d\n", cnt);

return 0;
}


- 정말 흥미로운 문제였습니다. 위에서 오답과 본 코드를 비교해주시기 바랍니다.




무슨 차이가 있는지 발견하셨나요?

로직도 그대로, 변수들의 값들 또한 그대로, 

차이가 있다면 한가지 있습니다.



바로 전 알고리즘 포스팅에서 밝혔었죠. 문제를 유심히 살펴보시라는 말씀을 드렸었습니다.

바로 문제의 조건입니다. 

"첫째 줄에 자연수 S(1≤S≤4,294,967,295)가 주어진다."

그래서 S는 long long int의 값으로 해주었는데?


라고 생각을 하실지 모르겠지만, S뿐만이 아닙니다. 결과값 N을 구해주기 위해 반복문 안에서 루프 조건은

무한루프라는점 입니다. 즉 long long int타입의 S를 만나기 위해서는 i와 n 또한 기본 int형 이상의 값을 필요로 할 수 있으며, 만약 S의 최대값으로 4,294,967,295 라는 값이 입력되었다면 n은 그 이상의 수가 저장됩니다. 

if(n>S)이 이 무한 루프를 끝낼 수 있는 조건이기 때문입니다. 즉 연산과정에서 사용되는 i와 n 또한 long long int타입으로 선언되어져야 시간초과에러를 풀어낼 수 있습니다.

이 부분만 해결하면 나머지는 i를 0부터 차근차근히 더해주어 n에 저장시켜주고, n과 S를 비교하는 단순한 로직이기 때문에 설명은 이정도로 마무리 짓도록 하겠습니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 1731번 추론문제입니다.

(참고 - https://www.acmicpc.net/problem/1731 )



코드)

#include <stdio.h>

int arr[50], temp[50], temp2[50];

int main() {

int N, i;

scanf("%d", &N);

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

scanf("%d", &arr[i]);

}

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

temp[i] = arr[i+1] - arr[i];

temp2[i] = arr[i+1] / arr[i];

}

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

if(temp[i] == temp[i+1]) { //등차

printf("%d\n", arr[N-1]+temp[0]);

break;

}

if(temp2[i] == temp2[i+1]) { //등비

printf("%d\n", arr[N-1]*temp2[0]);

break;

}

}

return 0;

}


- 백준 알고리즘 문제들은 항상 느끼는 것이지만, 문제를 제대로 읽지 않으면 시간초과 혹은 틀렸습니다. 를 접하게 되는것같습니다. 반드시 문제에서 주는 조건들을 유심히보시고 소홀히 하지 않으시기 바랍니다.

이번 문제는 첫째 줄에 입력받을 N의 갯수가 0~50으로 제한됩니다. 따라서 배열의 크기는 50이상으로 잡아주어야 합니다.

이후 arr배열에 값들을 입력받아 저장하도록 하고, temp라는 배열에는 등차수열의 공식을 적용하고 temp2라는 배열에는 등비수열의 공식을 적용하여 각각 저장해줍니다. 그 후, if문을 두 가지 케이스로 넣어서 arr에 저장되어있는 값이 등차인지 등비인지를 구분하도록 나눠주었습니다.

두 케이스를 나눠 준 뒤, 

만약 등차라면 기존 arr[N-1]에 저장된 마지막 값에 공차값(temp[0])을 더해줌으로써 다음 값을 도출해낼 수 있고,

등비라면 arr[N-1]에 저장된 마지막 값에 공비값(temp2[0])을 곱해줌으로써 다음 값을 도출합니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 1110번 더하기 사이클 문제입니다.

(참고 - https://www.acmicpc.net/problem/1110 )



코드)

#include <stdio.h>

int main() {

int buf[2];

int num, first, second, sum, cnt=0;

scanf("%d", &num);

if(num >= 10) {

first = num / 10;

second = num % 10;

}

else {

first = 0;

second = num;

}

buf[0] = first;

buf[1] = second;

do {

sum = 0;

sum = first + second;


first = second;

if(sum >= 10) 

second = sum % 10;

else 

second = sum;

cnt++;

} while(buf[0] != first || buf[1] != second);

printf("%d\n", cnt);

return 0;

}


- 저는 원래의 숫자를 기억하기 위해 buf라는 배열에 첫번째, 두번째 숫자를 입력하여 저장하였습니다.

0부터 99까지이므로 first는 입력받은 숫자를 10으로 나눠주어 몫의 값을, second에는 10으로 나눈 나머지의 값을 하여 0~9의 숫자가 각각 들어가게 됩니다. 이후 do-while문을 이용하여 처음 한번은 무조건 수행하는 로직으로, 

buf[0](== 초기 입력받은 first값)과 buf[1](== 초기 입력받은 second값)이 로직에 의해 변한 first값과 second이 하나라도 다를동안은 계속 반복하도록 하였으며, sum이라는 임시 변수를 하나 두어, while문 안에서 first와 second의 값을 계속 변화시켜주도록 하였습니다.

이 또한 문제를 보시고 '더해줄 때의 뒤의 숫자가, 계산 후의 10의자리로 변한다' 라는 규칙을 찾으면 되는 부분입니다.


+Java)

import java.util.Scanner;

public class algo1110 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int ori = sc.nextInt();

int[] split = new int[2];

split[0] = ori / 10;

split[1] = ori % 10;

int flag = 1;

move(split);

while(true) {

if(ori == calc(split)) {

System.out.println(flag);

break;

} else {

move(split);

flag++;

}

}

sc.close();

}

public static void move(int[] arr) {

int tmp = arr[1];

arr[1] = (arr[0] + arr[1]) % 10;

arr[0] = tmp;

}

public static int calc(int[] arr) {

return (arr[0] * 10) + arr[1];

}

}

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 1100번 하얀 칸 문제입니다.

(참고 - https://www.acmicpc.net/problem/1100 )



코드)

#include <stdio.h>

char arr[8][8];

int main() {

int i, j, k, l, cnt=0;

for(i = 0; i < 8; i++) {

gets(arr[i]);

}

for(i=0; i<8; i+=2)

for(j=0; j<8; j+=2)

if(arr[i][j] == 'F')

cnt++;

for(k=1; k<8; k+=2)

for(l = 1; l<8; l+=2)

if(arr[k][l] == 'F')

cnt++;

printf("%d\n", cnt);

return 0;

}


- 이번 문제는 정수형 데이터를 가지고 노는것이 아니라 문자를 상대해야하는 문제입니다.ㅎㅎ

저는 2차원배열 arr[8][8]을 만들어주어 해결하였습니다.

그리고 arr배열에 gets함수를 이용해서 '.' 과 'F'에 대해 입력받도록 하였습니다.

(저는 gets함수를 빠르게 이용해보았지만 실제 사용시에는 fgets나, 다른 로직을 사용해보는 것을 권합니다.. 

gets함수는 입력받을 때에 크기를 지정받지 않기 때문에 버퍼 오버플로우를 유발할 수 있습니다. 

즉, 배열크기를 넘어가는 값을 입력받게되면 메모리의 어느영역에 저장 될 지 알 수 없다는 뜻입니다.!!)

그리고 이중 for문을 두번 사용하여 홀수줄, 짝수줄로 구분하여 F라는 글자를 탐색하며 카운트를 세주는 방법으로 해결 하였습니다.

(문제는 풀었지만 비효율적인 방법입니다.(__) 더 좋은 로직으로 해결하시길 바랍니다.)

이번 문제는 2차원 배열을 사용할 수 있는가, 문자에 대한 입력과 비교정도를 할 수 있는가 정도로 생각해봅니다.


+) 추가 -> 위의 로직을 아래와 같이 입력을 받는 순간부터, 비교구문을 이용하여 바로 Count를 해주면 좀 더 효율적으로 풀 수 있겠습니다.

for(i=0; i< 8; i++) {

for(j =0; j<8; j++) {

scanf(" %c", &a[i][j]);

if(((i % 2 == 0) && ( j % 2 == 0) || (i % 2 == 1) && (j % 2 == 1)) && (a[i][j] == 'F'))

cnt++;

}

}

반응형

WRITTEN BY
SiriusJ

,