어떤 코드를 써야만 줄을 바꿀 수 있습니까?
좋은 성적을 거두었지만 분산된 제시가격만 받았다
어느 대답이든 일정한 범위 내의 코드에 수렴되기 때문에 구분할 수 없다(홍보기능)
이 의견에 관해서도 동의할 만한 점이 있지만, 나 자신은
전업 서비스에서 돈을 함부로 쓰지 않는 오퍼를 몇 개 받았다
같은 알고리즘을 사용한 대답이라도 응답자에 따라 코드의 예쁨/더러움이 명확하게 분리된다
그렇다면 어떤 코드를 써야 기술을 보여주고 견적을 받을 수 있을까?이 글에서는 Paiza에서 실제 출제된 문제를 예로 들어 평가/평가되지 않은 코드에 대해 설명한다.
추정 독자
전업에 관심이 있는 사람
이직할 때 주의해야 할 일을 알고 싶은 사람.
예제
이 글에서 다음은 예제다.
프로펠러 특유의 알고리즘(동적 계획법 등)을 몰라도 대답할 수 있다
그렇긴 한데, Paiza 주최연수입 보증 스카우트의 참가 조건(B등급 이상)을 충족하는 난이도입니다.
코드 공개 허용
Paiza의 질문과 답변은 기본적으로 공개가 허용되지 않기 때문에 다른 질문에 대한 답변을 공개할 때 공개 여부를 확인해야 한다
응답 예
다음 3개 모두 B등급(Paiza가 준비한 테스트 코드를 모두 통과)을 받을 수 있는 코드다.그렇다면 채용 측이라면 어떤 대답을 쓴 엔지니어에게 탐정을 보내고 싶으세요?
대답 예1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
final int n = scanner.nextInt();
final int m = scanner.nextInt();
boolean[] seats = new boolean[n];
for (int i = 0; i < m; i++) {
final int a = scanner.nextInt();
final int b = scanner.nextInt();
boolean canSit = true;
for (int j = 0; j < a; j++) {
final int p = (b + j) % n;
if (seats[p]) {
canSit = false;
break;
}
}
if (canSit) {
for (int j = 0; j < a; j++) {
final int p = (b + j) % n;
seats[p] = true;
}
}
}
int ans = 0;
for (boolean seat : seats) {
if (seat) {
ans += 1;
}
}
System.out.println(ans);
}
}
}
응답 예 2 import java.util.Scanner;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
final int n = scanner.nextInt();
final int m = scanner.nextInt();
final int[] a = new int[m];
final int[] b = new int[m];
for (int i = 0; i < m; i++) {
a[i] = scanner.nextInt();
b[i] = scanner.nextInt();
}
System.out.println(solve(n, m, a, b));
}
}
public static int solve(int n, int m, int[] a, int[] b) {
boolean[] seats = new boolean[n];
for (int i = 0; i < m; i++) {
final int numbers = a[i];
final int from = b[i];
final boolean canSit = IntStream.range(0, numbers).noneMatch(p -> seats[(from + p) % n]);
if (canSit) {
for (int j = 0; j < numbers; j++) {
seats[(from + j) % n] = true;
}
}
}
return (int) IntStream.range(0, seats.length)
.mapToObj(i -> seats[i])
.filter(seat -> seat)
.count();
}
}
응답 예 3 import java.math.BigInteger;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
final int n = scanner.nextInt();
final int m = scanner.nextInt();
final List<Group> groups = Stream.generate(() ->
new Group(scanner.nextInt(), scanner.nextInt())
).limit(m).collect(Collectors.toList());
System.out.println(solve(n, groups));
}
}
public static int solve(int n, List<Group> groups) {
Seats seats = new Seats();
for (Group group : groups) {
Seats copy = seats.clone();
for (int i = 0; i < group.numbers; i++) {
final int p = (group.from + i) % n;
if (seats.isOccupied(p)) {
seats = copy;
break;
} else {
seats.occupy(p);
}
}
}
return seats.count();
}
private static class Group {
public final int numbers;
public final int from;
public Group(int numbers, int from) {
this.numbers = numbers;
this.from = from;
}
}
private static class Seats implements Cloneable {
private BigInteger value = BigInteger.ZERO;
public void occupy(int pos) {
value = value.or(BigInteger.ONE.shiftLeft(pos));
}
public boolean isOccupied(int pos) {
return value.and(BigInteger.ONE.shiftLeft(pos)).testBit(pos);
}
public int count() {
return value.bitCount();
}
@Override
public Seats clone() {
try {
return (Seats) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
}
총평가
대답 예1 함수 디자인 기술과 Java 언어 기능이 낮은 인상을 준다
Main#main
에서 모든 처리를 실시했기 때문에 함수의 작업 분할을 할 수 없습니다(표준 입력의 읽기 처리와 내보내기 처리의 분할), 단일 테스트는 쓰기 어렵습니다그 결과 응답자들은 함수 설계 기술이 낮은 사람, 단일 테스트 경험이 적은 사람, 자바 기술이 낮은 사람, 혹은 최근 자바의 언어 기능을 모르는 사람(열심히 공부하지 않는 사람)이 인상적이었다.
이렇게 되면 당연히 희망적인 오퍼를 받을 수 없다
한편, 응답례 2는 응답례 1에서 지적한 버전을 수정하여 응답례 1에서 부정적인 인상을 줄 위험을 줄였다
하지만 데이터 구조 디자인과 관련된 기능이 조금 낮다는 인상을 받았다.
Main#solve
에 전달된 매개 변수a
와 b
는 쌍으로 사용되기 때문에 독립형을 준비하여 총결산하고 싶다응답례 3 대상을 대상으로 하는 방식을 채택하여 이전에 보여준 두 가지 예와 완전히 다르다
Main#solve
의 가독성이 다른 대답 예시총결산
응답례 1-3에서 보듯이 프로콘과 같은 디자인, 실시 기능을 구분하기 어려운 문제라도 응답자의 기능에 따라 기술을 보여줄 수 있다.만약 행 코드를 통해 예상한 결과를 얻지 못했다면
자신의 디자인/실장 기술을 다시 연마하다
좋은 성적을 거두는 것보다 예쁜 코드를 써야 한다는 것을 깨달았다
이 기사는 코드를 바꾸고 싶은데 아무리 해도 좋은 견적을 얻지 못하거나 무엇을 주의해야 할지 모르는 사람들의 참고가 될 수 있다면 좋겠습니다.
Reference
이 문제에 관하여(어떤 코드를 써야만 줄을 바꿀 수 있습니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/n_ono/articles/b09aee51817ccf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)