자바스크림트는 다뤄본적도 없는 내가 하이브리드 앱을 위해 리액트 네이티브를 공부하기 시작했습니다.

공부하던 도중 자주보이는 이 연산자 ...

말줄임표 같이 생긴 이 점세개에 무슨의미가 있길래 이리도 자주 쓰이나 궁굼증만 넘쳐나고 있었습니다.

 

제목 그대로의 스택오버플로우의 답변에는 

https://stackoverflow.com/questions/40124680/what-does-in-react-native-mean

 

What does '...' in React-Native mean?

A piece of react-native code: enderScene(route, navigator) { let Component = route.component; return ( );...

stackoverflow.com

-답변

이건 스프레드 구문이라 부른다!

연속되는 배열이나 여러 요소가 담긴 녀석을 사용해 확장시킬때 써!

--

라고 하는데 도저히 잘 감이 안잡힌다.

예시를 볼때는 오로지 전부 배열뿐인데 

배열에서만 사용되는거면 이해가 되긴하는데..

 

내가 보는 튜토리얼 강좌에는 

플랫폼 선택에 따라 다른 설정을 해줄때 아래의 함수를 쓴다

 

...Platform.select()

 

그놈의 점세개...

...

...

 

아직도 이 점세개의 의미가 잘 파악되지않는다.

 

 

이번 프로젝트에서는 데이터가 날짜에 대한 항목이 여러군데에서 많이 쓰여

기본 타입의 확장으로 편리성을 높여봤습니다.

 

날짜 형식을 잘 파싱해서 Datecomponents에 넣어서 Date값을 반환해도 좋지만

Dateformat을 활용해 바꿔봤습니다.

 

extension String {
    func toDate() -> Date? { //"yyyy-MM-dd HH:mm:ss"
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        dateFormatter.timeZone = TimeZone(identifier: "UTC")
        if let date = dateFormatter.date(from: self) {
            return date
        } else {
            return nil
        }
    }
}

extension Date {
    func toString() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        dateFormatter.timeZone = TimeZone(identifier: "UTC")
        return dateFormatter.string(from: self)
    }
}

 

따로 함수로 빼서 사용 하시려면 self 자리에 해당하는 내용을 적어주면 되겠네요 ㅎ

추가로 toString할때 타임존을 UTC 가 아니라 각 나라별로 하면

Date는 기본이 UTC라 각 나라의 시간대별 시간으로 바로 변환 하는걸로 써먹을수도 있을거같아요.

혹은 날짜형식 변환에도 써먹을수 있겠네요

년 월 일 시 분 초 있는 문자열을 월/일 시 - 분 문자열로 변환같은 기능으로요.

 

그럴일이 있을까 모르겠습니다만...

 

아무튼 위 소스의  사용은 아래와 같이 해봤습니다.

(참고로 이 애들은 전역 변수 쓰듯이 클래스 밖에다가 적어 주셔야합니다 extension 사용임을 잊지말아주세요.)

 

참고로 toDate()는 반환이 옵셔녈 타입이기에 한번 옵셔널을 벗겨주셔야합니다.

현재 연결된 WiFi의 SSID값을 받아와서 내가 연결하려한SSID와 같은지 비교해서

앱내에서 연결이 됐는지 확인하는 예제를 만들고 있었으나,

func currentSSIDs() -> [String] {
    guard let interfaces = CNCopySupportedInterfaces() as? [String] else {
        return []
    }
    return interfaces.compactMap { interfaceName in
        guard let info = CNCopyCurrentNetworkInfo(interfaceName as CFString) as? [String:AnyObject] else {
        	print("Point 0")
            return nil
        }
        guard let ssid = info[kCNNetworkInfoKeySSID as String] as? String else {
        	print("Point 1")
            return nil
        }
        return ssid
    }
}

ps. 해당소스는 https://codeday.me/ko/qa/20190625/886103.html 를 보고 살짝 바꾼 코드이다.

(iOS11 이상부터?  단순 Nil값 제거는 flatMap 대신 compactMap 을 쓰는걸 권장하고있다)

 

currentSSIDs 의 값이 항상 nil이 나오고

console에 Point 0가 찍힌다.

 

처음에는 뭔가 키라던가 변경되어 값을 잘못 참조하고있는줄 알았다.

그렇게 키값 위주로 검색해보던중 우연찮게

잘못된곳은 그곳이 아니라는걸 알게되었고

문제는 아래 스택오버플로우의 글과 같았다.

 

https://stackoverflow.com/questions/50767946/systemconfiguration-captivenetwork-doesnt-work-on-ios-12 

 

테스트하고 있던 폰은 iOS12 로 WiFi 정보를 받아오려면

Project File -> Capabilities 의 Access WiFi Information 을 on으로 변경해줘야한다.

 

변경해주었더니 잘 받아옴....

excell 차트

 

iOS 타겟 버전 지원율

iOS12 이상 = 75%

iOS11 이상 = 92%

이하 잡다.   = 100%

 

 최소지원을 11버전으로 잡아도 무방하겠네요

 

 

자료 소스 -

 

https://kbench.com/?q=node/194882

 

애플 'iOS12' 점유율 75%…iOS11 점유율 17% | 케이벤치

애플이 지난해 9월 출시한 iOS12 운영체제(OS)가 전체 iOS 기기 가운데 75%에 설치된 것으로 조사됐다. 3일(한국시간) 애플은 개발자 지원 페이지를 업데이트하고 지난 1일 조사된 iOS 버전별 점유율을 공개했다. 애플 통계에 따르면 iOS12는 전체 아이폰, 아이패드 가운데 75%에 설치된 것으로 나타났다. iOS11 점유율은 17%를 기록했으며, iOS10 이전 OS를 설치한 기기는 8%인 것으로 나타났다. 지난 4년 동안 출시된 아이폰, 아

kbench.com

 

https://www.welcomekakao.com/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율 | 프로그래머스

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다. 이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를

www.welcomekakao.com

 

 

1번스테이지부터 최종 스테이지까지

실패한 사람을 카운트

 

1번 스테이지 = 1번 카운트 / 총인원

2번 스테이지 = 2번 카운트 / (총인원 - 1번 카운트)

를 반복해서 구하는것으로 최종 각 스테이지별 실패율을 구했습니다.

 

조금 고민한 부분이 실패율별 내림차순 정렬해서 출력하는건데

그냥 버블정렬을 사용했어요.

버블정렬만세.....

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
 
public class Solution {
	public int[] solution(int N, int[] stages) {
		int stagesCount = stages.length;
		ArrayList<Integer> copySta = new ArrayList<>();
		
		//fail 부분은 인덱스 1 부터 사용할래
		int[] failCount = new int[N+1];
		double[] failP = new double[N+1];
		
		
		
		for (int i = 0; i < failCount.length; i++) {
			failCount[i] = 0;
		}
		
		for (int i = 0; i < failP.length; i++) {
			failP[i] = 0.0;
		}
		
		for (Integer integer : stages) {
			copySta.add(integer);
		}
		
		
		for (int i = 1; i <= N; i++) {
			for (Integer integer : copySta) {
				if(integer == i) {
					failCount[i]++;
				}
			}
		}
		
		for (int i = 1; i < failCount.length; i++) {
			failP[i] = (double)failCount[i] / stagesCount;
			stagesCount -= failCount[i];
		}
		
		HashMap<Integer, Double> pair  = new HashMap<>();
		for (int i = 1; i <= N; i++) {
			pair.put(i, failP[i]);
		}
		
		int[] sortTemp = new int[pair.size() + 1]; 
		Iterator<Integer> keys = pair.keySet().iterator();
		int index = 1;
		while(keys.hasNext()){
			sortTemp[index] = keys.next();
			index++;
		}
		
//		for(int t: sortTemp) {
//			System.out.println("key:" + t + " value:" + pair.get(t));
//		}
		
		
		//keys = pair.keySet().iterator();
		for (int i = 1; i <= sortTemp.length; i++) {
			for(int j = 1 ; j <= sortTemp.length - i - 1 ; j++) {
				//System.out.println("j:" + j + " " + pair.get(sortTemp[j]) + " < " + "j+1:" + (j+1) + " " + pair.get(sortTemp[j+1]) + " = " + (pair.get(sortTemp[j]) <  pair.get(sortTemp[j+1])));
	            if(pair.get(sortTemp[j]) <  pair.get(sortTemp[j+1])) {
	                int temp = sortTemp[j+1];
	                sortTemp[j+1] = sortTemp[j];
	                sortTemp[j] = temp;
	            }
	        }
			
//			System.out.print("i:" + i + " 루프의 결과 = ");
//			for(int t: sortTemp) {
//				System.out.print(t + " ");
//			}
//			System.out.println();
		}
		int[] answer = new int[sortTemp.length - 1];
		
		for (int i = 1; i < sortTemp.length; i++) {
			answer[i - 1] = sortTemp[i];
		}
		
		return answer;
	}
}

저장이나 정렬부분은 더 깔끔히 하신분이 많으신듯하지만

역시 바로떠오르는건 이런것뿐이네요.

 

 

문제 자체는 들어오는 문자열의 파싱이나 검색을 할수 있는지 묻는 문제로 보인다.

입력형식은 고정되어있기에 split 을 통해 파싱해서 2개냐 3개냐로도 판단할수있고

처음에검색을통해 종류를 판별후 서브스트링으로 만들어 풀수도 있겠다 싶다.

 

아래 소스에서는 enum으로 종류를 넣고 HashMap을통해 닉네임을 덮어쓰기를 하도록했다

import java.util.ArrayList;
import java.util.HashMap;

public class Solution {
	enum recordType { Enter,Leave,Change,ERROR }
	
	public String[] solution(String[] record) {
		
		HashMap<String, String> usersMap = new HashMap<>();
		ArrayList<String> midResult = new ArrayList<>();
		
		String[] answer; // 뒤에서 초기화 해주자
		
		for(int i = 0 ; i < record.length ; i++) {
			//회원별 저장
			String msg = record[i];
			String[] sub = msg.split(" ");
			recordType type;
			
			if(sub.length >= 2) {
				String key = "";
				type = recordType.valueOf(sub[0]);
				key = sub[1];
				if(type != recordType.Leave && type != recordType.ERROR) {
					if(sub.length > 2) {
						String name = sub[2];
						usersMap.put(key, name);
					}
				}
				if(type != recordType.Change) {
					midResult.add(key + ";" + type.toString());
				}
			} else {
				System.out.println("ERROR msg parse");			
				return new String[] {};
			}
		}
		
		
		answer = new String[midResult.size()];
		
		for (int i = 0; i < midResult.size(); i++) {
			String mid = midResult.get(i);
			String[] sub = mid.split(";");
			String name = usersMap.get(sub[0]) != null ? usersMap.get(sub[0]) : "";
			recordType type = recordType.valueOf(sub[1]) != null ? recordType.valueOf(sub[1]): recordType.ERROR;
			
			answer[i] = name + "님이";
			
			switch (type) {
			case Enter:
				answer[i] += " 들어왔습니다.";
				break;
			case Leave:
				answer[i] += " 나갔습니다.";
				break;
			case Change:case ERROR:default:
				answer[i] += "";
				break;
			}
		}
		return answer;
	}
}

http://tech.kakao.com/2018/09/21/kakao-blind-recruitment-for2019-round-1/

 

2019 카카오 신입 공채 1차 코딩 테스트 문제 해설

작년에 이어 올해도 블라인드 전형으로 카카오 개발 신입 공채가 시작되었습니다! 그 첫 번째 관문으로 1차 온라인 코딩 테스트가 지난 9월 15일(토) 오후 2시부터 7시까지 5시간 동안 치러졌는데요. 지원자분들 만큼이나 준비위원들도 테스트가 문제없이, 공정하게 치러질 수 있도록 많은 준비를 했고 두근 거리는 마음으로 끝까지 온라인 테스트를 모니터링했답니다. 문제는 작년과 비슷하게 구현 문제 위주로 쉬운 난이도에서 어려운 난이도 순으로 풀 수 있도록 차례대

tech.kakao.com

 

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

 

 

 

 

+ Recent posts