[Swift 알고리즘] 2018 KAKAO BLIND RECRUITMENT 비밀지도 문제 2가지 풀이

TIL 26일 차 - [Swift] 2018 KAKAO BLIND RECRUITMENT 비밀지도 문제 2가지 풀이

비밀지도 문제 프로그래머스 링크

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

1. 문자열을 비교하여 풀이

 
1. 10진수로 되어있는 값을 n 개씩 가지고 있는 배열을 두 개 입력받는다.

func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
	var answer: [String] = []

 
2. 해당 n개의 10진수값을 각각 2진수 값으로 만든다.

for i in 0..<n { 
    let binary1 = (String(arr1[i], radix: 2)) 
    let binary2 = (String(arr2[i], radix: 2))

 
3. 2진수로 만든 값이 5자리보다 작으면 부족한 만큼 앞자리를 0으로 붙여준다.

// 앞부분을 0으로 채워 n자리로 만들어주기
    let paddedBinary1 = String(repeating: "0", count: n - binary1.count) + binary1 
    let paddedBinary2 = String(repeating: "0", count: n - binary2.count) + binary2

 
4. 두개의 배열을 같은 인덱스에 있는 다섯 자리의 수를 각각 한자리 씩 비교하고 두 수가 모두 0이면 "#", 그 외의 경우는 " " 공백을 삽입한다. 

// paddedBinary1,2의 각 자리 비교해서 둘다 0이면 " " 공백 넣고 그 외는 "#" 넣기
    let charArray1 = Array(paddedBinary1) 
    let charArray2 = Array(paddedBinary2)
    var temp = "" 
    
    for j in 0..<n { 
    	charArray1[j] == "0" && charArray2[j] == "0" ?
    	temp.append(" ") : temp.append("#") 
    }

 
5. 완성된 temp 문자열을 answer 배열에 append 한다.

    answer.append(temp) 
    } 
    return answer 
}

 
 

1. 문자열을 이용하여 푼 최종 풀이 코드

func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
	for i in 0..<n { 
    	let binary1 = (String(arr1[i], radix: 2)) 
    	let binary2 = (String(arr2[i], radix: 2))
        
        // 앞부분을 0으로 채워 n자리로 만들어주기
    	let paddedBinary1 = String(repeating: "0", count: n - binary1.count) + binary1 
    	let paddedBinary2 = String(repeating: "0", count: n - binary2.count) + binary2
        
        // paddedBinary1,2의 각 자리 비교해서 둘다 0이면 " " 공백 넣고 그 외는 "#" 넣기
   		let charArray1 = Array(paddedBinary1) 
    	let charArray2 = Array(paddedBinary2)
    	var temp = "" for j in 0..<n { charArray1[j] == "0" && charArray2[j] == "0" ?
    	temp.append(" ") : temp.append("#")}
    	answer.append(temp) 
    } 
    return answer 
}

 
 
 

2. 비트 연산자를 이용한 풀이

 

1. 10진수로 되어있는 값을 n개씩 가지고 있는 배열을 두 개 입력받는다.

func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
	var answer: [String] = []

 
2. 두개의 배열의 i번째 인덱스를 or 비트 연산자를 이용해 둘 중에 하나라도 1이면 1로 변환하여 combine 상수에 대입

    for i in 0..<n {
        // 비트 연산자 이용해서 둘중에 하나라도 1이면 1로 변환
        let combine = arr1[i] | arr2[i]

 
3. 2진수인 combine 변수를 문자열로 변환하여 binary 상수에 대입

	let binary = String(combine, radix: 2)

 
4. 2진수로 만든 값이 5자리보다 작으면 부족한만큼 앞자리를 0으로 붙여준다.

        // 앞부분을 0으로 채워 n자리로
        let paddedBinary = String(repeating: "0", count: n - binary.count) + binary

 
5. paddedBinary의 각 자리 수를 쪼개서 배열로 생성

        let charArray = Array(paddedBinary)

 
6. charArray 배열의 각 인덱스값을 순회하며 원소가 "0"이면 " " 공백을 temp에 추가, 그 외의 케이스엔 "#" 추가

        var temp = ""
        for j in 0..<n {
            charArray[j] == "0" ? temp.append(" ") : temp.append("#")
        }

 
7. 완성된 temp 문자열을 answer 배열에 append 해주기

        answer.append(temp)
    }
    return answer
}

 
 

2. 비트 연산자를 이용한 최종 풀이 코드

func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var answer: [String] = []

    for i in 0..<n {
        // 비트 연산자 이용해서 둘중에 하나라도 1이면 1로 변환
        let combine = arr1[i] | arr2[i]
        
        let binary = String(combine, radix: 2)

        // 앞부분을 0으로 채워 n자리로
        let paddedBinary = String(repeating: "0", count: n - binary.count) + binary
        
        // paddedBinary의 각 자리 수 쪼개서 배열로 생성
        let charArray = Array(paddedBinary)
        
        var temp = ""
        for j in 0..<n {
            charArray[j] == "0" ? temp.append(" ") : temp.append("#")
        }
        answer.append(temp)
    }
    return answer

}