이번글은 6. 조건문과 반복문에서 언급한 enum에 대한 글이다.

직접 만드는 자료형중에 하나라고 소개하고싶다.

정수가 여러가지 수를 모아 둔 형태라 하면 이 enum 은 사용자가 원하는것들을 모아둘수있다.

6번글에서 switch 예제로 사용한 코드를 다시보면

    var a = "banana"

    switch a {

      case "banana" : print("banana")

      case "apple" : print("apple")

      case "melon" : print("melon")

      case "lemon" : print("lemon")

      case "peach" : print("peach")

      default: print("다른 종류이다.")

    }

출처: https://wiwi-pe.tistory.com/105?category=976417 [선생님 개발블로그가 하고싶어요.:티스토리]

라고 되어 있는데.

여기서 a는 String이라는 자료형을 가지게된다.

switch는 조건으로 들어온 a가 가질수 있는 모든 값에 대해 case를 지정해줘서 조건을 분기하는 기능을 하는데

default에서 이외의 String값을 처리해주고있는데 오타라던가가 발생하면 항상 default로 빠져버린다.

여기서 만약 a가 enum이였다면 훨씬더 깔끔한 모습으로 안정적이게 바꿀수있다.

a 값이 

banana apple melon lemon peach 중 하나라면 

enum Fruit {
    case banana
    case apple
    case melon
    case lemon
    case peach
}

var a = Fruit.banana
switch a {
    case .banana : print("banana")
    case .apple : print("apple")
    case .melon : print("melon")
    case .lemon : print("lemon")
    case .peach : print("peach")
}

위와 같은 형태로 a값에 대한 오류를 사전에 방지를 할 수 있게된다.

이 이외에도 조건문의 기준으로 사용하기위해 불형 변수를 하나 사용한다하면

var flag = false

if flag { print("참일때 실행해라" }

이 항목을 

enum Some {
    case run
    case stop
}
var flag = Some.run
if flag == .run { print("참일때 실행해라") }

이와 같이 변경해서 사용하면 가독성과 확장성이 좋아진다.

가독성이야 이름때문에 그렇다해도 확장성이 왜 좋아지냐면

만약 flag가 나중에 run또는 stop이 아닌 pause를 가지게 된다면 단순히 Some에서 case pause를 추가해주면 된다. 또다른 flag를 사용하여 연속으로 if문을 중첩하여 분기를 해주는것보다 훨씬 확장성이 좋다.

다시 위의 바나나에 관한 이야기로 돌아가자면 enum자체에도 하나의 특정한 값을 가지게 할수도 있고 함수를 가지게 할 수 도 있는게 스위프트의 장점인데 이에 대해 예제로 하나 퉁치며 이번 enum을 마치려고 한다.

enum Fruit : Int {
    case banana = 12
    case apple
    case melon
    case lemon
    case peach
    
    var stringValue: String {
        get {
            switch self {
            case .apple: return "apple"
            case .banana: return "banana"
            case .lemon: return "lemon"
            case .melon: return "melon"
            case .peach: return "peach"
            }
        }
    }
}


var a = Fruit.lemon
switch a {
    case .banana :
        print("banana")
    case .apple :
        print("apple")
    case .melon :
        print("melon")
    case .lemon :
        print("lemon")
    case .peach :
        print("peach")
}
print(a.rawValue, a.stringValue)

이 코드를 실행해보면

lemon

15 lemon 

와 같은 두줄이 뜨게 되는데 첫줄은 switch문에의한 print이고 두번째 줄은 switch 이후의 print문이다.

enum은 rawValue를 지정해줘서 가져올수 있는데 

rawValue를 위에 banana = 12 로만 주면 아래에 들어가는 값을 자동으로 순서대로 지정된다.

추가로 enum에는 stringValue처럼 값을 지정해주거나 func을 새로 넣어 줄 수 있어 조건문같은와 같이 쓰기 매우 좋은 형태이다.

 

- 변수에 대괄호를 열어 get을 정의해줬는데 이에 대해서는 앞 글에서 다루지 않아 이후에 또 다룰수 있으면 좋겠다.

- 함수에 대해서도 다룬적이없다.

첫 직장을 가지기전 까진 ios앱개발에 대한 흥미 자체가 없었다.

그 곳에서 어쩌다보니 앱을 만들기 시작했고 

어쩌다보니 경력을 쌓고 

어쩌다보니 지금 이렇게 앱만드는것으로 먹고 살고있다.

 

공부 자체도 해보지 않고 당시 필요한 기능만 검색해서 합치다보니 

"이게 바로 가끔 강의에서 듣던 스파게티 코드구나" 라고 스스로 외칠 정도로의 알수없는 코드덩어리가 탄생했고

그 덕분에 이상한곳에서 미묘한 동작을 하는 앱이 완성되었다.

 

아마 회사에 앱제작을 맡긴사람도 결과물을 보고 한탄했을듯하다.

언어도, 앱개발도 만져본적없는 신입한테 앱개발을 맡긴 대표도 어처구니가 없을텐데 결과물을 받아본사람은 얼마나 어처구니가 없었을까

 

그렇게 스위프트와 나와의 인연은 이어지고,

 

이제와서 스위프트 언어에 대해 공부해보고 싶다고 생각이 든다.

돈은 없기에 교재를 사거나 강의를 사거나 하지 않고 

홀로 이것저것 찾아보며 스위프트 언어 튜토리얼을 만들어보려고한다.

 

그래서 찾아보는 순서를 어떻게 할까 고민하는중 그냥 스위프트 홈페이지를 뒤지면서 예제를 만들어보는 방식으로 작성해볼까한다.

 

 

 

이제 막 iOS 개발에 손을 대고자 하는 분들을 위해 아래의 영상에서 나오는 스톱워치를 만드는 튜토리얼을 시작해보려고합니다.

일단 개발을 위해 필요한 준비물은

 

xcode11이 설치되는 macOS 10.14.4 버전 이상의 맥PC,

그리고 애플 계정입니다.

 

튜토리얼에서 만들앱은 xcode에서 제공해주는 시뮬레이터로만 돌릴것이고 개발자계정(유료)은 없어도 학습이 가능합니다.

 

단, 학습용이라고 할지라도 애플계정은 필요해요

 

맥을 구입하셨고, 처음 사용자세팅을 완료하셨다면 분명 다들 애플 계정이 있을꺼라 생각됩니다.

 

 

macOS 10.14.4 이상으로 제한한 이유는

swift5의 컴파일러를 사용하기 위해서입니다.

실제로는 그 이하 버전이라도 개발은 가능해요

 

 

그리고 위에서 말씀드린 실행영상입니다.

 

이 영상은 시뮬레이터(iphone11, ios13)의 화면이에요.

 

기본, 라이트 모드에서의 동작화면 

기본 모드 화면

 

 

다크 모드 화면

다크 모드

 

우선 위에 영상에서 나오는 앱의 기능을 정의해야합니다.

 

1. 분,초, 1/10초의 시간 표시가 되어야합니다. 이는 물론 스톱워치 기능을 시작하면 실시간으로 시간이 표시되어야하죠.

2.  랩타임을 기록하고싶습니다. 스톱워치면 당연히 있어야겠죠?

3. 언제든 스톱워치를 처음상태로 돌아가는 리셋기능도 만들어주세요!

4. 요즘 ios13에는 다크모드라고 검은색버전도 있던데 지원가능하게해주세요!

 

그렇게

요청사항은 크게 4가지가 되겠습니다.

 

그럼 다음 포스트는 프로젝트를 만드는것으로 만나뵙겠습니다 ㅎ

1044 : [기초-산술연산] 정수 한 개 입력받아 1 더해 출력하기 with Swift

41. 콘솔에서 정수를 한 개 입력 받아 1을 더해 출력하라.

입력 범위: -2147483648 ~ 2147483647

입력 예시

2147483647

출력 에시

2147483648

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value0 = scan.nextInt();
        scan.close();
		long printValue = (long) value0;
		System.out.println(++printValue);
	}
}

 

 

Swift 4.2

import Foundation

extension Int {
    static prefix func ++(_ x: inout Int) -> Int {
        x += 1
        return x
    }
}
let line = readLine()
if line != nil {
    if var value = Int(line!) {
        print(++value)
    }
}

 

 

이번 문제는 증감연산자를 사용해보는게 목적인 문제인듯하여

굳이 ++을 사용해봤습니다.

switf 4.2에선 해당 연사자가 디폴트로 존재하지 않기때문에 전위 증감 연산자로 Int에 한해서 사용하도록 추가해봤습니다.

솔직히 필요한가 싶기도 해요

사용후 증가 사용전 증가 뭐그런거 헷갈리기도하고...

https://codeup.kr/problem.php?id=1044

 

[기초-산술연산] 정수 한 개 입력받아 1 더해 출력하기

어떤 변수(a)에 값을 저장한 후  a+1 의 값을 출력할 수도 있고, ++a 후 출력할 수도 있다. ++a, --a, a++, a-- 와 같이 어떤 변수의 앞이나 뒤에 붙여 변수에 저장되어 있는 값을 1씩 더하거나 빼주는 연산자를 증감연산자라고 한다. 증감연산자를 변수 앞에 붙이면 그 변수를 사용하기 전에 증감을 먼저 수행하고, 증감연산자를 변수 뒤에 붙이면 일단 변수에 저장되어 있는 값을 먼저 사용하고 난 후에 증감을 수행한다.

codeup.kr

 

 

 

 

1045 : [기초-산술연산] 정수 두 개 입력받아 자동 계산하기 with Swift

42. 콘솔에서 정수 두 개(a,b)를 입력 받아 합,차,곱, 나머지, 나눈값을 출력하라.

입력 :

0 ~ 2147483647, b != 0

출력 :

1line : 두 수의 합

2line: 두 수의 차 (a - b)

3line: 두 수 의 곱

4line: a를 b로 나눈 몫

5line: a를 b로 나눈 나머지

6line: a를 b로 나눈 값( 실수, 소수점 셋째 자리에서 반올림해 둘째 자리까지 출력)

입력 예시

10 3

출력 예시

13

7

30

3

1

3.33

Java

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		long value0 = scan.nextInt();
		long value1 = scan.nextInt();
        scan.close();
		System.out.println(value0 + value1);
		System.out.println(value0 - value1);
		System.out.println(value0 * value1);
		System.out.println(value0 / value1);
		System.out.println(value0 % value1);
		double printValue = ((double) value0) / value1;
		System.out.println(String.format("%.2f", printValue));
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let values = line!.split(separator: " ")
    if values.count == 2 {
        if let value0 = Int(values[0]), let value1 = Int(values[1]) {
            print(value0 + value1)
            print(value0 - value1)
            print(value0 * value1)
            print(value0 / value1)
            print(value0 % value1)
            let floatValue = Float(value0) / Float(value1)
            print(String.init(format: "%.2f", floatValue))
        }
    }
}

 

 

 

휴일에 사무실에서 이게 뭐하는짓인지..

https://codeup.kr/problem.php?id=1045

 

[기초-산술연산] 정수 두 개 입력받아 자동 계산하기

정수 두 개(a, b)를 입력받아 합, 차, 곱, 몫, 나머지, 나눈값을 자동으로 계산해보자. (단 입력되는 정수 a, b의 범위는 0 ~ 2147483647이고, b는 0이 아니다.)

codeup.kr

 

 

 

1046 : [기초-산술연산] 정수 세 개 입력받아 합과 평균 출력하기 with Swift

43.콘솔에서 세 개의 정수를 입력받아 합과 평균을 출력하라.

입력 : 1line으로 공백으로 구분되어 3개의 정수가 입력됨 (입력 범위 : -2147483648 ~ -2147483647)

출력:

1line : 세 정수의 합

2line : 세 정수의 평균( 실수, 소수점 둘째 자리에서 반올림하여 첫째 자리까지 출력 )

입력 예시

1 2 3

출력 예시

6

2.0

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int [] values = new int [3];
		for (int i = 0; i < values.length; i++) {
			values[i] = scan.nextInt();
		}
        scan.close();
		if(values.length > 2) {
			long total = values[0] + values[1] + values[2];
			
			double avg = total / 3.0;
			System.out.println(total);
			System.out.println(String.format("%.1f", avg));
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let split = line!.split(separator: " ")
    if split.count == 3 {
        var values = [Int]()
        for s in split {
            if let value = Int(s) {
                values.append(value)
            }
        }
        if values.count == 3 {
            let total = values[0] + values[1] + values[2]
            let avg = Float(total) / 3.0
            print(total)
            print(String.init(format: "%.1f", avg))
        }
    }
}

 

 

뭐.. 이런곳에서는 의미는 없습니다만

보통 배열이라던가 반복이라던가 할때 직접적으로 숫자를 써서 위치를 입력받는건 위험한 일입니다.

최대한 자동으로되게 혹은 그값이 정말로 존재하는지에대해 검사를 해야합니다만

이런문제에선 의미가 없지요.

https://codeup.kr/problem.php?id=1046

 

[기초-산술연산] 정수 세 개 입력받아 합과 평균 출력하기

정수 세 개를 입력받아 합과 평균을 출력하는 프로그램을 작성해보자. (단, -2147483648 ~ 2147483647)

codeup.kr

 

1041 : [기초-산술연산] 문자 한 개 입력받아 다음 문자 출력하기 with Swift

38. 콘솔에서 영문자 한 개를 입력받아, 입력된 문자의 아스키코드값의 다음에 해당하는 문자를 출력하라.

입력 예시

a

출력 예시

b

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
        scan.close();
		char [] charArray = line.toCharArray();
		if(charArray.length > 0) {
			System.out.println((char) (charArray[0] + 1));
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    if let printValue = line!.first {
        let unicodes = printValue.unicodeScalars
        for uni in unicodes {
            if let printValue = Unicode.Scalar(uni.value + 1) {
                print(printValue)
            }
        }
    }
}

 

 

https://codeup.kr/problem.php?id=1041

 

[기초-산술연산] 문자 한 개 입력받아 다음 문자 출력하기

영문자 한 개를 입력받아, 그 다음 문자를 출력하는 프로그램을 작성해보자. 영문자 '$A$'의 다음 문자는 '$B$'이고, 문자 '$0$'의 다음 문자는 '$1$'이다.

codeup.kr

 

 

 

 

 

 

 

1042 : [기초-산술연산] 정수 두 개 입력받아 나눈 몫 출력하기 with Swift

39. 콘솔에서 정수 두 개(a,b)를 입력 받아 a를 b로 나눈 몫을 출력하라.

입력 범위: 0 ~ 2147483647

입력 예시

1 3

출력 예시

0

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value0 = scan.nextInt();
		int value1 = scan.nextInt();
        scan.close();
		if(value1 > 0) {
			System.out.println(value0/value1);
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let array = line!.split(separator: " ")
    if array.count == 2 {
        if let value0 = Int(array[0]), let value1 = Int(array[1]) {
            if value1 > 0 {
                print(value0/value1)
            }
        }
    }
}

 

 

 

https://codeup.kr/problem.php?id=1042

 

[기초-산술연산] 정수 두 개 입력받아 나눈 몫 출력하기

C언어에서 a/b 연산의 결과는 a를 b로 나눈 몫이 계산된다. 실수/정수,  정수/실수,  (float)정수/정수,  정수/(float)정수  의 연산은 나눈 결과가 실수로 계산된다. (float)(정수/정수)는 정수/정수의 결과인 정수를 실수형(float)로 바꾸는 것으로, 정수가 실수 형태로 변환되는 것이니 주의한다. 정수/실수... 에서 계산 결과가 실수형으로 바뀌는 것과 같이 계산 결과의 데이터형이 자동으로 바뀌는 것을 묵시적 (데이터)형 변환이

codeup.kr

 

 

 

 

 

 

1043 : [기초-산술연산] 정수 두 개 입력받아 나눈 나머지 출력하기 with Swift

40. 콘솔에서 정수 두개(a,b)를 입력 받아 a를 b로 나눈 나머지를 출력하라.

입력범위: 0 ~ 2147483647

입력 예시

1 3

출력 예시

1

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value0 = scan.nextInt();
		int value1 = scan.nextInt();
        scan.close();
		if(value1 > 0) {
			System.out.println(value0%value1);
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    let array = line!.split(separator: " ")
    if array.count == 2 {
        if let value0 = Int(array[0]), let value1 = Int(array[1]) {
            if value1 > 0 {
                print(value0%value1)
            }
        }
    }
}

 

 

https://codeup.kr/problem.php?id=1043

 

[기초-산술연산] 정수 두 개 입력받아 나눈 나머지 출력하기

정수 두 개(a, b) 를 입력받아 a를 b로 나눈 나머지를 출력하는 프로그램을 작성해보자. (단, 두 개의 정수 a, b의 범위는 0 ~ 2147483647이고, b는 0이 아니다.)

codeup.kr

 

 

 

 

1034 : [기초-출력변환] 8진 정수 한 개 입력받아 10진수로 출력하기 with Swift

31. 콘솔에서 8진수를 한 개 입력받아 10진수로 출력하라.

입력 예시

13

출력 예시

11

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
		scan.close();
		String clean = line.trim();
		System.out.println(trans8to10(clean));
	}
	
	static public int trans8to10(String str8Value) {
		if(str8Value.length() < 1) {return -1; }
		if(!valueCheck(str8Value)) {
			return -1;
		} else {
			char [] numberArray = str8Value.toCharArray();
			int p = numberArray.length - 1;
			
			int result = 0;
			for (char number : numberArray) {
				int val = Integer.valueOf(String.valueOf(number));
				result += val * ((int) Math.pow(8, p));
				p--;
			}
			return result;
		}	
	}
	
	static public boolean valueCheck(String target) {
		try {
			Integer.valueOf(target);
			return true;
		} catch (Exception e) {
			System.out.println("Error : Main.valueCheck() ->" + e.getLocalizedMessage());
			return false;
		}
	}
}

 

 

Swift 4.2 

import Foundation

func trans8to10(strValue:String) -> Int{
    guard Int(strValue) != nil else { return -1 }
    
    var result = 0;
    var p:Double = Double(strValue.count - 1)
    for number in strValue {
        if let val = Int(String(number)) {
            result += val * Int(pow(Double(8), p))
        }
        p -= 1;
    }
    return result
}

let line = readLine()
if line != nil {
    print(trans8to10(strValue: line!))
}

좀 쓸모없는게 들어간거같고 비효율적으로 느껴집니다.

그렇지만 더 생각하기 귀찮아서 넘어가렵니다.

요즘 딱히 일이없어 잔심부름 같은일 외에 기초100문제 포스팅하다보니 어느새 1/3 지점에 도착해버렸습니다.

이번에도 하다가 그만두고 먼 미래로 남겨두겠지 했는데 페이스를 보니 다음 프로젝트가 저한테 할당되기전까지 놀랍게도 100문제까지 갈지도 모르겠다는 생각이 드네요.

ios13 발표되고 공부해야할게 늘었는데 공부하기 싫어서 이런거난 하고있으니

멀리서 저를 내려다보면 엄청 한심해 보일거같습니다.

https://codeup.kr/problem.php?id=1034

 

[기초-출력변환] 8진 정수 한 개 입력받아 10진수로 출력하기

int n; scanf("%o", &n); printf("%d", n); (한편, C언어에서 소스 코드 작성시 0으로 시작하는 수는 8진수로 인식된다.)

codeup.kr

 

 

 

 

1035 : [기초-출력변환] 16진 정수 한 개 입력받아 8진수로 출력하기 with Swift

32. 콘솔에서 16진수 정수 한 개를 입력받고 8진수로 바꾸어 출력하라.

입력 예시

f

출력 예시

17

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
		scan.close();
		String clean = line.trim();
		System.out.println(trans16to8(clean));
	}
	
	static public String trans16to8(String str16Value) {
		try {
			int converted = Integer.valueOf(str16Value, 16);
			return String.format("%o", converted);
		} catch (Exception e) {
			System.out.println("Err : trans16to8 -> " + e.getLocalizedMessage());
			return "";
		}
	}
}

 

Swift 4.2

 

import Foundation

func octalTrans(value:Int) -> [Int] {
    var flag = value
    var result = [Int]()
    
    while flag >= 8 {
        result.append(flag % 8)
        flag = flag / 8
        if flag < 8 { result.append(flag) }
    }
    
    result.reverse()
    return result
}

func alpaTransNumber(alpa:Character) -> Int? {
    switch alpa {
    case "a": return 10
    case "b": return 11
    case "c": return 12
    case "d": return 13
    case "e": return 14
    case "f": return 15
    default: return nil
    }
}

func trans16to10(strValue:String) -> Int?{
    let letters = CharacterSet.letters
    var result = 0;
    var p:Double = Double(strValue.count - 1)
    for number in strValue.unicodeScalars {
        if letters.contains(number) {
            if let val = alpaTransNumber(alpa: Character(number)) {
                result += val * Int(pow(Double(16), p))
            } else {
                print("Err : trans16to10 -> 잘못된 값이 입력됨")
                return nil
            }
        } else {
            if let val = Int(String(number)) {
                result += val * Int(pow(Double(16), p))
            } else {
                print("Err : trans16to10 -> 잘못된 값이 입력됨")
                return nil
            }
        }
        p -= 1;
    }
    return result
}

let line = readLine()
if line != nil {
    if let value = trans16to10(strValue: line!) {
        var printValue = String()
        for number in octalTrans(value: value) {
            printValue += String(number)
        }
        print(printValue)
    }
}

자바는 Integer.valueOf()에 저렇게 변환하는 기능이 있는지 몰랐네요 ㅋㅋㅋ

이전 소스도 다 수정하고싶지만 귀찮으니 그냥 남겨둡니다.

놀다가 우연하게 발견했네요. ㅎㅎ

그렇게 자바쪽은 코드가 확 줄었습니다.

valueOf에 진수 변환기능이 있는지 모르는분들을 위해 잠깐 끄적여 보자면

위 코드에서

int converted = Integer.valueOf(str16Value, 16);

에서 사용했는데,

str16Value라는 문자열이 사실 16진수야! 그러니 10진수로 바꿔주렴

라는 기능이 있다고하네요.

지금도 좀 헷갈려서 쓸날이 올지는 모르겠습니다.

자바를 잘 안만지기도 하니까요.

스위프트 코드는 이전 문제들 코드를 긁어와서 짜집기했습니다.

다시 짜기 귀찮아서요.

https://codeup.kr/problem.php?id=1035

 

[기초-출력변환] 16진 정수 한 개 입력받아 8진수로 출력하기

int n; scanf("%x", &n); //소문자로 16진수 입력 printf("%o", n); 한편, C언어에서 소스 코드 작성시 0x으로 시작하는 수는 16진수로 인식된다. 또한 소스코드 내에서 //로 시작하면 1줄 설명을 넣을 수 있다. 여러 줄을 설명(주석) 처리할 경우 /* 로 시작해 */로 끝나는 사이에 작성할 수 있다.

codeup.kr

 

 

 

 

1036 : [기초-출력변환] 영문자 한 개 입력받아 10진수로 출력하기 with Swift

33. 콘솔에서 영문자 한 개 를 입력받아 영문자의 아스키 코드 값을 출력해라.

입력 예시

A

출력 예시

65

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
		scan.close();
		byte[] bytes = line.getBytes();
		for (byte b : bytes) {
			System.out.println(b);
		}
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    for scalar in line!.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars {
        print(scalar.value)
    }
}

 

 

https://codeup.kr/problem.php?id=1036\

 

[기초-출력변환] 영문자 한 개 입력받아 10진수로 출력하기

아스키(ASCII, 미국표준코드, American Standard Code for Information Interchange) 코드표는 영문자, 특수문자 등을 사용할 때 사용하는 표준 코드이다. 컴퓨터로 저장되는 모든 데이터는 2진 정수화되어 저장되는데, 영문자와 특수기호 등을 저장하는 방법으로 아스키코드를 일반적으로 사용한다. 예를 들어 영문 대문자 'A'는 10진수 65에 해당하는 2진수 값으로 저장된다.

codeup.kr

 

 

 

 

1037 : [기초-출력변환] 정수 한 개 입력받아 아스키 문자로 출력하기 with Swift

34. 콘솔에서 10진 정수 한 개(0~255)를 입력 받아 아스키 문자로 출력해보라.

입력 예시

65

출력 예시

A

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int ascii_num = scan.nextInt();
		scan.close();
		System.out.println(String.format("%c", ascii_num));
	}
}

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    if let value = Int(line!){
        if let uni = Unicode.Scalar(value) {
            print(Character.init(uni))
        }
    }
}

 

문뜩 기초100제를 swift로 할만한 이유가 있을까? 라는 의문이 들었습니다.

https://codeup.kr/problem.php?id=1037

 

[기초-출력변환] 정수 한 개 입력받아 아스키 문자로 출력하기

10진 정수 한 개를 입력받아 아스키문자로 출력하는 프로그램을 작성해보자. (단, 0 ~ 255 범위의 정수만 입력된다.)

codeup.kr

 

 

1031 : [기초-출력변환] 10진수 한 개 입력받아 8진수로 출력하기 with Swift

28. 콘솔에서 10진수를 입력받아 8진수로 출력하시오. ( 입력 범위 int )

입력 예시

10

출력 예시

12

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value = scan.nextInt();
		System.out.println(Integer.toOctalString(value));
	}
}

 

 

Swift 4.2

import Foundation

func octalTrans(value:Int) -> [Int] {
    var flag = value
    var result = [Int]()
    
    while flag >= 8 {
        result.append(flag % 8)
        flag = flag / 8
        if flag < 8 { result.append(flag) }
    }
    
    result.reverse()
    return result
}

let line = readLine()
//let testValue = [124,235,65767,453,434365,57,24]

if line != nil {
    if let value = Int(line!){
        let octalArray = octalTrans(value: value)
        var printValue = String()
        for o in octalArray {
            printValue += "\(o)"
        }
        print(printValue)
    }
}

 

 

java에서는 손쉽게 진수 변환하는게 있는데 swift는 잘안보이네요.

아마 있을거라 생각하는데 찾아도 잘안나와서 그냥 만들어봤습니다.

테스트는 몇개해봤는데 되긴하는데 안될지도 뭔가 안되는게 있을지도 몰라요...

https://codeup.kr/problem.php?id=1031

 

[기초-출력변환] 10진수 한 개 입력받아 8진수로 출력하기

%d(10진수 형태)로 입력받고, %o 를 사용하여 출력하면 8진수(octal)로 출력할 수 있다.

codeup.kr

 

 

 

1032 : [기초-출력변환] 10진 정수 한 개 입력받아 16진수로 출력하기1 with Swift

29. 콘솔에서 10진수를 입력받아 16진수로 출력하라.

입력 예시

255

출력 예시

ff

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value = scan.nextInt();
        scan.close();				
		System.out.println(Integer.toHexString(value));
	}
}

Swift 4.2

import Foundation
func trans9over(target:Int) -> String {
    var result:String
    switch target {
    case 10: result = "a"
    case 11: result = "b"
    case 12: result = "c"
    case 13: result = "d"
    case 14: result = "e"
    case 15: result = "f"
    default: result = ""
    }
    return result
}

func hexTrans(value:Int) -> [String] {
    var flag = value
    var result = [String]()
    
    while flag >= 16 {
        let mod = flag % 16
        if mod > 9 {
            result.append(trans9over(target: mod))
        } else { result.append("\(flag % 16)") }
        
        flag = flag / 16
        if flag < 16 {
            if flag > 9 {
                result.append(trans9over(target: flag))
            } else { result.append("\(flag)") }
        }
    }
    result.reverse()
    return result
}

let line = readLine()
if line != nil {
    if let value = Int(line!){
        let hexArray = hexTrans(value: value)
        var printValue = String()
        for h in hexArray {
            printValue += "\(h)"
        }
        print(printValue)
    }
}

;;;

뭔가 더 예쁘고 깔끔하게 하는 방법이 있을것 같으나 머리가 멍하네요...

특시 10이상을 문자로 표현하려고할때의 부분이 맘에 걸립니다

스위프트는 완전히 처음부터 독학이고 서적으로 차근차근 시작한게 아니라 솔직히 부족한 부분을 많이 느끼고 있습니다.

https://codeup.kr/problem.php?id=1032

 

[기초-출력변환] 10진 정수 한 개 입력받아 16진수로 출력하기1

%d(10진수 형태)로 입력 받고 %x로 출력하면 16진수(hexadecimal) 형태로 소문자로 출력된다. 10진법은 한 자리에 10개(0 1 2 3 4 5 6 7 8 9) 문자 중 한 개를 사용한다. 16진법은 한 자리에 16개(0 1 2 3 4 5 6 7 8 9 a b c d e f) 문자 중 한 개를 사용한다. 16진법의 a는 10진법의 10, b는 11, c는 12 ... 와 같다.

codeup.kr

 

 

 

 

1033 : [기초-출력변환] 10진 정수 한 개 입력받아 16진수로 출력하기2 with Swift

30. 콘솔에서 10진수를 입력받아 16진수로 출력하라.

입력 예시

255

출력 예시

FF

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int value = scan.nextInt();
        scan.close();
		String printValue = String.format("%X", value);
		System.out.println(printValue);
	}
}

 

Swift 4.2

import Foundation
func trans9over(target:Int,isLowercase:Bool) -> String {
    var result:String
    switch target {
    case 10: result = "a"
    case 11: result = "b"
    case 12: result = "c"
    case 13: result = "d"
    case 14: result = "e"
    case 15: result = "f"
    default: result = ""
    }
    if isLowercase {
        return result
    } else {
        return result.uppercased()
    }
}

func hexTrans(value:Int,isLowercase:Bool) -> [String] {
    var flag = value
    var result = [String]()
    
    while flag >= 16 {
        let mod = flag % 16
        if mod > 9 {
            result.append(trans9over(target: mod, isLowercase: isLowercase))
        } else { result.append("\(flag % 16)") }
        
        flag = flag / 16
        if flag < 16 {
            if flag > 9 {
                result.append(trans9over(target: flag, isLowercase: isLowercase))
            } else { result.append("\(flag)") }
        }
    }
    result.reverse()
    return result
}

let line = readLine()
if line != nil {
    if let value = Int(line!){
        let hexArray = hexTrans(value: value, isLowercase: false)
        var printValue = String()
        for h in hexArray {
            printValue += "\(h)"
        }
        print(printValue)
    }
}

 

이전이랑 다른건 딱히 없습니다...

1032항 문제 소스에서 isLowercase라는 변수하나 추가했을뿐입니다.

문자열 클래스에선 lowercased , uppercased 라는게 있어서 그걸 써봤습니다.

https://codeup.kr/problem.php?id=1033

 

[기초-출력변환] 10진 정수 한 개 입력받아 16진수로 출력하기2

%d(10진수 형태)로 입력 받고 %X로 출력하면 16진수(hexadecimal) 형태로 대문자로 출력된다.

codeup.kr

 

1028 : [기초-데이터형] 정수 한 개 입력받아 그대로 출력하기2 with Swift

 

25. 콘솔에서 정수 한 개를 입력 받아 그대로 출력하라. ( 입력 되는 정수 범위 0 ~ 4294967295)

입력 예시

2147483648

출력예시

2147483648

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		long line = scanner.nextLong();
		scanner.close();
		System.out.println(line);
	}
}

 

 

Swift4.2

import Foundation

let line = readLine()
if line != nil {
    if let value = CUnsignedInt(line!){
        print(value)
    }
}

 

할까 말까하다가... 합니다

int 는 범위가 -2147483648 ~ 2147483647 라고합니다.

그런데 0 ~ 4294967295 까지 입력이 된다고했으니 타입을 다른걸로 해줘라 라는 문제였슴다

앞에 자바쪽 의도는 unsigned int 사용을 권하겠지만 하다보니 귀찮아서 long을 사용했습니다.

왠만한 수는 롱으로 다들어갑니다만... 메모리 낭비일거같네요

참고로 언어별로 표현이 다를수도 범위가 다를수 있습니다 특히 long같은경우는요.

 

https://codeup.kr/problem.php?id=1028

 

[기초-데이터형] 정수 한 개 입력받아 그대로 출력하기2

정수 한 개를 입력받아 그대로 출력해보자. (단, 입력되는 정수의 범위는 0 ~ 4,294,967,295 이다.)

codeup.kr

 

 

 

 

1029 : [기초-데이터형] 실수 한 개 입력받아 그대로 출력하기2 with swift

26. 콘솔에서 실수 한 개를 입력받아 그대로 출력하라. ( 입력범위 : +- 1.7*10^-308 ~ 1.7*10^308)

출력 - 소수점 11번째 짜리 까지 출력

입력 예시

3.14159265359

출력 예시

3.14159265359

이번 문제는 이전 문제랑 그닥 다르지않으니 넘어갈래요.

수정 --

갑자기 마음이 바뀌어 일일이 다 소스 적을려고합니다.

JAVA

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		double line = scanner.nextDouble();
		scanner.close();
		System.out.println(String.format("%.11f", line));
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
//let line:String? = "3.14159265359"
if line != nil {
    if let value = CDouble(line!){
        print(String.init(format:  "%.11lf", value))
    }
}

 

 

 

https://codeup.kr/problem.php?id=1029

 

[기초-데이터형] 실수 한 개 입력받아 그대로 출력하기2

float 데이터형을 사용하면 3.4*10^-38 ~ 3.4*10^38 범위의 실수를 저장할 수 있다. (float 로 선언하고 %f로 입력 받거나 출력하면 된다.) 하지만 이 범위를 넘는(더 작거나 더 큰) 실수를 저장하기 위해서는  보다 큰 범위를 저장할 수 있는 다른 데이터형을 사용해야 정상적으로 저장시킬 수 있다. 쉽게 생각하면, float 를 사용하는 것보다 double 을 사용하는 것이 좀더 정확하게 저장할 수 있다.  단, 실수 1개를 저장하

codeup.kr

 

 

 

 

 

1030 : [기초-데이터형] 정수 한 개 입력받아 그대로 출력하기3 with swift

27. 콘솔에서 정수 한 개를 입력받아 그대로 출력하라. ( 입력범위 : –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)

입력 예시

-2147483649

출력 예시

-2147483649

JAVA

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		long line = scanner.nextLong();
		scanner.close();
		System.out.println(line);
	}
}

 

 

Swift 4.2

import Foundation

let line = readLine()
if line != nil {
    if let value = CLongLong(line!) {
        print(value)
    }
}

 

 

대는 소를 겸한다고... 1028번이랑 겹쳐버렸습니다.

설마 long을 써서 입출력하라는 문제가 나올줄은 몰랐네요

다시 한번 말씀드리자면 타입은 언어별로 범위가 다르거나 표현이 다를수 있습니다.

https://codeup.kr/problem.php?id=1030

 

[기초-데이터형] 정수 한 개 입력받아 그대로 출력하기3

-2147483648 ~ +2147483647 범위의 정수를 저장하고 처리하기 위해서는 int 데이터형을 사용해 변수를 선언하면된다. (int 로 선언하고 %d나 %i 로 입력 받거나 출력하면 된다.) 하지만 이 범위를 넘어가는 정수를 저장하기 위해서는 보다 큰 범위를 저장할 수 있는 다른 데이터형을 사용해야 정상적으로 저장시킬 수 있다. long long int 데이터형을 사용하면 –9,223,372,036,854,775,808 ~ 9,223,372,0

codeup.kr

 

+ Recent posts