반응형

두 가지 방법으로 풀었다. 첫 번째 방법은 버블 정렬을 사용하였으며 두 번째 방법은 평범하게 풀었다.

버블 정렬을 사용하여 상덕, 중덕, 하덕버거 중 가장 가격이 낮은 버거를 찾았으며(food배열의 0번째 인덱스) 음료와 콜라는 삼항 연산자를 사용하였다.

 

버블 정렬을 사용한 풀이 방법

 
/*
 * Author : Jeonghun Cho
 * Date : March 17, 2020
 */
 
#include <stdio.h>
 
int main() {
    int food[5];
    int arrSize = sizeof(food)/sizeof(int);
    int temp;
    
    for(int i=0; i<arrSize; i++){
        scanf("%d"&food[i]);
    }
    
    for(int i=0; i<2; i++){
        for(int j=0; j<2; j++){
            if(food[j] > food[j+1]){
                temp = food[j];
                food[j] = food[j+1];
                food[j+1= temp;
            }
        }
    }
    printf("%d\n", (food[3> food[4] ? food[0]+food[4]-50 : food[0]+food[3]-50));
    
    return 0;
}

2. 무난하게 푼 방법

 
/*
 * Author : Jeonghun Cho
 * Date : March 17, 2020
 */
 
#include <stdio.h>
 
int main() {
    int food[5];
    int beverage;
    int burger;
    
    for(int i=0; i<sizeof(food)/sizeof(int); i++){
        scanf("%d"&food[i]);
    }
    burger = food[0];
    beverage = (food[3> food[4]) ? food[4] : food[3];
 
    if(food[0> food[1]){
        burger = food[1];
    }
    if(burger > food[2]){
        burger =  food[2];
    }
    printf("%d\n", burger+beverage-50);
 
    return 0;
}
 
반응형
반응형

코딩을 하다 보면 무작위로 나온 결과 값들을 정렬을 해야할 때가 있다.

가장 대표적인 예로 로또 번호를 추출하는 프로그램을 만들 때 "20 23 18 5 34 30"과 같은 형식으로 출력할 수 있지만

 

naver에서 제공하는 실제 901회 당첨 번호 (되고 싶다..)

 

위와 같이 숫자들을 오름차순(작은 수 -> 큰 수)으로 정렬해서 만들고 싶을 때는 버블 정렬을 사용하면 쉽게 구현할 수 있다!

 

 

버블 정렬이란?

버블 정렬은 정렬 알고리즘 중에서 가장 간단한 알고리즘이며 서로 인접한 값들을 비교하여 큰 값을 뒤로 넘기며 정렬하는 알고리즘이다.

 

아래 코드는 무작위로 값이 저장된 크기가 5인 배열이다. 어떻게 버블 정렬이 실행되는지 과정을 살펴보자.

 

int arr[5= {53142};

 

1. arr[0]의 5와 arr[1]의 3을 비교한다. arr[0]이 arr[1]보다 값이 크므로 arr[0]과 arr[1]의 자리를 바꾼다.

 

int arr[5= {35142};

 

2. arr[1]의 5와 arr[2]의 1을 비교한다. arr[1]이 arr[2]보다 값이 크므로  arr[1]과 arr[2]의 자리를 바꾼다.

 

int arr[5= {31542};

 

3. arr[2]의 5와 arr[3]의 4를 비교한다. arr[2]가 arr[3]보다 값이 크므로 arr[2]와 arr[3]의 자리를 바꾼다.

 

 

int arr[5= {31452};

 

4. arr[3]의 5와 arr[4]의 2를 비교한다. arr[3]이 arr[4]보다 값이 크므로  arr[3]과 arr[4]의 자리를 바꾼다.

 

int arr[5= {31425};

 

5. 마지막까지 비교를 마쳤으면 처음으로 돌아가서 같은 방법으로 정렬을 반복한다. 설명은 생략하고 정렬 순서만 써놓을테니 자신이 생각한 것과 맞는지 비교해보자.

 

int arr[5= {13425};
 
int arr[5= {13425}; 
// arr[1]의 3과 arr[2]의 4를 비교했을 때 3이 더 작으므로 변화 없음.

 

int arr[5= {13245};

 

int arr[5= {12345}; 
// 최종 배열의 상태

 

위 예시는 인접한 두 값을 비교할 때 앞에 놓여있는 값이 더 큰 경우가 한 번밖에 없었지만 데이터가 많을수록 이와 같이 필요 없는 비교를 많이 하기 때문에 다른 정렬에 비해 속도가 느린 편이지만 구현하기 매우 쉽다는 장점을 가지고 있다.


버블 정렬 구현 코드

다음 코드는 무작위로 저장된 10개의 값을 버블 정렬을 사용한 코드이다.

 

#include <stdio.h>
 
 
int main() {
    int arr[10= {95361018247};
    int len = sizeof(arr) / sizeof(int);
    int temp;
    
    printf("Before : ");
    for(int i=0; i< len; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    for(int i = 0 ; i < len - 1 ; i++){
        for(int j = 0 ; j < len - 1 ; j++){
            if(arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1= temp;
            }
        }
    }
    
    printf("After : ");
    for(int i=0; i< len; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}
 
 

버블 정렬을 하기 위해서 이중 반복문을 사용하였으며 for문의 조건값을 "len-1"로 작성한 이유는 크기가 10인 배열의 마지막 인덱스는 9이다. 버블 정렬의 인접한 두 값을 비교하는 순서는 0과 1번 인덱스, 1과 2번 인덱스, 2와 3과 인덱스, ... , 7과 8번 인덱스, 8과 9번 인덱스이다.

for문이 8번까지 돌면 크기가 10인 배열의 마지막 인덱스인 9까지 비교하는 코드이므로 len이 아닌 len-1로 작성하였다.

 

이 글을 보고 버블 정렬에 대해서 이해했다고 생각이 들면 코드를 보지 않고 직접 타이핑하여 버블 정렬을 구현해보자.

그리고 이를 응용하여 내림차순(위 -> 아래)으로 정렬하는 코드도 작성해보며 연습해보자. 아래 코드는 내림차순 코드인데 코드를 보지 않고 작성해본 다음 확인해보자.


내림 차순 구현 코드

#include <stdio.h>
 
 
int main() {
    int arr[5= {53142};
    int temp;
    int len = sizeof(arr) / sizeof(int);
    for(int i=0; i< len - 1; i++){
        for(int j=0; j<len - 1; j++){
            if(arr[j] < arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1= temp;
            }
        }
    }
    
    for(int i=0; i<len; i++){
        printf("%d ", arr[i]);
    }
    
    return 0;
}
 

 

눈치 빠른 사람은 버블 정렬 코드 if문의 '>' 부등호를 '<' 부등호로 바꿔주면 된다는 것을 알았을 것이다. (눈치 못 채도 상관없다)

반응형
반응형

난수에 대해서 공부를 하다가 무작위로 숫자 1 ~ 100까지의 임의의 숫자 30개를 추출한 후에 평균을 구하면 몇 정도 나오는지 궁금해서 코드로 작성해보았다. 결과부터 말하면 45이상 55이하 범위가 가장 많이 나옴ㅎㅎ

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main() {
    srand((unsigned int)time(NULL));
    int array[30]; // 크기가 30인 배열
    int sum = 0;
 
    for(int i=0; i< sizeof(array)/sizeof(int); i++){
        int randomNumber = rand() % 101// 0 ~ 100까지의 랜덤 숫자
        array[i] = randomNumber;
        sum += array[i];
    }
 
    printf("Result : %d\n", sum/(sizeof(array)/sizeof(int)));
    
    return 0;
}

 

일반 코드와 조금 다른점은 랜덤 숫자를 30개를 뽑을 것이라서 for문의 조건값을 간단하게 30으로 써도 되지만 sizeof(arrat)/sizeof(int)로 작성하였다.

그 이유는 만약 배열의 크기가 바뀌면 for문의 조건도 바꿔줘야하기 때문이다. 

만약 배열의 크기가 30이 아닌 100으로 수정하고 싶으면 배열의 크기를 변경하는 동시에 for문의 조건도 i < 100 형식으로 변경해주어야 한다.

하지만 for문의 조건값을 배열의 크기만큼 반복할 수 있도록 코드를 작성하면 배열의 크기만 변경하면 되므로 실수도 방지할 수 있고 나중에 귀찮지 않다.

 

#include <stdio.h>
 
int main() {
    int array[30];
 
    printf("array size : %d\n"sizeof(array));
 
    return 0;
}

 

위 코드에서 사용된 sizeof()함수는 자료형의 크기를 구하는 함수이다. 코드를 실행해보면 결과가 array의 크기인 30이 아닌 120이 출력이 된다.

분명히 sizeof()함수는 자료형의 크기를 구하는 함수라고 했고, 배열 array의 크기는 30으로 설정했는데 120이 출력이 된다. 왜 그럴까?

 

그 이유는 C언어에서 int 자료형의 크기는 4Byte이며, 배열 array의 크기가 30이므로 4Byte 공간을 차지하는 공간이 30개가 있는 것이다.

그래서 sizeof(array)만 사용하면 우리가 원하는 30이 아니라 120이 출력이 되는 것이다! 그 다음에 해야할 것은 120이라는 숫자를 실제 배열의 크기 30으로 만드는 방법이다.

 

 

#include <stdio.h>
 
int main() {
 
    int array[30];
 
    printf("array size : %d\n"sizeof(array)/sizeof(int));
 
    return 0;
}

 

int 자료형의 크기는 4Byte라고 했다. 그래서 sizeof(array)를 sizeof(int)로 나누어주었다. 즉 120/4 연산을 한 것이다. 그래서 결과 값은 우리가 원하는 실제 배열 array의 크기인 30이 출력이 된다.

 

앞으로 배열의 크기만큼 반복문을 돌릴 때는 반복문의 조건값을 단순히 숫자로 적는 것보다 위 코드처럼 적도록 노력하자.

반응형
반응형

 

앱을 개발하다가 시뮬레이터가 갑자기 안되면서 "Thread 1: signal SIGABRT" 오류가 나오는 경우가 있어서 당혹스러울 때가 있는데 SIGABRT(Signal Abort: 신호 중단)은 nil이거나 존재하지 않는 것에 엑세스할 때 앱이 충돌나는 것을 나타낸다. 원인은 주로 Outlet에 있다.

 

1. Storyboard에서 View Controller를 클릭한다.

 

 

2. 노란 경고가 있는 것은 유효하지 않은 outlet이므로  연결을 해제한다.

 

 

3. 다시 시뮬레이터를 실행시키면 잘 돌아갈 것이다.

반응형
반응형

 

Any

Any는 Swift의 모든 데이터 타입을 사용할 수 있다.

 

변수 또는 상수의 데이터 타입이 Any로 지정되어 있다면 그 변수 또는 상수에는 어떤 종류의 데이터 타입이든지 상관없이 할당할 수 있다!

일반적으로 정수형으로 선언한 변수나 상수는 정수형 데이터를 저장 후에 정수형 이외의 데이터 타입을 저장하려고 하면 오류가 발생한다.

아래 코드는 정수형 변수 something에 100을 할당 후 문자열 "Glasses"를 저장한 것이다. 당연히 오류 발생.

 

var something: Int = 100
something = "Glasses" // 오류 발생
print(something)

 

하지만 Any타입에서는 뭐든지 가능하다. 아래 코드는 Any타입인 something 변수에 정수형, 문자열, 소수형 값을 할당했다.

var something: Any = 100
print(something) // 100 출력
 
something = "IPhone"
print(something) // IPhone 출력
 
something = 1.123
print(something) // 1.123

 

NOTE

Any는 될 수 있으면 사용하지 않는 것을 추천한다. 타입에 상당히 엄격한 Swift의 특성 상 Any 또는 AnyObject로 선언된 변수의 값을 가져가 쓰려면 매번 타입 확인 및 변환을 해줘야 하는 불편함이 있을뿐더러 예기치 못한 오류의 위험을 증가시키기 때문이다.

앞서 타입 추론 때도 설명했지만 타입은 될 수 있는 한 명시하는 것이 좋다.


nil

nil은 Any처럼 특정 타입이 아니라 '없음'을 나타내는 키워드이다.

 

var nilTest: Int= 100
// nillTest 변수는 졍수형 타입 100을 저장하고 있다.
nilTest = nil
// nilTest 변수는 아무런 값도 저장하지 않고 있다.

 

nil은 non-optional 변수나 상수에서는 사용할 수 없다. 만약 상수나 변수가 특정 조건에서 값이 없는 상태에서 작동해야 하는 경우가 있다면 항상 optional 변수로 선언하자.

만약 값을 할당하지 않고 optional 변수로 선언하면 변수는 자동적으로 nil로 세팅된다.

 

var nilTest: Int// 아무 것도 저장이 되지 않은 nil 상태

 

다른 프로그래밍 언어를 해 본 사람은 null값이라고 생각하면 편할 것 같다. 변수나 상수에 값이 없는 경우, 즉 nil이면 해당 변수나 상수에 접근했을 때 잘못된 메모리 접근으로 런타임 오류가 발생한다.

잘못된 메모리에 접근하여 발생하는 런타임 오류는 Null Pointer Exception 이라고 불린다.

 

반응형
반응형

Swift 5

Simulator로 테스트할 때 TextField를 클릭하여 현재 키보드 모양을 보고싶은데 보이지 않을 때 보이게 하는 방법이다.

 

1. iOS Simulator -> Hardware -> Keyboard

2. "Connect Hardware Keyboard" 체크 해제

 

 

반응형
반응형

 

Swift 5

 

앱을 개발하다보니 위 사진처럼 주민등록번호나 휴대폰 번호와 같이 사용자가 숫자만 입력하도록 제한하고 싶을 때가 있다.

나는 임의의 숫자를 맞추는 [UP & Down] 게임을 개발하다가 숫자 이외의 단어를 입력하면 오류가 나는 것을 방지하기 위해 다음과 같은 방법을 사용했다.

상당히 간단하다.

Storyboard에서 TextField의 타입을 변경한다.

1. 숫자 입력으로 제한할 TextField를 선택한다.

2. Attribute Inspector로 이동하여 Keyboard Type을 확인한다.

3. Keyboard Type을 Number Pad로 변경한다.

반응형
반응형

너무 빨리 풀어서 깜짝 놀랐다.

BufferedWriter클래스를 사용하지 않은 코드와 사용한 코드.

 

/*
 * Author : Jeonghun Cho
 * Date : December 6, 2019
 */
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int size = Integer.parseInt(br.readLine()); 
        String[] input = new String[size]; 
        
        for(int i=0; i<size; i++) {     
            input = br.readLine().split(" ");
            for(int j=0; j<input[1].length(); j++) { 
                char ch = input[1].charAt(j);
                for(int k=0; k<Integer.parseInt(input[0]); k++) {
                    System.out.print(ch); 
                }
            }
            System.out.println();
        }
        br.close();
    }
}
 
Colored by Color Scripter

 

 

/*
 * Author : Jeonghun Cho
 * Date : December 6, 2019
 */
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int size = Integer.parseInt(br.readLine()); 
        String[] input = new String[size]; 
        
        for(int i=0; i<size; i++) {     
            input = br.readLine().split(" ");
            for(int j=0; j<input[1].length(); j++) { 
                char ch = input[1].charAt(j);
                for(int k=0; k<Integer.parseInt(input[0]); k++) {
                    bw.write(ch);
                }
            }
            bw.write("\n");
        }
        bw.flush();
        bw.close();
        br.close();
    }
}
Colored by Color Scripter
반응형
반응형
/*
 * Author : Jeonghun Cho
 * Date : December 6, 2019
 */
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        System.out.println(st.countTokens());
        br.close();
    }
 
}
 
Colored by Color Scripter
반응형
반응형

html5

 

<abbr>태그는 다음과 같은 형태로 사용합니다.

 

<!--코드 1.1-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        영수가 재미없는 개그를 해서 <abbr title="갑자기 분위기 싸해진다">갑분싸</abbr>
    </body>
</html>
Colored by Color Scripter

 

<사진 1.1> 코드 1.1 결과 화면

 

<abbr>태그

1. abbr은 abbreviation(약어)이라는 단어의 앞 부분을 사용한 단어입니다. 약어란 WWW(World Wide Web), HTML(HyperText Markup Language), DEC(December)와 같이 줄여서 사용하는 것을 말합니다. 한글로는 갑분싸, 아아(아이스 아메리카노) 등이 있죠?

 

2. 마우스 커서가 <abbr>태그를 설정한 곳(dot형식으로 밑줄)에 올려두면 약어에 대한 설명이 툴팁 형태로 나타납니다.

 

3. title 속성을 사용해서 약어에 대한 설명을 작성할 수 있습니다. ex) title="설명"

 

다음 코드는 WWW, HTML, DEC의 약어를 설명하는 코드입니다.

 

<!--코드 1.2-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
       <p><abbr title="World Wide Web">WWW</abbr></p>
       <p><abbr title="Hypertext Markup Language">HTML</abbr></p>
       <p><abbr title="December">DEC</abbr></p>
    </body>
</html>
Colored by Color Scripter

<사진 1.2> 코드 1.2 결과 화면

반응형

+ Recent posts