삐까냥의 파도타기

카카오 블라인드 채용 신입 공채 1차 코딩 테스트) 1번 문제 본문

코딩/카카오 코딩 테스트

카카오 블라인드 채용 신입 공채 1차 코딩 테스트) 1번 문제

금손형아 2017. 9. 30. 11:40



문제 출처 : http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/


지난 9월 16일(토) 오후 2시부터 오후 7시까지 5시간동안 진행한 코딩테스트입니다.


보통 코딩 테스트 문제 유출하면 안되는데, 카카오는 문제를 공개하고 직접 문제 해설도 진행했습니다.


시험 당시 제출했던 코드와 해설을 참고하여 수정한 코드를 올리겠습니다.


이것 또한 공부가 되겠죠.




비트 연산을 하면 쉽게 풀수 있었네요.


비트 연산이 무엇인지 알고 있었지만 막상 코딩에서 사용해본적이 없어서


문제 해설처럼 if, else를 사용했습니다.


반성합니다.





- 시험 당시 코드 -


public class kakao1 {


public static void main(String[] args) {

solution(5, new int[]{9, 20, 28, 18, 11}, new int[]{30, 1, 21, 17, 28});

//solution(6, new int[]{46, 33, 33 ,22, 31, 50}, new int[]{27 ,56, 19, 14, 14, 10});

}


public static String[] solution(int n, int[] arr1, int[] arr2) {

String[] answer = new String[n];

 

for (int i= 0; i<n; i++) {

int temp1 = arr1[i];

int temp2 = arr2[i];

char[] result = new char[n];

for (int j=n-1; j>=0; j--) {

if (temp1 % 2 == 0) {

result[j] = ' ';

} else {

result[j] = '#';

}

temp1 /= 2;

if (temp2 % 2 != 0) {

result[j] = '#';

}

temp2 /= 2;

}

answer[i] = String.valueOf(result);

System.out.println(result);

}

    return answer;

  }

}

- 수정 코드 -


public class kakao1 {


public static void main(String[] args) {

solution(5, new int[]{9, 20, 28, 18, 11}, new int[]{30, 1, 21, 17, 28});

//solution(6, new int[]{46, 33, 33 ,22, 31, 50}, new int[]{27 ,56, 19, 14, 14, 10});

}


public static String[] solution(int n, int[] arr1, int[] arr2) {

String[] answer = new String[n];

 

for (int i= 0; i<n; i++) {

char[] result = new char[n];

int orResult = arr1[i] | arr2[i]; //비트 연산 사용

for (int j=n-1; j>=0; j--) { //비트 하나씩 계산

boolean isRoad = orResult % 2 == 0 ? true : false; //가독성을 위한 boolean 삼항 연산자

char tempChar = '#'; //상대적으로 많이 나오는 값을 default

if (isRoad) { //길일 경우 공백 처리

tempChar = ' ';

}

result[j] = tempChar;

orResult /= 2;

}

answer[i] = String.valueOf(result); //시험 조건에 따른 return 값 세팅(지금은 필요 없음)

System.out.println(result);

}

    return answer;

}

}





수정 코드에서


비트 연산자를 통해서 if, else를 없앨수 있었습니다.


그리고 가독성을 높이기 위해서 boolean isRoad와 삼항 연산자를 사용했고,


코드 중복을 없애기 위해서 tempChar를 추가했습니다.


soultion이 return 값을 가지고 있는 이유는 당시 문제 조건이기 때문에 가지고 있으며


이 글을 읽는 분들을 위해 해당 결과가 나올 수 있도록 System.out.println(resultWall);를 추가했습니다.




 2018년 1월 26일


public class kakao1 {

public static void main(String[] args) {

solution(5, new int[]{9, 20, 28, 18, 11}, new int[]{30, 1, 21, 17, 28});

System.out.println("");

solution(6, new int[]{46, 33, 33 ,22, 31, 50}, new int[]{27 ,56, 19, 14, 14, 10});

}


static void solution(int n, int[] arr1, int[] arr2) {

String[] result = new String[n];

for (int i = 0; i < n; i++) {

result[i] = getResult(n, arr1[i] | arr2[i]);

System.out.println(result[i]);

}

}


static String getResult(int n, int orResult) {

StringBuffer result = new StringBuffer();

int temp = (int) Math.pow(2, n-1);

while (temp > 0) {

if (orResult >= temp) {

orResult -= temp;

result.append("#");

} else {

result.append(" ");

}

temp /= 2;

}

return result.toString();

}

}




좀 더 좋은 코드 및 다듬을 부분을 알려주시면 감사히 학습하겠습니다.