링크

 

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr


 

문제

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

풀이

 

n = 5

arr1 = [9, 20, 28, 18, 11]

arr2 = [30, 1, 21, 17, 28]

배열의 값을 2진수로 변환 후 지도에 표시

2진수는 1과 0으로 구성.

1과 0은 각각 지도 표기 방법으로 바꿔준다.

1 = "#"

0 = " "  (공백)

 

9를 2진수로 변환하면 1001 라는 값이 나온다.

 

20을 2진수로 변환하면 10100

 

위의 9와 20을 2진수로 변환한 값을 보면 자릿수가 다르다.

자릿수를 맞춰주기 위해서는 처음에 받은 n 만큼 자릿수를 채워준다.

그럼 밑의 내용처럼 9를 2진수로 변환한 내용도 바뀐다. 

1001 -> 01001

위의 내용대로 arr1 의 값을 2진수로 모두 변환시키면

arr1 = [9, 20, 28, 18, 11]

이렇게 된다.

이 것을 지도로 변환시키면

이렇게 표기가 된다.

 

 

arr2도 2진수로 변환

arr2 = [30, 1, 21, 17, 28]

이렇게 된다.

이 것을 지도로 변환시키면

이렇게 표기된다.

 

그럼 arr1 지도와 arr2 지도의 # 부분을 합집합으로 보여주면 된다.

비밀지도가 완성되었다.

return 방식은 String 배열에 담아서 해준다.

["#####","# # #", "### #", "# ##", "#####"]

 

 


 

위의 로직 구현

 

class Solution {
    
	/**
	 * 각 배열의 지도 합치기
	 * @param str1
	 * @param str2
	 * @param n
	 * @return
	*/
	public String sumArr(String str1, String str2, int n) {
		StringBuilder sb = new StringBuilder(); 
		for (int i = 0; i < n; ++i) {
			sb.append(((str1.charAt(i) + str2.charAt(i)) == 96)? " ":"#");
		}
		return sb.toString();
	}
	
	/**
	 * 각 배열의 자릿수 채워주기
	 * @param str
	 * @param n
	 * @return
	*/
	public String lpad(String str, int n) {
		int size		= n - str.length();
		StringBuilder sb	= new StringBuilder();
		for (int i = 0; i < size; ++i) {
			sb.append("0");
		}
		return sb.toString()+str;
	}
    
	/**
	 * 카카오 비밀지도
	 * @param n
	 * @param arr1
	 * @param arr2
	 * @return
	*/
	public String[] solution(int n, int[] arr1, int[] arr2) {
		int arrCount	= arr1.length;
		String[] arrStr	= new String[arrCount];
		String[] answer	= new String[arrCount];
        
		for (int i = 0; i < arrCount; ++i) {
			String str		= lpad(Integer.toBinaryString(arr1[i]), n);
			StringBuilder sb	= new StringBuilder();
			for (int j = 0; j < str.length(); ++j) {
				sb.append(str.charAt(j));
			}
			arrStr[i] = sb.toString();
		}
		
		for (int i = 0; i < arrCount; ++i) {
			String str	= lpad(Integer.toBinaryString(arr2[i]), n);
			answer[i]	= sumArr(arrStr[i], str, n);
		}
		return answer;
	}
}


 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.

4 : 평균적인 기업 코딩테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제 .

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

난이도는 생각보다 쉬운 편이었으며 문제를 이해하고 천천히 풀면 충분히 풀 수 있다.

어려운 기술이 들어간 것은 없고, 말 그대로 문제 내용을 하나씩 구현한 것이다.

+ Recent posts