반응형

: 메소드는 객체의 동작에 해당하는 중괄호 { } 블록을 말합니다. 중괄호 블록은 이름을 가지고 있는데, 이것이 메소드 이름입니다. 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행되며, 메소드는 객체 간의 데이터 전달의 수단으로 사용됩니다.


[메소드 선언]

리턴타입 메소드 이름 ([매개변수 선언, ...]) {

실행할 코드를 작성하는 곳                <- 메소드 실행블록

...

}


예시 )

int sumFunc( int num1, int num2) {

int result;

result = num1 + num2;

return result;

}


와 같이 작성할 수 있습니다.


[리턴 타입]

메소드가 실행 후 리턴하는 값의 타입을 말합니다. 각각의 메소드는 리턴값이 있을 수도 있고, 없을 수도 있습니다. 메소드가 실행 후 결과를 호출한 곳에 넘겨줄 경우에는 리턴값이 있어야 합니다.

아래 예시를 통해 참고하겠습니다.


public class Test1 {
public static void main(String[] args) {
int sum;
Scanner sc = new Scanner(System.in);

int num1 = sc.nextInt();
int num2 = sc.nextInt();
sum = sumFunc(num1, num2);

//sum = sumFunc(sc.nextInt(), sc.nextInt()); 로 위의 3줄을 대체될 수 있음
System.out.println("sum=" + sum);
sc.close();
}

public static int sumFunc(int num1, int num2) {
int result;
result = num1 + num2;
return result;
}
}

-> 사용자로부터 두 수를 입력받아 더한 값을 결과로 출력하는 단순한 코드입니다.


[리턴값이 없는 메소드]

void 로 선언된 리턴값이 없는 메소드에서도 return문을 사용할 수 있습니다. 다음과 같이 return문을 사용하면 메소드 실행을 강제 종료 시키게 됩니다.


다음은 gas값이 0보다 클 경우 계속해서 while문을 실행하고, 0일경우 return을 실행하여 run() 메소드를 즉시 종료합니다. 이 때, return문 대신 break문을 사용할 수도 있습니다.


[CarTest.java]

/**
* Created by 진우 on 2016-05-15.
*/
public class CarTest {
public static void main(String[] args) {
Car myCar = new Car();

myCar.setGas(5);

boolean gasState = myCar.isLeftGas();
if(gasState) {
System.out.println("출발합니다.");
myCar.run();
}

if(myCar.isLeftGas()) {
System.out.println("gas를 주입할 필요가 없습니다.");
} else {
System.out.println("gas를 주입하세요.");
}
}
}


[Car.java]

/**
* Created by 진우 on 2016-05-15.
*/
public class Car {
//필드
int gas;

//생성자


//메소드
void setGas(int gas) {
this.gas = gas;
}

boolean isLeftGas() {
if(gas == 0) {
System.out.println("gas가 없습니다.");
return false;
}
System.out.println("gas 가 있습니다.");
return true;
}

void run() {
while(true) {
if(gas > 0) {
System.out.println("달립니다. (gas 잔량:"+gas+")");
gas -= 1;
} else {
System.out.println("멈춥니다. (gas잔량:" + gas + ")");
return;
}
}
}
}


[결과 값] - CarTest의 main 실행화면

반응형

WRITTEN BY
SiriusJ

,

Python2 설치

Programming/Python 2016. 5. 14. 21:38
반응형

Python2 를 설치과정을 살펴보도록 하겠습니다.


파이썬 홈페이지 : https://www.python.org/downloads/ 로 접속하여 아래 그림에서 'Download Python 2.7.11' 버튼을 클릭하여 설치해줍니다.


설치과정입니다. next를 눌러서 설치를 진행합시다.


Python을 설치할 디렉토리 경로를 설정하는 부분입니다. 따로 상관없다면 next를 계속 눌러주어 설치를 진행하면 됩니다.


파이썬 라이브러리와 인터프리터를 설치해주는 부분입니다. next로 진행합니다.


설치과정입니다. 기다리면 됩니다.


설치가 마무리되면, 아래 화면이 뜨고, finish를 눌러서 마쳐주면 설치가 완료됩니다.


시작메뉴로 들어가면, Python2.7버전이 설치된 것을 확인할 수 있습니다. 다음에서 IDLE 창을 눌러서 실행해주면 됩니다.


파이썬 IDLE창으로 실행된 화면입니다. 이상으로 파이썬 설치를 마칠 수 있습니다.


반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 10828번 스택 문제입니다.


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



코드)

#include <stdio.h>

#include <string.h>

int stack[10000];

int main() {

int N, i, j, num, top=0;

scanf("%d", &N);

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

char cmd[BUFSIZ];

scanf("%s", cmd);

if(strcmp(cmd, "push") == 0) {

scanf("%d", &num);

stack[top] = num;

top++;

}

if(strcmp(cmd, "pop") == 0) {

if(top <= 0)

printf("-1\n");

else {

printf("%d\n", stack[top-1]);

top--;

}

}

if(strcmp(cmd, "size") == 0) {

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

}

if(strcmp(cmd, "empty") == 0) {

if(top <= 0)

printf("1\n");

else

printf("0\n");

}

if(strcmp(cmd, "top") == 0) {

if(top <= 0)

printf("-1\n");

else 

printf("%d\n", stack[top-1]);

}

}

return 0;

}


- 문제에 맞게 C로 스택함수를 직접 구현해주면 되는 부분입니다.

다른 부분은 생략하고, 각 명령부분들만 살펴보도록 하겠습니다.

먼저 입력받은 문자열 cmd가 PUSH인지 아닌지 파악하기 위해 문자열 비교함수인 strcmp를 이용하여 push와 비교를 하, push일 경우 숫자도 함께 입력받도록 하여 배열 stack의 인덱스 top에 넣어주고, top은 1 증가시켜줍니다.


입력받은 문자열이 POP이라면, top의 인덱스를 먼저 비교하여 0보다 작거나 같을 시에는 stack에 아무 값도 현재 들어가있지 않다는 것을 의미하므로 문제의 조건에 따라 -1을 출력하고, top이 0보다 클 경우 값이 있다는 것이므로 stack의 인덱스 top-1의 값을 출력한 뒤, top을 1 감소시켜줍니다.


입력받은 문자열이 size라면, top을 출력해줍니다.(인덱스 top이 곧 stack의 size를 가리키므로)


입력받은 문자열이 empty라면, top의 값을 비교하여 0 또는 1을 출력해줍니다.


입력받은 문자열이 top이라면, top의 값을 비교하여 0 또는 stack의 인덱스 top-1 (가장 위에 있는 값 = 가장 마지막에 push된 값)을 출력해줍니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 10817번 세 수 문제입니다.


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



코드(1) - 변수의 단순비교 조건 이용

#include <stdio.h>
int main() {

int num1, num2, num3;

scanf("%d %d %d", &num1, &num2, &num3);

if(num1 > num2) {

if(num1 > num3) {

if(num2 > num3) printf("%d", num2);

else printf("%d", num3);

}

else printf("%d", num1);

}

else {

if(num2 > num3) {

if(num1 > num3) printf("%d", num1);

else printf("%d", num3);

}

else printf("%d", num2);

}

return 0;

}


코드(2) - 배열을 이용한 비교

#include <stdio.h>

int main() {

int arr[3], i, j, tmp;

scanf("%d %d %d", &arr[0], &arr[1], &arr[2]);

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

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

if(arr[j] >= arr[j+1]) {

tmp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = tmp;

}

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

return 0;

}


- 코드를 두 가지로 올린 것은 문득 두 방법의 차이를 비교하며 설명하고 싶었기 때문입니다.

코드(1) 의 결과


코드(2) 의 결과


두 가지 방법의 차이를 파악하셨나요.

첫번째 코드의 경우에는 단순히 일일이 비교해가며 조건을 설정하였기 때문에 코드의 길이는 길어질수밖에 없는 대신 변수만을 이용하기 때문에 메모리의 크기는 상대적으로 적게 잡아먹게 됩니다.

그에 반하여 두번째 코드의 경우에는 배열을 추가적으로 사용하기 때문에 메모리를 상대적으로 더 잡아먹게 되는 대신 코드의 길이는 비약적으로 줄일 수 있습니다.


이러한 두 가지 차이와 더불어 가장 중요한 '시간'에 대한 부분은 사실 너무 적은 케이스이기 때문에 차이가 안나는 것 처럼 보이지만, 만약 세 수에 대한 비교가 아니라 매우 많은 수들에 대한 비교라면 똑같은 방법을 취했을 때에는 코드(2)의 정렬을 이용하여 계산하는 시간이 더 걸릴 것입니다. 코드(1)의 경우에 for문을 이용하지 않기 때문이죠.

다만, 코드(1)의 방법으로는 상상할 수 없을만큼 코드길이가 길어질 것입니다. 간단한 문제가 아닌 이상에야 단순비교만큼 무식한 방법이 없...겠죠?


이러한 방법들을 비교해가며 차이를 조금 더 피부로 느끼면 어떨까해서 올려보았습니다.

사실 문제에 적합한 비교예시는 아니었던 것 같습니다.. ( _ _ ) 그냥 정말 문득생각나서....

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 10808번 알파벳 개수 문제입니다.


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



 코드 )

#include <stdio.h>

#include <string.h>

int main() {

char arr[BUFSIZ];

int tmp[BUFSIZ], cnt[BUFSIZ]={0,};

int i, j;

scanf("%s", arr);

for(i = 0; i < strlen(arr); i++)

tmp[i] = arr[i] - 97;

for(i = 0; i < strlen(arr); i++)

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

if(tmp[i] == j)

cnt[j]++;

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

printf("%d ", cnt[i]);

printf("\n");

return 0;

}


- 길이를 계산하는 것이 귀찮아서.. strlen함수를 사용하려고 string.h 를 추가하였습니다.

먼저 char형 배열 arr에 문자열을 입력받습니다. 다음으로 char형 배열의 길이를 계산하여 길이만큼 반복합니다.

arr의 인덱스 0부터 차례대로 arr[0]-97을 하여 int형 배열 tmp에 저장하게 되면, 아스키코드를 참고하면 문자 a는 정수 97입니다. 

즉 a - 97을 하게되면 정수로 0 이 됩니다. 이를 이용하여 arr[0] - 97을 한 후 int형 배열에 저장하게 되면 1의 값이 tmp[0]에 저장됩니다. (arr[0]이 b 이므로)

이와 같은 방법으로 tmp배열에 문자를 숫자로 바꾸어 저장해줍니다.

이후에 다시 한 번 for문을 이용하여 문자열의 길이만큼 반복을 하는데, 내부 for문에서는 알파벳의 총 문자의 갯수가 26개 이므로 (a~z) tmp에 저장된 값과 j를 비교하며 같다면 cnt의 해당 인덱스에 카운트를 누적하여 더해줍니다.

(알기 쉽게 예를 들면 처음에 cbab라는 문자열을 입력받았다면, tmp[0]=2, tmp[1]=1, tmp[2]=0, tmp[3]=1 라는 값이 들어 있을 것입니다. 그리고 배열 cnt에는 cnt[0]=1, cnt[1]=2, cnt[2]=1 의 값이 저장될 것입니다.)

최종적으로 배열 cnt에 저장된 값들을 출력해주면 됩니다.


반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 10798번 세로읽기 문제입니다.


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



코드 )

#include <stdio.h>

#define MAX_SIZE 15

char str_read[5][MAX_SIZE];

int main() {

int i, j;

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

scanf("%s", str_read[i]);

}

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

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

if(str_read[i][j] == NULL)

continue;

else

printf("%c", str_read[i][j]);

}

}

printf("\n");

return 0;

}


- 먼저 char형 2차원 배열 str_read[5][15] 를 생성합니다. 그 후 배열 str_read에 문자열을 5번 입력받아서 각각 저장합니다.

그 후, str_read[0][0]의 문자를 먼저 하나 출력해줍니다. 다음으로 str_read[1][0]의 문자를 출력하고,

그 다음엔 str_read[2][0] 의 문자를 , 이와 같이 i열의 문자 먼저 출력해 준 뒤, 

다음으로 j열의 인덱스를 1 증가시켜서 str_read[1][0] -> str_read[2][1] -> str_read[3][1] -> ... 와 같이 출력해주면 세로로 읽기가 됩니다.

만약 이 때 빈 공간, 즉 NULL을 만나게 되면 다음으로 건너뛰어서(continue) 계속 진행하면 됩니다.

핵심은 굳이 2차원배열의 세로값들을 따로 제2의 배열을 만들고 옮기는 복잡한 과정을 통해 한번에 출력할 생각을 하지말고, 문자 하나씩 이동하며 바로바로 출력하면 손쉽게 된다는 것입니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 9012번 : 괄호 문제입니다.


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




코드 ) 

#include <stdio.h> 

#define MAXSIZE 50

int main() {

    int i, j, cnt, num;

    char arr[MAXSIZE];

    scanf("%d", &num);

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

        cnt = 0;

        scanf("%s", arr);

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

            if ( arr[i] == '\0')

                break;

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

                cnt++;

            else if ( arr[i] == ')' && cnt > 0)

                cnt--;

            else if ( arr[i] == ')' && cnt <= 0) {

                cnt--;

                break;

            }

        }

        if ( cnt == 0 )

            printf("YES\n");

        else

            printf("NO\n");

    }

}


- 어려워보일수도 있지만, 생각해보면 간단한 문제입니다. 먼저 문자열을 char형 배열에 입력받습니다.

char형은 각 주소번지마다 1Byte만큼 저장할 수 있으므로 '(' 혹은 ')' 문자 하나하나가 각 인덱스에 저장될 것입니다.

char형 배열 arr에 저장된 값을 인덱스 0부터 차례대로 검사하며 '(' 문자이면 카운트를 더해주고, ')' 문자이면 카운트를 감소시켜줍니다.

'(' 문자라면 단순히 카운트를 더해주면 되지만, ')'문자라면 검사해야 할 조건이 늘어납니다. 

VPS의 조건을 성립시키기 위해 만약 카운트가 0, 즉 ')' 문자와 상쇄되어야 할 '(' 문자가 없는 상태에서 ')' 문자가 한번 더 오게 되면 그 이후에는 '(' 문자나 ')' 문자에 관계없이 VPS 의 조건을 성립하지 않으므로 검사할 필요가 없습니다.

따라서 바로 break를 통해 검사하는 for문을 빠져나오게 되고, cnt는 -1의 값을 갖게 될 것입니다.  즉 cnt==0이라는 조건이 되지않아 NO 라는 문자열을 출력할 것입니다.

만약 VPS의 조건을 성립하여 ( 문자와 )문자가 제대로 상쇄되었다면 cnt==0 으로 결론이 나와서 YES라는 문자열을 출력해 줄 것입니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 2577번 숫자의 개수 문제입니다.


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



코드 ) 

int main() {

int i, a, j, total=1;

int buf[10];

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

buf[i] = 0;

}

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

scanf("%d", &a);

total *= a;

}

for(i = 0; total > 0; i++) {

a = total % 10;

buf[a] += 1;

total /= 10;

}

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

printf("%d\n", buf[i]);

}

}


- 먼저 for문을 통해 배열 buf를 0으로 초기화 해줍니다. (2563번에서 했듯이, 배열을 전역변수로 선언해도 0으로 자동 초기화할 수 있습니다.) 이 배열 buf는 0~10사이의 각각의 수에 대해 카운트하기 위해 사용될 것입니다.

그 후 3개의 수를 입력받아 total에 곱한 값을 누적하여 저장해줍니다.

total의 값이 0보다 큰 동안 반복합니다. total을 10으로 나눈 나머지의 값을 인덱스로 삼아 배열 buf의 a인덱스에 해당하는 위치에 1을 더해줍니다. total을 10으로 나눈 나머지가 a이므로, a는 0~9사이의 값이 될 수 밖에 없습니다.

그 후, total은 10을 나눠줍니다.

이렇게 계산한 뒤, 최종적으로 buf에 저장된 값들을 출력해주면 됩니다.

반응형

WRITTEN BY
SiriusJ

,