지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
"지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
예시)
아래처럼 결과를 리턴해야한다.
func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
var answer: [String] = []
for i in 0..<n {
answer.append(String(arr1[i]|arr2[i], radix: 2))
}
for i in 0..<n {
while answer[i].count < n {
answer[i] = " " + answer[i]
}
answer[i] = answer[i].replacingOccurrences(of: "1", with: "#")
answer[i] = answer[i].replacingOccurrences(of: "0", with: " ")
}
return answer
}
두 번째 조건에서 비트연산을 이용해야 한다는 것을 알았어야했는데 나는 처음에 알 지 못했다.
처음에는 매개변수로 받는 배열들을 2진수로 새로운 배열에 저장 후, 각 String의 길이가 n보다 작을 경우에만 0을 추가하고 for문을 이용해 두 배열의 원소들을 하나하나 비교하려했었다. 아무리봐도 아닌 것 같아 방법을 찾다 이전에 생각했던 이 방법이 굉장히 어리석었다는 것을 알게되었다.
처음에는 두 번째 for문에서 while 대신 if를 써서 두 번이나 실패했었다. 조금만 생각해보면 빈칸이 하나라는 보장도 없는데 왜 그렇게 생각했는지 모르겠다. 아무튼 while로 바꿔 길이가 맞을 때까지 space를 앞에 넣어주었다.
다음으로 이전에 연습하며 배웠던 replacingOccurrences를 이용해 1은 #으로, 0은 빈 칸으로 바꿔주어 리턴하였다.
String(__, radix: ) 에서 radix에 해당하는 진수의 수를 넣어주면 표현 가능하다.
2진수말고도 16진수 등의 다른 방법으로도 표현 가능하다.
일반적으로 AND, OR, NOT이 쓰인다. Shift연산자도 있지만 일단 앞의 기본적인 세 개의 연산부터 보자.
AND(&) -> 두 수의 비트가 1로 같은 경우에만 1을 반환하고 나머지는 0을 반환한다. 즉 1,1 을 제외한 나머지 0,0/ 1,0 / 0,1 의 경우엔 0을 반환한다.
OR( | ) -> 두 수의 비트 중 하나라도 1이 있다면 1을 반환한다. 1,1 / 1,0 / 0,1 모두 1을 반환하고 0,0의 경우에만 0을 반환한다.
NOT -> 말 그대로 비트를 반전시킨다. 즉, 1이 들어가면 0이, 0이 들어가면 1이 나오는 것이다.
문제를 풀고 다른 사람들의 풀이를 보면 굉장히 간단하게 푸신 분들이 많다. 전부터 느꼈지만 map이라는 메서드가 자주 사용되는 것 같아서 따로 포스트를 작성하며 공부해야겠다. 그래도 하나씩 지식이 늘어가는 것 같아 좋다.