반응형

백준 알고리즘 - 2563번 색종이 문제입니다.


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



코드)

#include <stdio.h>

int arr[100][100];

void put_rect(int i, int j) {

   int k, p;

   int tmp = j;

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

      j = tmp;

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

         arr[i][j] = 1;

         j++;

      }

      i++;

   }

}


int calc_rect_size()

{

   int i, j, cnt = 0;

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

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

         if( arr[i][j] )

            cnt++;

   return cnt;

}

int main(int argc, char* argv[]) {

   int i, num, tmp1, tmp2;

   scanf("%d", &num);

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

      scanf("%d %d", &tmp1, &tmp2);

      put_rect(tmp1, tmp2);

   }

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

}


- 먼저 전역변수로 2차원배열 arr를 100, 100의 크기만큼 선언하여 0으로 초기화 해줍니다.

그 후 두 수(tmp1, tmp2)를 입력받아 put_rect 함수의 변수로 넘겨줍니다.

put_rect함수에서는 입력받은 두 수가 예를 들어 3, 7이라 가정하면 arr[3][7] 부터 위, 오른쪽의 방향으로 10만큼 전부 1의 값으로 바꿔줍니다.

그렇게 되면 알기쉽게 표현하면 arr[3~13][7~17]에 저장된 값들은 전부 1, 나머지는 전부 0으로 배열 arr이 저장됩니다.

이와 같은 식으로 main의 for문을 통해 입력 받는 두 수에 대하여 배열 arr의 값을 1로 바꿔줍니다.

결과적으로 calc_rect_size함수에서는 배열 arr에 저장된 값을 1인지, 0인지를 비교하여 1이라면 카운트하여 더해준 후 최종 카운트 된 값을 리턴해줍니다.

이 값이 색종이가 붙은 검은영역의 넓이라 할 수 있습니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 2525번 오븐 시계 문제입니다.


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



코드)

#include <stdio.h>

int main() {

int hour, min, time;

scanf("%d %d", &hour, &min);

scanf("%d", &time);

hour += time / 60;

min += time % 60;

if(min >= 60) {

hour++;

min %= 60;

}

if(hour >= 24)

hour %= 24;

printf("%d %d\n", hour, min);

return 0;

}


- 먼저 시간과 분을 첫째 줄에 입력받고, 다음 줄에는 시간을 입력받습니다.

입력받은 시간인 time변수를 60으로 나눈 값을 hour에 더하여 줍니다. time이 60보다 크다면 그 몫인 1 혹은 그 이상의 값이 hour에 추가로 더해질 것입니다. time이 60보다 작다면 int형이므로 0의 값이 hour에 더해질 것입니다.

다음으로 time을 60으로 나눈 나머지 값을 min에 더하여 줍니다. 만약 min의 결과가 60보다 크거나 같다면 hour에 1을 더해주고, min은 60으로 나눈 나머지를 저장해줍니다.

시간 hour변수의 값이 24가 넘어간다면, hour에 24로 나눈 나머지를 저장해줍니다.

이렇게 하면 시간에 대한 계산이 완료되어 그대로 hour와 min을 출력해주면 됩니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

백준 알고리즘 - 2506번 점수계산 문제입니다.


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




코드)

#include <stdio.h>

int main() {

int arr[100];

int num, i, panel=1, sum=0, tf=0;

scanf("%d", &num);

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

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

if(arr[i] == 1) {

if(tf == 1)

panel += 1;

sum += panel;

tf = 1;

}

else {

tf = 0;

panel = 1;

}

}

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

return 0;

}


- tf는 연속해서 1의 값인지를 확인하기 위한 하나의 플래그 장치로 사용되는 변수입니다.

처음, 입력받을 숫자를 num이라는 변수에 담은 후 for문을 이용하여 입력받은 num의 갯수만큼 반복하여 배열에 값을 입력받도록 합니다. 배열은 개수인 100만큼 할당하여 생성해주었습니다.

 간단하게 생각하여 입력받은 값이 1일때,  tf변수의 값을 한번 더 if문을 이용하여 비교해서 1이라면 전에 입력받은 값이 1이었다고 판단할 수 있고 0이라면 전체 입력받은 값이 0이라는 것을 알 수 있습니다.

이를 이용해 tf가 1이라면 기존의 변수 panel 에 1을 추가로 더하여 결과값 sum에 panel의 값을 더해주면 됩니다.

만약 입력받은 값이 0이라면 tf는 0으로, panel은 기본값 1로 초기화시키는 과정을 해 주면 됩니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

외부에서 제공되는 다양한 데이터들을 이용해서 객체를 초기화하려면 생성자도 다양화 될 필요가 있습니다. 예를 들어 Car 객체를 생성할 때 외부에서 제공되는 데이터가 없다면 기본 생성자로 Car 객체를 생성해야하고, 외부에서 model 데이터가 제공되거나 model과 color가 제공될 경우에도 Car 객체를 생성할 수 있어야 합니다.

그래서 자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩(Overloading) 을 제공합니다. 

생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말합니다.


ex)

public class Car {

Car() { .. }

Car(String model) { ... }

Car(String model, String color) { ... }

Car(String model, String color, int speed) { ... }

}

등과 같이 생성자를 여러 개 선언할 수 있습니다.


하지만 예를 들어

Car(String model, String color) { .. }

Car(String color, String model) { .. }

은 오버로딩이라 할 수 없습니다. 

(매개변수의 타입과 갯수, 선언된 순서가 똑같을 경우에,  매개 변수의 이름만 바꾸는 경우)


여튼, 예시와 같이 생성자를 선언했을 때, 아래 예시와 같이 다양한 방법으로 Car 객체를 생성할 수 있습니다.

ex2)

Car car1 = new Car();

Car car2 = new Car("소나타");

Car car3 = new Car("소나타", "흰색");

Car car4 = new Car("소나타", "흰색", 120);


-> 위의 예시 ex) 와 비교하여 살펴보면 

new Car()는 기본 생성자로 객체를 생성하고, new Car("소나타")는 Car(String model) 생성자로 객체를 생성합니다.

이하 다른 부분 또한 비교하면 금방 알 수 있으실겁니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

객체지향 프로그래밍에서, 메모리에서 사용하고 싶은 객체가 있다면 우선 설계도로 해당 객체를 만드는 작업이 필요할 것입니다. 이 설계도가 바로 클래스(class) 입니다.

클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있게 됩니다. 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance) 라고 합니다.

그리고 클래스로부터 객체를 만드는 과정을 인스턴스화 라고 합니다.


객체지향 프로그래밍 개발은 세가지 단계로 이루어 집니다.

1) 클래스 설계

2) 설계된 클래스를 가지고 사용할 객체를 생성

3) 생성된 객체를 이용


[Class 선언]

public class 클래스이름 {

...

}

여기서, public class 키워드는 클래스를 선언 시 사용하며 반드시 소문자로 작성해야 합니다.

클래스 이름 뒤에는 반드시 중괄호{ } 를 붙여주어야 합니다.

(* 클래스 이름은 맨 앞 알파벳은 대문자로 해주는 것이 관례라고 합니다 :D )


ex) 

(Student.java

public class Student {

}


(Test.java)

public class Test {

public static void main(String[] args) {

Student s1 = new Student();            //new연산자로 Student클래스 객체를 생성

System.out.println("new로 생성한 s1 변수가 Student 객체를 참조!");

Student s2 = new Student();

System.out.println("new로 생성한 또 다른 s2 변수가 Student 객체를 참조!");

}

}

와 같이 파일을 만들어 주고 실행하면, 화면에 다음과 같이 출력이 될 것입니다.

결과)

new로 생성한 s1 변수가 Student 객체를 참조!

new로 생성한 또 다른 s2 변수가 Student 객체를 참조!


[클래스의 구성 멤버]

public class ClassName {

int fieldName;                //필드

ClassName() { ... }            //생성자

void methodName() { ... }  //메소드

}


1) 필드 : 객체의 데이터가 저장되는 곳

- 객체의 고유 데이터, 상태 정보등을 저장하는 곳입니다. 선언 형태는 변수와 유사하지만 필드를 변수라 부르지는 않습니다. 변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행종료되면 자동 소멸됩니다.

하지만 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재합니다.


2) 생성자 : 객체 생성 시 초기화 역할 담당

- 생성자는 new 연산자로 호출되는 특별한 중괄호 { } 블록입니다. 필드를 초기화하거나, 메소드를 호출하여 객체를 사용할 준비를 하게 됩니다. 생성자는 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어있고 리턴타입이 없습니다.


3) 메소드 : 객체의 동작에 해당하는 실행 블록

- 객체의 동작에 해당하는 중괄호 { } 블록을 말합니다. 중괄호 블록은 이름을 가지고 있는데, 이것이 메소드 이름입니다.

메소드를 호출하면 중괄호 블록내에 있는 모든 코드들이 일괄적으로 실행됩니다.

메소드는 객체간의 데이터 전달의 수단으로 사용되며 외부로부터 매개값을 받을수도 있고, 실행 후 어떤 값을 리턴할 수도 있습니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

객체란?

: 객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른것과 식별 가능한 것을 말합니다.

객체는 속성과 동작으로 구성되어 있다고 보면 되는데 자바에서는 이 속성과 동작을 각각 필드(field) 와 메소드(method) 라 부릅니다.


현실세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링(Object Modeling)이라고 합니다. 객체 모델링은 현실 객체의 속성과 동작을 추려내서 소프트웨어 객체의 필드와 메소드로 정의하는 과정이라 할 수 있습니다.


[객체지향프로그래밍의 특징]

1. 캡슐화(Encapsulation)

: 캡슐화란 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것을 말합니다.

외부 객체는 객체내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있습니다.


이렇게 캡슐화를 하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하기 위함입니다.

자바언어는 캡슐화된 멤버를 노출시킬지, 숨길 것인지를 결정하기 위해

접근제한자를 사용합니다.

접근제한자는 객체의 필드와 메소드의 사용범위를 제한함으로써 외부로부터 보호합니다.


2. 상속(Inheritance)

: 상속이란 객체 지향 프로그래밍에서 부모역할의 상위객체가 자기가 가지고 있는 필드와 메소드를 자식역할의 하위 객체에게 물려주어 하위객체가 사용할 수 있도록 해주는 것입니다.


상속은 상위객체를 재사용함으로써 하위 객체를 쉽고 빨리 설계할 수 있도록 도와주고, 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문에 반복된 코드의 중복을 줄여줍니다.


3. 다형성(Polymorphism)

: 다형성은 같은 타입이지만 실행결과가 다양한 객체를 이용할 수 있는 성질을 말합니다. 코드 측면에서 보면 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 잇게 해줍니다.


반응형

WRITTEN BY
SiriusJ

,
반응형

[배열 타입(Array Type)]


배열 선언

1) 타입[ ]   변수;

2) 타입   변수[ ];

와 같이 두가지 형태로 선언될 수 있습니다.


예)

(값 목록으로 배열 생성)

-> String[] name = {"최진우", "정보통신공학", "수원"};

(new 연산자로 배열 생성)

-> int[] age = null;

age = new int[5];

//길이가 5인 int형 배열 선언.


String값을 int형으로 변환

예) String name = "5";

int num = Integer.parseInt(name);

--> num을 출력으로 찍어보면 숫자 5가 출력됩니다.

이 때, name에는 정수로 변환할 수 있는 문자열만 주어져야 NumberFormatException(실행 예외)이 발생하지 않게 됩니다.



객체를 참조하는 배열

기본타입(Primitive Type - 8가지) 배열은 각 항목에 직접 값을 갖고있지만, 참조타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있습니다.

예를 들어 String은 클래스 타입이므로 String[] 배열은 각 항목에 문자열이 아니라, String 객체의 주소를 가지고 있습니다.

예) String[] strArray = new String[3];

strArray[0] = "Java";

strArray[1] = "Python";

strArray[2] = "C";


이때, 각 배열 항목간에 문자열을 비교하기 위해서는 == 연산자 대신 equals() 를 사용해야 합니다.

== 는 객체의 번지비교이기 때문에 문자열 비교에 사용할 수 없다고 지난 String 포스팅에서 말씀드린 바 있습니다.


배열 복사

배열은 한번 생성하면 크기를 변경할 수 없으므로 만약 공간이 더 필요하다면 보다 큰 배열을 새로 만들고 이전 배열의 값을 복사해야합니다.

크게 두가지 방법으로 보면, 첫번째는 for문을 이용해 일일이 넣어주거나, 두번째로 System.arraycopy() 메소드를 사용하는 것입니다.

for문을 이용한 부분은 C와 크게 다르지 않으므로 생략하고 arraycopy()를 이용하는 부분을 살펴보겠습니다.


예) String[] oldName = {"Java", "Python", "C"};

String newName = new String[5];

System.arraycopy(oldName, 0, newName, 0, oldName.length);

(* oldName.length 는 oldName 배열의 길이입니다.)

이 때, oldName은 길이가 3이고, 새로 만든 newName은 길이가 5입니다.


그리고 arraycopy를 하게 되면 아래와 같이 표현됩니다.



** 향상된 for문 **

일반적으로 for문은 C의 문법과 같이,

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

...

}

와 같이 사용할 수 있습니다.

이때, 자바에서는 위의 for문에 더하여

ex) for( 타입변수 : 배열) {

실행문;

}

과 같은 형태로도 사용할 수 있습니다.

배열에서 가져올 항목이 존재할 경우에는 타입변수에 그 값을 넣고 실행문을 실행하고, 이 과정을 for문 안에서 반복합니다.

만약 배열에서 가져올 항목이 없을 경우에는 for문 밖으로 빠져나오게 됩니다.

반응형

WRITTEN BY
SiriusJ

,
반응형

[String 타입]

: 자바는 문자열을 String변수에 저장하기 때문에 다음과 같이 String 변수를 우선적으로 선언해야 합니다.

ex) String 변수;

이제 변수에 문자열을 저장하려면 큰 따옴표로 감싼 문자열 리터럴을 대입하면 됩니다.

ex) 변수 = "문자열";


==> String 변수 = "문자열";  과 같이 선언과 동시에 저장할 수 있습니다.

( 단, 문자열이 직접 변수에 저장되는 것이 아니라, 문자열은 String 객체로 생성되고 변수는 String 객체를 참조하는 것입니다만 일반적으로 표현할 때에는 String 변수에 저장한다는 표현으로 사용합니다. )


String 관련하여 예시를 하나 들겠습니다.

String name1 = "최진우";

String name2 = "최진우";

String name3 = new String("최진우");


이때, if조건문을 이용하여 비교를 한다고 가정할 때,

name1 == name2  -> true

name1 == name3 -> false

name1.equals(name3) -> true


가 됩니다.

그 이유로는 == 라는 연산자는 변수에 저장된 객체 번지가 동일한지를 검사합니다.

name1과 name2는  동일한 문자열 리터럴로 생성된 객체를 참조하므로 결과가 true가 나옵니다.

그러나 name3은 new 연산자로 String 객체를 별도로 생성했기 때문에 name1 == name3은 false가 나오게 되는 것입니다.


동일한 String 객체이건, 다른 String 객체이건 문자열만을 비교할 때에는 String객체의 equals()메소드를 사용해야 합니다.

equals() 메소드는 원본 문자열과 매개값으로 주어진 비교 문자열이 동일한 지 비교한 후 true또는 false를 리턴합니다.

반응형

WRITTEN BY
SiriusJ

,