https://school.programmers.co.kr/learn/courses/30/lessons/161989
— 문제 설명
어느 학교에 페인트가 칠해진 길이가 n
미터인 벽이 있습니다. 벽에 동아리 · 학회 홍보나 회사 채용 공고 포스터 등을 게시하기 위해 테이프로 붙였다가 철거할 때 떼는 일이 많고 그 과정에서 페인트가 벗겨지곤 합니다. 페인트가 벗겨진 벽이 보기 흉해져 학교는 벽에 페인트를 덧칠하기로 했습니다.
넓은 벽 전체에 페인트를 새로 칠하는 대신, 구역을 나누어 일부만 페인트를 새로 칠 함으로써 예산을 아끼려 합니다. 이를 위해 벽을 1미터 길이의 구역 n
개로 나누고, 각 구역에 왼쪽부터 순서대로 1번부터 n
번까지 번호를 붙였습니다. 그리고 페인트를 다시 칠해야 할 구역들을 정했습니다.
벽에 페인트를 칠하는 롤러의 길이는 m
미터이고, 롤러로 벽에 페인트를 한 번 칠하는 규칙은 다음과 같습니다.
즉, 롤러의 좌우측 끝을 구역의 경계선 혹은 벽의 좌우측 끝부분에 맞춘 후 롤러를 위아래로 움직이면서 벽을 칠합니다. 현재 페인트를 칠하는 구역들을 완전히 칠한 후 벽에서 롤러를 떼며, 이를 벽을 한 번 칠했다고 정의합니다.
한 구역에 페인트를 여러 번 칠해도 되고 다시 칠해야 할 구역이 아닌 곳에 페인트를 칠해도 되지만 다시 칠하기로 정한 구역은 적어도 한 번 페인트칠을 해야 합니다. 예산을 아끼기 위해 다시 칠할 구역을 정했듯 마찬가지로 롤러로 페인트칠을 하는 횟수를 최소화하려고 합니다.
정수 n
, m
과 다시 페인트를 칠하기로 정한 구역들의 번호가 담긴 정수 배열 section
이 매개변수로 주어질 때 롤러로 페인트칠해야 하는 최소 횟수를 return 하는 solution 함수를 작성해 주세요.
— 제한 조건
m
≤ n
≤ 100,000section
의 길이 ≤ n
section
의 원소 ≤ n
section
의 원소는 페인트를 다시 칠해야 하는 구역의 번호입니다.section
에서 같은 원소가 두 번 이상 나타나지 않습니다.section
의 원소는 오름차순으로 정렬되어 있습니다.— 입출력 예
n | m | section | result |
---|---|---|---|
8 | 4 | [2, 3, 6] | 2 |
5 | 4 | [1, 3] | 1 |
4 | 1 | [1, 2, 3, 4] | 4 |
입출력 예 #1
입출력 예 #2
입출력 예 #3
— 문제 풀이
import java.util.*;
class Solution {
public int solution(int n, int m, int[] section) {
List<Integer> sections = new ArrayList<>();
for(int i=0;i<section.length;i++){
sections.add(section[i]);
}
int answer = 0;
while(!sections.isEmpty()){
answer++;
int cur = sections.get(0);
while(!sections.isEmpty()&§ions.get(0)< cur+m){
sections.remove(0);
}
}
return answer;
}
}
info server
# 결과
# Server
redis_version:3.0.504
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:a4f7a6e86f2d60b3
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:WinSock_IOCP
process_id:4540
run_id:168b92a05b8685b1051beace227cad1c33d43ffe
tcp_port:6379
uptime_in_seconds:349751
uptime_in_days:4
hz:10
lru_clock:11892359
config_file:C:\Program Files\Redis\redis.windows-service.conf
acl list
1) "user default on {password} ~* &* +@all"
acl setuser {username} on|off >{password} {key 권한} {command 권한}
acl cat
1) "keyspace"
2) "read"
3) "write"
4) "set"
5) "sortedset"
6) "list"
7) "hash"
8) "string"
9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting"
acl setuser newuser on >newpass allkeys allcommands -@dangerous
MSA 환경에서 서로의 서비스를 의존하게 되는 의존성 순환이 발생했을 때 어떻게 해결할 수 있을까?
분산 시스템에서의 데이터 일관성을 어떻게 유지할 수 있을까?
레거시 모놀리식 서비스를 MSA로 전환한다고 할 때, 어떠한 이유가 있을까?
기본적으로 Docker가 컨테이너를 실행할 때 사용하는 네트워크
동일한 브릿지 네트워크에 연결된 컨테이너들은 서로 통신할 수 있음
외부 네트워크와는 NAT ( 내부 네트워크의 여러 장치가 하나의 공용 IP 주소를 통해 외부 네트워크와 통신할 수 있도록 IP 주소를 변환하는 기술 ) 를 통해 통신
일반적으로 단일 호스트에서 여러 컨테이너를 연결할 때 사용됨
명시하지 않으면 모두 브릿지 네트워크에서 실행됨
# 예시
docker network create my-bridge-network
docker run -d --name conatiner1 --network my-bridge-network nginx
docker run -d --name conatiner2 --network my-bridge-network nginx
컨테이너가 호스트의 네트워크 스택을 직접 사용
네트워크 격리가 없기 때문에 성능상 이점이 있지만, 보안 및 네트워크 충돌 위험이 있음
일반적으로 성능이 중요한 App에 사용됨
# 예시
docker run -d --network host nginx
Docker의 장단점
VM의 정의와 장단점
spring.application.name=service-a
server.port=8080
service.b.url=http://service-b:8080
spring.application.name=service-b
server.port=8080
@SpringBootApplication
@EnableFeignClients
public class AApplication {
public static void main(String[] args) {
SpringApplication.run(AApplication.class, args);
}
}
@FeignClient(name = "service-b", url = "${service.b.url}")
public interface BServiceClient {
@GetMapping("/hello")
public String getHello();
}
@RestController
@RequiredArgsConstructor
public class AController {
private final BServiceClient bServiceClient;
@GetMapping("/hi")
public String hi() {
String hello = bServiceClient.getHello();
return "Service-a : hi ##### Service-b : " + hello;
}
}
@RestController
public class BController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
FROM openjdk:17-jdk-slim
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# service-a 디렉토리 내에서
./gradlew clean bootJar
docker build -t img-service-a .
# service-b 디렉토리 내에서
./gradlew clean bootJar
docker build -t img-service-b .
docker network create my-network
docker run -d --name service-b --network my-network -p 18080:8080 img-service-b
docker run -d --name service-b --network my-network -p 18081:8080 img-service-b
version: '3.8'
services:
service-a:
image: img-service-a
ports:
- "18080:8080"
environment:
- SERVICE_B_URL=http://service-b:8080
depends_on:
- service-b
service-b:
image: img-service-b
ports:
- "18081:8080"
networks:
default:
driver: bridge