https://www.acmicpc.net/problem/17822
ํ์ด๊ณผ์
1. ์ํ์ ํ์ ์ํค๋ ํจ์๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
ArrayList ํน์ LinkedList๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ ์ ์์ต๋๋ค.
add, insert ,remove ํจ์๋ฅผ ํ์ฉํ์ฌ ์ํ์ ํ์ ์ ๊ตฌํํ ์ ์์ต๋๋ค.
2. ์ํ์์ ์ธ์ ํ ์ซ์๋ค ๋ผ๋ฆฌ ์ผ์น์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
dfs๋ฅผ ํตํด ์ธ์ ์ฌ๋ถ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ธ์ ํ๊ฒ ๋๋ฉด -1๋ก ์์๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฒดํฌํ์ต๋๋ค.
์ด๋ ๊ฐ์ ์ํ ๋ด์์์ ์ํ(?)๋ฅผ ๊ตฌํํด์ค์ผ ํฉ๋๋ค.
์๋ฅผ๋ค์ด [2,3,4,2] ์ ๊ฐ์ ์ํ์ธ ๊ฒฝ์ฐ ์ ์ผ ์ ์์ 2์ ์ ์ผ ๋ค ์์ 2๋ ์ธ์ ํด ์์ต๋๋ค. ๋ฐ๋ผ์ dfs์ํ ์ค ์ธ๋ฑ์ค๊ฐ -1์ด ๋๋ฉด 3์ผ๋ก, 4๊ฐ ๋๋ฉด 0์ผ๋ก ๋ณด์ ์ ํด์ค์ผ ํฉ๋๋ค.
static boolean check(int r, int c, int val){
int flag = 0; // ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํ ๋ณ์
for(int d=0;d<4;d++){
int nr = r + dr[d];
int nc = c + dc[d];
// ๊ฐ์ ์ํ๋ด ์ํ๋ฅผ ๊ตฌํ
if(nc==-1) nc = M-1;
if(nc==M) nc = 0;
if(nr>=1 && nr<=N && circle[nr].get(nc)==val){
circle[nr].set(nc,-1); // -1๋ก ํ์
check(nr,nc,val); // dfs ์ํ
flag = 1;
}
}
if(flag==1) return true; // ์ผ์น ๋ ์์๊ฐ ์๋ ๊ฒฝ์ฐ true ๋ฆฌํด
return false;
}
๋ํ dfs๋ฅผ ์์ํ ์์น์๋ -1๋ก ํ์๋ฅผ ํด์ฃผ๊ธฐ ์ํด ์ผ์น ์ฌ๋ถ์ ๋ฐ๋ฅธ true์ false๋ฅผ ๋ฆฌํดํ๋๋ก ๊ตฌํํ์ต๋๋ค.
// 2. ์ง์ธ ์ซ์ ์ฒดํฌ
int flag = 0;
for(int i=1;i<N+1;i++){
for(int j=0;j<M;j++){
if(circle[i].get(j)==-1) continue;
if(check(i,j,circle[i].get(j))){
circle[i].set(j,-1); // ํ์ฌ ์์น๋ ์ง์ฐ๊ธฐ
flag = 1;
}
}
}
true ์ฆ ์ผ์นํ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฉด ํ์ฌ์์น (i,j)๋ -1๋ก ํ์๋ฅผ ํด์คฌ์ต๋๋ค.
3. ์ ์ฒด ์ํ์ ๊ฐฑ์ ์ฌ๋ถ์ ๋ฐ๋ฅธ ์ ๋ฐ์ดํธ๋ฅผ ์งํํด์ผ ํฉ๋๋ค.
// 2. ์ง์ธ ์ซ์ ์ฒดํฌ
int flag = 0;
for(int i=1;i<N+1;i++){
for(int j=0;j<M;j++){
if(circle[i].get(j)==-1) continue;
if(check(i,j,circle[i].get(j))){
circle[i].set(j,-1); // ํ์ฌ ์์น๋ ์ง์ฐ๊ธฐ
flag = 1;
}
}
}
// 3. ์ง์์ง ์ซ์ ์ฌ๋ถ์ ๋ฐ๋ผ ์ํ ์
๋ฐ์ดํธ
if(flag==0){
update();
}
2๋ฒ ์ฝ๋์ ์ด์ด์ง๋ ์ฝ๋ ์ ๋๋ค.
์ง์์ง ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฉด update๋ฅผ ์งํํด์ค๋๋ค. ์ด๋ ํ๊ท ๊ฐ ๊ณ์ฐ์ double ๋ณ์๋ฅผ ์ฌ์ฉํด์ค์ผ ํฉ๋๋ค.
static void update(){
double avg = 0;
int sum = 0;
int cnt = 0;
for(int i=1;i<N+1;i++){
for(int j=0;j<M;j++){
if(circle[i].get(j)==-1) continue;
sum += circle[i].get(j);
cnt += 1;
}
}
avg = (double)sum / cnt;
for(int i=1;i<N+1;i++){
for(int j=0;j<M;j++){
int val = circle[i].get(j);
if(val==-1) continue;
if(val < avg){
circle[i].set(j,val+1);
}else if(val > avg){
circle[i].set(j,val-1);
}
}
}
}
ํ๊ท ๊ณ์ฐ ํ ์ ๋ฐ์ดํธ ํ๋ ํจ์
์๊ฒ๋ ์
- ArrayList์ LinkedList
- ์กฐํ(get)์์๋ ArrayList๊ฐ ์ฑ๋ฅ์ด ์ข๊ณ , ์ฝ์ /์ญ์ (add/remove) ์์๋ LinkedList๊ฐ ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
์ฐ์ฐ | LinkedList | ArrayList |
์ฒซ๋ฒ์งธ ์์น์ insert / remove | O(1) | O(N) |
๋ง์ง๋ง ์์น์ insert / remove | O(1) | O(1) ํน์ O(N) |
์ธ๋ฑ์ค๋ก ๊ฐ get | O(N) | O(1) |
- ArrayList์ ์ฒซ๋ฒ์งธ ์ฝ์ ์ด O(N) ์ธ ์ด์ ๋ ์์๋ค์ ๋ค๋ก ์ด๋์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๋ํ ArrayList์ ๋ง์ง๋ง ์์น ์ฝ์ ์ด O(1) ํน์ O(N)์ธ ์ด์ ๋ ๋ง์ฝ ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ๋ฐฐ์ด ๋ณต์ฌ๋ก ์ธํ ์๊ฐ ์์๋๋ฌธ ์ ๋๋ค.
- ๊ทธ๋ฐ๋ฐ,, ์ค์ ๋ก LinkedList๋ ์ ์ฌ์ฉ๋์ง ์๋๋ค๊ณ ํฉ๋๋ค. ์ฑ๋ฅ๋ฉด์์ ์ฒด๊ฐ์ ๋์ด ํฐ ์ฐจ์ด๊ฐ ์๋ค๊ณ ํฉ๋๋ค
- ์ฒ์ Deque๋ฅผ ์ฌ์ฉํด์ ์ํ ํ์ ์ ๊ตฌํํ๋ ค ํ๋๋ฐ, Deque์๋ get ๋ฉ์๋๊ฐ ์์ด์ ๊ตฌํ์ ์คํจํ์ต๋๋ค. ๊ทธ๋์ ๊ณ์ ๋ค๋ฅธ ์ ๊ทผ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ด๋๊ฐ๋๋ฐ,, ArrayList์ insert, remove ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ ์๊ฒ๋์์ต๋๋ค.
์ ์ฒด์ฝ๋
package com.mincheolsong;
import java.util.*;
import java.io.*;
public class Main {
static int N,M,T;
static List<Integer>[] circle;
static int[] dr = {-1,0,1,0};
static int[] dc = {0,1,0,-1};
static void rotate(int X, int D, int K){
if(D==0){ // ์๊ณ ๋ฐฉํฅ์ด๋ฉด, ์ ์ผ ๋ค์ ์์๋ฅผ ์ ์ผ ์์ผ๋ก
int x = X;
while(x < N+1){
for(int k=0;k<K;k++){
int back_e = circle[x].remove(circle[x].size()-1);
circle[x].add(0,back_e);
}
x += X;
}
}else if(D==1){ // ๋ฐ์๊ณ ๋ฐฉํฅ์ด๋ฉด, ์ ์ผ ์์ ์์๋ฅผ ์ ์ผ ๋ค๋ก
int x = X;
while(x < N+1){
for(int k=0;k<K;k++){
int front_e = circle[x].remove(0);
circle[x].add(front_e);
}
x += X;
}
}
}
static boolean check(int r, int c, int val){
int flag = 0;
for(int d=0;d<4;d++){
int nr = r + dr[d];
int nc = c + dc[d];
if(nc==-1) nc = M-1;
if(nc==M) nc = 0;
if(nr>=1 && nr<=N && circle[nr].get(nc)==val){
circle[nr].set(nc,-1);
check(nr,nc,val);
flag = 1;
}
}
if(flag==1) return true;
return false;
}
static void update(){
double avg = 0;
int sum = 0;
int cnt = 0;
for(int i=1;i<N+1;i++){
for(int j=0;j<M;j++){
if(circle[i].get(j)==-1) continue;
sum += circle[i].get(j);
cnt += 1;
}
}
avg = (double)sum / cnt;
for(int i=1;i<N+1;i++){
for(int j=0;j<M;j++){
int val = circle[i].get(j);
if(val==-1) continue;
if(val < avg){
circle[i].set(j,val+1);
}else if(val > avg){
circle[i].set(j,val-1);
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
T = Integer.parseInt(st.nextToken());
circle = new List[N+1];
for(int i=1;i<N+1;i++){
circle[i] = new LinkedList<>();
}
for(int n=1;n<=N;n++){
st = new StringTokenizer(br.readLine());
for(int m=0;m<M;m++){
circle[n].add(Integer.parseInt(st.nextToken()));
}
}
for(int t=0;t<T;t++) {
st = new StringTokenizer(br.readLine());
int X, D, K;
X = Integer.parseInt(st.nextToken()); // ์ํ ๋ฒํธ(x์ ๋ฐฐ์)
D = Integer.parseInt(st.nextToken()); // 0 : ์๊ณ, 1 : ๋ฐ์๊ณ
K = Integer.parseInt(st.nextToken()); // k์นธ
// 1. ํ์
rotate(X,D,K);
// 2. ์ง์ธ ์ซ์ ์ฒดํฌ
int flag = 0;
for(int i=1;i<N+1;i++){
for(int j=0;j<M;j++){
if(circle[i].get(j)==-1) continue;
if(check(i,j,circle[i].get(j))){
circle[i].set(j,-1); // ํ์ฌ ์์น๋ ์ง์ฐ๊ธฐ
flag = 1;
}
}
}
// 3. ์ซ์๊ฐ ์ง์์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์ํ ์
๋ฐ์ดํธ
if(flag==0){
update();
}
}
int ans = 0;
for(int i=1;i<=N;i++){
for(int j=0;j<M;j++){
int val = circle[i].get(j);
if(val==-1) continue;
ans += val;
}
}
System.out.println(ans);
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ค์ ๊ธฐ์ฌ ๋๊ฒฐ(์ผ์ฑ sw์ญ๋ํ ์คํธ) (0) | 2024.04.12 |
---|---|
๋ฃจ๋ํ์ ๋ฐ๋(์ผ์ฑ sw์ญ๋ํ ์คํธ) (0) | 2024.04.10 |
[๋ฐฑ์ค] ์ฐ๊ตฌ์ 3 (์กฐํฉ, bfs) (0) | 2024.04.07 |
๋ฐฐ์ด ์๊ณ๋ฐฉํฅ ํ์ ๊ณต์ (1) | 2024.04.06 |
ํฌํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ (0) | 2024.04.05 |