0이상 10이하를 지정한것인데 for 문은 이러한 범위에서 순서대로 0, 1, 2 가져오며 반복한다는 의미이다.
0 ... 10 이러한 범위 연산자를 폐쇄 범위 연사자라 하며
양 끝이 정해져있다 하여 폐쇄 이다.
그럼 양끝이 정해져있지 않은것도 있다.
Half-Open Range Operator
한글로 뭐라고 번역해야 할지 모르겠다.
위의 폐쇄 범위 연산자와 유사한데
맨 뒤 끝 이전까지 범위를 지정한 것을 일컫는다.
0 ..< 10 이렇게하면 0이상 10미만이다. 점이 이번엔 두개다 중요한 부분이다.
One-sided Ranges( 단측 범위 연산자 )
이번엔 양 끝중 한쪽만 범위를 지정한 것이다.
이미 있는 배열에 대해 범위를 지정할때 이미 양끝이 정해져 있기에 한쪽만 지정해줘서 편하게 사용한다.
위의 폐쇄, 하프오픈 범위 연산자랑 비슷하다.
ex1)
let alphabet = ["A","B","C","D","E"]
for c in alphabet[...2] {
print(c)
}
print()
for c in alphabet[..<2] {
print(c)
}
print()
for c in alphabet[2...] {
print(c)
}
print()
결과:
A
B
C
A
B
C
D
E
첫번째 for문은 alphabet 배열의 처음부터 인덱스2, 그러니까 처음부터 세번째까지 범위를 지정하여
print문에서 A B C가 출력된것이다.
두번째 for문은 alphabet 배열의 처음부터 인덱스2이전까지, 그러니까 처음부터 두번째까지 범위를 지정하여
print문에서 A B가 출력된다.
세번째 for문은 인덱스 2 부터(세번째 부터) 끝까지 범위를 지정하여
print문에서 C D E가 출력되었다
단 2초과에 해당하는 <.. 은 없다
스위프트에는 사용자가 직접 연산자를 지정할 수 있는데 만약 필요하다면 지정해서 사용하면 된다.
이것 외에도 따로 range를 생성해서 지정해줄수 있다.
해당 부분에 대해 알고 싶다면 Range, NSRange에 대해 검색해봄이 좋을듯하다.
난 따로 생성해서 지정할땐 String의 부분을 추출하거나 부분 속성을 변경해줄때만 사용해보고 그외엔 없다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
위 코드는 text에 만약 "다라"가 포함되어있다면 true를 아니라면 false를 반환해준다.
단어가 있는지는 검사할 수 있으나 이 방법으론 단어가 어디에 있는지도 찾지 못한다.
위에서 문자열 내부에 값을 뽑아내려면 인덱스로 찾는다고했다.
그리고 그 인덱스는 range로 만들어내야 한다.
그리고 String 클래스는 인덱스를 만들어주는 함수중 range() 라는게 있다
letrange0 = text.range(of: "다라")
이렇게 하면 text 내부에 "다라" 라고 적힌 녀석중 가장 처음녀석의 위치(인덱스)를 반환하게 된다.
위치일뿐이지 아직 단어 자체는 없다.
이 범위, range는 다양하게 쓸 수 있으나 여기서는 별 의미없이 해당 단어 위치만을 뽑아와 서브로 만들어줄꺼다.
총 세개의 범위에서 뽑아낼건데
1. 단어 시작전까지 : w0
2.단어 : w1
3.단어 이후 부터 끝까지 : w2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
입력 : 한 줄에 공백으로 두개의 정수가 구분되어 입력된다. 입력되는 정수의 범위는 다음과 같다.
입력 범위 : -1073741824 ~ 1073741824
입력 예시
123 -123
출력 예시
0
JAVA
import java.util.Scanner;
publicclassMain{
publicstaticvoidmain(String[] args){
Scanner scan = new Scanner(System.in);
int value0 = scan.nextInt();
int value1 = scan.nextInt();
scan.close();
System.out.println(value0 + value1);
}
}
Swift 4.2
import Foundation
let line =readLine()
if line !=nil {
let valueArray = line!.split(separator: " ")
if valueArray.count ==2 {
iflet value0 =Int(valueArray[0]), let value1 =Int(valueArray[1]) {
print((value0 + value1))
}
}
}
이번문제는 읽자마자 아! 많이 하는 실수인 계산시의 중간값이 범위를 오버하는걸 방지하는 문제이구나!
라고 생각했는데 밑의 단 범위는 이것이다 라고 바로 부정당했네요.
잠깐 이야기하자면
int 의 범위내의 입력값과
int의 범위 내의 출력값이 나온다고해도
그 중간값이 int의 범위내에 있다고 생각 할 수 없습니다.
중간식이 단순 연산이라면 금방 눈치를 채겠지만 막 복잡한 식이 들어가면 어느순간에 범위를 넘어서 버릴수도 있습니다.
물론 이러한 문제는 금방 디버깅시에 발견가능하지만 중간값을 생각안하면 디버깅툴에서 알려주는 라인의 오류를 이해를 못할 수 도 있기에
36.콘솔에서 정수 두 개를 입력받아 합을 출력하라. 단 입력 되는 정수의 범위는 다음과 같다.
입력 범위 : −2147483648 ∼ 2147483647
입력: 두 개의 정수가 공백으로 구분되어 한 줄에 입력된다.
입력 예시
2147483647 2147483647
출력 예시
4294967294
JAVA
import java.util.Scanner;
publicclassMain{
publicstaticvoidmain(String[] args){
Scanner scan = new Scanner(System.in);
long longValue = 0;
for (int i = 0; i < 2; i++) {
longValue += scan.nextInt();
}
scan.close();
System.out.println(longValue);
}
}
Swift 4.2
import Foundation
let line =readLine()
if line !=nil {
let valueArray = line!.split(separator: " ")
if valueArray.count ==2 {
iflet value0 =Int(valueArray[0]), let value1 =Int(valueArray[1]) {
print( value0 + value1 )
}
}
}
스위프트가 이전 모든 값이 int범위였을때랑 같은 소스다! 잘못한거 아니냐! 라고 말할수 있겠으나