내일 진행되는 카카오 블라인드 테스트의 데모 테스트를 풀면서 드는 생각을 기록삼아 정리해 보았습니다.
카카오 블라인드 테스트는 Programmers라는 플랫폼에서 진행되는데 시험 전 테스트 환경을 경험해 볼 수 있게 간단한 데모 테스트를 제공해 줍니다. 별 찍기와 같은 기초적인 문제이지만 괜히 이런 문제도 잘 풀어야 될 것 같은 마음에 조금 고민하면서 풀어보았습니다. 혹시 더 좋은 방법을 알고 계신다면 댓글로 한 수 부탁드립니다!
직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하려고 합니다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때, 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성해주세요. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다.
v | result |
---|---|
{{1, 4}, {3, 4}, {3, 10}} | {1, 10} |
{{1, 1}, {2, 2}, {1, 2}} | {2, 1} |
class Solution {
public int[] solution(int[][] v) {
int missingX = v[0][0] ^ v[1][0] ^ v[2][0];
int missingY = v[0][1] ^ v[1][1] ^ v[2][1];
int[] answer = new int[]{missingX, missingY};
return answer;
}
}
작년에 처음 이 데모 테스트를 접했을 때 덧셈과 뺄셈으로 풀어보려고 했던 기억이 납니다. 그럴 필요 없이 XOR을 통해 짝이 맞지 않는 값을 찾을 수 있었습니다. 결과 배열을 생성하는데 더 빠른 방법이 있지 않을까 고민이 됩니다.
이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.
> 5 3
*****
*****
*****
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < a; i++) {
builder.append("*");
}
String stars = builder.toString();
for (int i = 0; i < b; i++) {
System.out.println(stars);
}
}
}
한 행을 만드는 과정에서 Scanner를 통해 출력을 추가하는 것 보다 StringBuilder로 행을 완성하는게 더 빠를 것 같아 사용해 보았습니다. 실행 시간의 경우 150ms~170ms 정도 걸렸고 일반적인 이중 for문의 경우 150ms 부터 320ms 까지 걸리는 테스트도 있는 걸로 보아 행과 열이 커질수록 차이가 많이 날 듯 합니다. StringBuilder 대신 Stream을 써보기도 했는데 결과는 StringBuilder와 비슷했습니다.
String stars = Stream.generate(() -> "*").limit(a).collect(Collectors.joining());